【问题标题】:Error to set itemclicklistener in Recyclerview在 Recyclerview 中设置 itemclicklistener 时出错
【发布时间】:2019-11-28 05:30:33
【问题描述】:

我是stackoverflow的新手,如果我做错了什么或违反了任何规则和规定,请原谅我。但我希望有人可以帮助我解决这个问题。我遇到了这个问题,我在 recyclerview 中执行 itemclicklistener 时出错。这是代码

我的适配器

package com.fyp.eventlocater;

import android.content.Context;
import android.view.ContextMenu;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ImageView;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import com.google.firebase.database.DataSnapshot;

import java.util.ArrayList;

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {

    Context context;
    ArrayList<Event> events;
    private RecyclerViewClickItemInterface recyclerViewClickItemInterface;

    public MyAdapter( Context c, ArrayList<Event> e, RecyclerViewClickItemInterface recyclerViewClickItemInterface)
    {
        context = c;
        events = e;
        this.recyclerViewClickItemInterface = recyclerViewClickItemInterface;
    }

    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        return new MyViewHolder(LayoutInflater.from(context).inflate(R.layout.card_view, parent, false));

//        View v = LayoutInflater.from(context).inflate(R.layout.card_view, parent, false);
//        MyViewHolder mvh = new MyViewHolder(v, (OnItemClickListener) mListener);
//        return mvh;
    }

    @Override
    public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {

        holder.eventTitle.setText(events.get(position).getEventTitle());
        holder.eventTime.setText(events.get(position).getEventTime());
        holder.eventDesc.setText(events.get(position).getEventDesc());
        holder.eventLocation.setText(events.get(position).getEventLocation());


    }

    @Override
    public int getItemCount() {
        return events.size();
    }

    class MyViewHolder extends RecyclerView.ViewHolder
    {
        TextView eventTitle, eventTime, eventDesc, eventLocation;
        public MyViewHolder(View itemView) {
            super(itemView);

            eventTitle = itemView.findViewById(R.id.eventTitle);
            eventTime = itemView.findViewById(R.id.eventTime);
            eventDesc = itemView.findViewById(R.id.eventDesc);
            eventLocation = itemView.findViewById(R.id.eventLocation);

            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    recyclerViewClickItemInterface.onItemClick(getAdapterPosition());
                }
            });

        }
    }
}

这是我的界面

package com.fyp.eventlocater;

public interface RecyclerViewClickItemInterface {
    void onItemClick(int position);
}

这是我的活动

package com.fyp.eventlocater;

import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.view.MenuItem;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TabHost;
import android.widget.Toast;

import com.google.firebase.database.ChildEventListener;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;

import java.lang.reflect.Array;
import java.util.ArrayList;

public class CominSoonActivity extends AppCompatActivity implements RecyclerViewClickItemInterface {

    DatabaseReference reference;
    RecyclerView recyclerView;
    ArrayList<Event> list;
    MyAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_comin_soon);

        recyclerView = findViewById(R.id.myRecycler);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        list = new ArrayList<Event>();

        reference = FirebaseDatabase.getInstance().getReference().child("EventDisplay");
        reference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                for (DataSnapshot dataSnapshot1: dataSnapshot.getChildren())
                {
                    Event e = dataSnapshot1.getValue(Event.class);
                    list.add(e);
                }
                adapter = new MyAdapter(CominSoonActivity.this, list, this);
                recyclerView.setAdapter(adapter);

            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
                Toast.makeText(CominSoonActivity.this, "Opps.... Something went wrong", Toast.LENGTH_SHORT).show();

            }
        });

        //add back button
        if (getSupportActionBar() != null) {
            getSupportActionBar().setDisplayHomeAsUpEnabled(true);
            getSupportActionBar().setDisplayShowHomeEnabled(true);
        }
    }


    //taking the user back to the previous activity
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if(item.getItemId() == android.R.id.home) {

            Intent homeActivity = new Intent(getApplicationContext(), HomeActivity.class);
            startActivity(homeActivity);
            finish();
        }
        return super.onOptionsItemSelected(item);
    }

    @Override
    public void onItemClick(int position) {
        Uri uri = Uri.parse("http://wwww.google.com");
        Intent intent = new Intent(Intent.ACTION_VIEW, uri);
        startActivity(intent);

    }
}

这是我的错误输出 I'm a student and new to android studio. I don't know what this means

这是另一个错误。我希望它有所帮助。 It says this

【问题讨论】:

  • 欢迎堆栈溢出 :) 在发布错误或与您的问题相关的任何内容时,请将其包含在您的问题中。如果是代码/错误,最好将其作为文本包含在内,将其链接到异地资源是个坏主意

标签: java android firebase android-recyclerview


【解决方案1】:

因此,每次数据更改时,您似乎都在初始化一个新适配器。您可以将其更改为:

public class CominSoonActivity extends AppCompatActivity implements RecyclerViewClickItemInterface {

    DatabaseReference reference;
    RecyclerView recyclerView;
    ArrayList<Event> list;
    MyAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_comin_soon);

        recyclerView = findViewById(R.id.myRecycler);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        list = new ArrayList<Event>();
        adapter = new MyAdapter(CominSoonActivity.this, list, this);
        recyclerView.setAdapter(adapter);

        reference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                for (DataSnapshot dataSnapshot1: dataSnapshot.getChildren())
                {
                    Event e = dataSnapshot1.getValue(Event.class);
                    list.add(e); // This will add it to the adapter 
                    adapter.notifyDataSetChanged();
                }


            }

// the rest of the class

这样,当您在适配器中引用this 时,您会得到CominSoonActivity 而不是ValueEventListener

【讨论】:

  • 非常感谢!这很有帮助。
【解决方案2】:

在您的活动类中创建如下所示的适配器实例:

adapter = new MyAdapter(CominSoonActivity.this, list, CominSoonActivity.this);

您的活动类如下所示:

包 com.fyp.eventlocater;

import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.view.MenuItem;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TabHost;
import android.widget.Toast;

import com.google.firebase.database.ChildEventListener;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;

import java.lang.reflect.Array;
import java.util.ArrayList;

public class CominSoonActivity extends AppCompatActivity implements                    RecyclerViewClickItemInterface {

    DatabaseReference reference;
    RecyclerView recyclerView;
    ArrayList<Event> list;
    MyAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_comin_soon);

        recyclerView = findViewById(R.id.myRecycler);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        list = new ArrayList<Event>();

        reference = FirebaseDatabase.getInstance().getReference().child("EventDisplay");
        reference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                for (DataSnapshot dataSnapshot1: dataSnapshot.getChildren())
                {
                    Event e = dataSnapshot1.getValue(Event.class);
                    list.add(e);
                }
                adapter = new MyAdapter(CominSoonActivity.this, list, CominSoonActivity.this);
                recyclerView.setAdapter(adapter);

            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
                Toast.makeText(CominSoonActivity.this, "Opps.... Something went wrong", Toast.LENGTH_SHORT).show();

            }
        });

        //add back button
        if (getSupportActionBar() != null) {
            getSupportActionBar().setDisplayHomeAsUpEnabled(true);
            getSupportActionBar().setDisplayShowHomeEnabled(true);
        }
    }


    //taking the user back to the previous activity
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if(item.getItemId() == android.R.id.home) {

            Intent homeActivity = new Intent(getApplicationContext(), HomeActivity.class);
            startActivity(homeActivity);
            finish();
        }
        return super.onOptionsItemSelected(item);
    }

    @Override
    public void onItemClick(int position) {
        Uri uri = Uri.parse("http://wwww.google.com");
        Intent intent = new Intent(Intent.ACTION_VIEW, uri);
        startActivity(intent);

    }
}

【讨论】:

    猜你喜欢
    • 2020-12-31
    • 1970-01-01
    • 2015-06-08
    • 2021-05-23
    • 2023-01-30
    • 2016-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多