简体   繁体   中英

Cannot resolve method setOnItemClickListener for RecyclerView

I am working with a RecyclerView and I am trying to set OnClick's and OnLongClick's for each of the item's in the RecyclerView. I apologize but I don't think I truly understand what is going on with the code, some of it was taken off slides for my assignment and some patches for stuff that wouldn't work that I found on this site. At the top of my RecyclerView Adapter class I hav static OnItemClickListener mItemClickListener;` And then I have an interface for my new methods, a method to set my clicklistener, and then my ViewHolder implementation like so:

public interface OnItemClickListener {
        void onItemClick(View view, int position);
        void onItemLongClick(View view, int position);
    }

    public void setOnItemClickListener(final OnItemClickListener mItemClickListener) {
        this.mItemClickListener = mItemClickListener;
    }

    public static class ViewHolder extends RecyclerView.ViewHolder {
        public ImageView movieImage;
        public TextView movieName;
        public TextView movieDescription;
        public CheckBox movieCheckBox;
        public CardView cV;

        public ViewHolder(View view) {
            super(view);

            movieImage = (ImageView) view.findViewById(R.id.movieImg);
            movieName = (TextView) view.findViewById(R.id.movieName);
            movieDescription = (TextView) view.findViewById(R.id.movieDescription);
            movieCheckBox = (CheckBox) view.findViewById(R.id.movieCheckBox);

            view.setOnClickListener(new View.OnClickListener(){
               @Override
                public void onClick(View v) {
                   if (mItemClickListener != null) {
                       if (getAdapterPosition() != RecyclerView.NO_POSITION) {
                           mItemClickListener.onItemClick(v, getAdapterPosition());
                       }
                   }
               }
            });

            view.setOnLongClickListener(new View.OnLongClickListener() {
               @Override
                public boolean onLongClick(View v) {
                   if (mItemClickListener != null) {
                       if (getAdapterPosition() != RecyclerView.NO_POSITION) {
                           mItemClickListener.onItemLongClick(v, getAdapterPosition());
                       }
                   }
                   return true;
               }
            });
        }
    }

My issue comes in the class for my fragment which owns the recycler view, where I am trying to set the onitemclicklistener.

myAdapter = new MyRecyclerAdapter();

        myAdapter.setOnItemClickListener(new MyRecyclerAdapter.OnItemClickListener() {
            @Override
            public void onItemClick(View view, int position) {
                Log.d("TEST", "onItemClick");
            }

            @Override
            public void onItemLongClick(View view, int position) {
                Log.d("TEST", "onItemLongClick");
            }
        });

It says the issue is with myAdapter.setOnItemClickListener it says

'Cannot resolve method 'setOnItemClickListener(anonymous com.example.kevin.assignment4.MyRecyclerAdapter.OnItemClickListener)'
But I don't know why it's saying that. It should be able to find the method just fine as far as I can tell.

EDIT: My imports for MyRecyclerView class are as follows:

import android.support.v7.widget.CardView;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.TextView;

import java.util.HashMap;

I tried same thing and its working cool. check this.

public class MyFragment extends BaseFragment implements SwipeRefreshLayout.OnRefreshListener{

    private MyAdapter mAdapter;


    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        setHasOptionsMenu(true);
        //init views
        final View root = inflater.inflate(R.layout.layout, container, false);
        RecyclerView rv = (RecyclerView) root.findViewById(R.id.recyclerview);

        mAdapter = new MyAdapter(getActivity(), data);
        mAdapter.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(View view, int position) {
                Toast.makeText(getActivity(), "Working...", Toast.LENGTH_LONG).show();
            }
        });
        rv.setAdapter(mAdapter);
        rv.addItemDecoration(new DividerItemDecoration(getActivity(), DividerItemDecoration.VERTICAL));

        return root;
    }

    public interface OnItemClickListener{
        void onItemClick(View view, int position);
    }

    private class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

        private ArrayList<Data> data;
        private Context mContext;

        MyAdapter(Context context, ArrayList<Data> data) {
            this.data = data;
        }

        private OnItemClickListener onItemClickListener;

        public void setOnItemClickListener(OnItemClickListener onItemClickListener){
            this.onItemClickListener = onItemClickListener;
        }

        class MyHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

            MyHolder(View itemView) {
                super(itemView);

                itemView.setOnClickListener(this);
            }

            @Override
            public void onClick(View v) {
                if(onItemClickListener != null){
                    onItemClickListener.onItemClick(v, getAdapterPosition());
                }
            }
        }
    }
}

I'm way too late but this might help someone; I've just had the same ' cannot resolve symbol ' issue while trying to use the Adapter's custom methods from an activity (in order to set up click listeners for RecyclerView in Java, using Android Studio 3.3.2).

Confusingly, despite this, at the same time, for my adapter instance the base class RecyclerView.Adapter's own methods (such as getItemCount and onBindViewHolder ) were resolvable.

My problem was that I had similar to Kevin's code, where Kevin in his fragment has:

myAdapter = new MyRecyclerAdapter();

whereas what solved my problem was that I had neglected to simply specify a type when instantiating the Adapter - eg:

MyRecyclerAdapter myAdapter = new MyRecyclerAdapter();

... ' cannot resolve symbol ' then became a thing of the past and I was able to access my custom Adapter methods such as setOnItemClickedListener .

So I'm not sure why my original method didn't work, since I've seen similar methods online and even one of the answers posted here worked the same way. I solved my issue by changing the structure of my adapter class so that it takes the listener in as a parameter to the constructor of the RecyclerView adapter. There, I set the listener in the class equal to the listener that came in.

public MyRecyclerAdapter(ClickListener clickListener) {
        setClickListener(clickListener);
    }

And then in my fragment where I create the recyclerview I have

myAdapter = new MyRecyclerAdapter(this);

My fragment class implements the interface from my adapter class.

Accidentally declaring your adapter as RecyclerView.Adapter instead of your custom adapter MyRecyclerAdapter() is a possible cause.

RecyclerView.Adapter adapter = new MyRecyclerAdapter()

Instead of,

MyRecyclerAdapter adapter = new MyRecyclerAdapter()

I had the similar problem.. This code solved my problem.Its too late for answering, but this code works like magic.This is my java class.

 package app.android.dgconnect.activity; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.DefaultItemAnimator; import android.support.v7.widget.DividerItemDecoration; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.View; import android.widget.AdapterView; import android.widget.ImageView; import android.widget.TextView; import java.util.ArrayList; import java.util.List; import app.android.dgconnect.R; import app.android.dgconnect.adapters.AddressBookAdapter; import app.android.dgconnect.models.CustomersProfileModel; public class AddressBookMain extends AppCompatActivity implements AdapterView.OnItemClickListener { private List<CustomersProfileModel> itemList = new ArrayList<>(); private AddressBookAdapter mAdapter; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.address_book_layout); CustomersProfileModel customersProfileModel=getIntent().getParcelableExtra("customerProfileModel"); TextView title = findViewById(R.id.title); ImageView toolbar_back = findViewById(R.id.toolbar_back); title.setText("Address"); toolbar_back.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { finish(); } }); RecyclerView recyclerView = findViewById(R.id.recycler_view); mAdapter = new AddressBookAdapter(itemList,this); RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getApplicationContext()); recyclerView.addItemDecoration(new DividerItemDecoration(getApplicationContext(), LinearLayoutManager.HORIZONTAL)); recyclerView.setLayoutManager(mLayoutManager); recyclerView.setItemAnimator(new DefaultItemAnimator()); recyclerView.setAdapter(mAdapter); for(int i=0;i<customersProfileModel.addresses.size();i++){ itemList.add(customersProfileModel); mAdapter.notifyDataSetChanged(); } mAdapter.setOnItemClickListener(this); } @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { } } 

This is my adapter class :

 package app.android.dgconnect.adapters; import android.content.Context; import android.support.annotation.NonNull; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.RadioButton; import android.widget.TextView; import java.util.List; import app.android.dgconnect.R; import app.android.dgconnect.models.CustomersProfileModel; public class AddressBookAdapter extends RecyclerView.Adapter<AddressBookAdapter.SingleCheckViewHolder> { private List<CustomersProfileModel> itemList; private int mSelectedItem = -1; private Context mContext; private AdapterView.OnItemClickListener onItemClickListener; public AddressBookAdapter(List<CustomersProfileModel> itemList, Context context) { this.itemList = itemList; this.mContext = context; } @NonNull @Override public SingleCheckViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { LayoutInflater inflater = LayoutInflater.from(mContext); final View view = inflater.inflate(R.layout.address_book_list_row, viewGroup, false); return new SingleCheckViewHolder(view, this); } @Override public void onBindViewHolder(@NonNull final SingleCheckViewHolder holder, final int position) { CustomersProfileModel items = itemList.get(position); holder.address.setText(items.addresses.get(position).street.get(0)); String rname = items.addresses.get(position).region.region; String pcode = items.addresses.get(position).postcode; if (rname.equals("string")) { holder.address_line_two.setText(pcode); } else { holder.address_line_two.setText(rname + ", " + pcode); } try { holder.setDateToView(items, position); } catch (Exception e) { e.printStackTrace(); } } @Override public int getItemCount() { return itemList.size(); } public void setOnItemClickListener(AdapterView.OnItemClickListener onItemClickListener) { this.onItemClickListener = onItemClickListener; } public void onItemHolderClick(SingleCheckViewHolder holder) { if (onItemClickListener != null) onItemClickListener.onItemClick(null, holder.itemView, holder.getAdapterPosition(), holder.getItemId()); } class SingleCheckViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { private AddressBookAdapter mAdapter; private RadioButton radioButton; private TextView address, address_line_two; public SingleCheckViewHolder(View itemView, final AddressBookAdapter mAdapter) { super(itemView); this.mAdapter = mAdapter; address = itemView.findViewById(R.id.address); address_line_two = itemView.findViewById(R.id.address_line_two); radioButton = itemView.findViewById(R.id.radioButton); itemView.setOnClickListener(this); radioButton.setOnClickListener(this); } public void setDateToView(CustomersProfileModel item, int position) throws Exception { radioButton.setChecked(position == mSelectedItem); // mText.setText(item.getPersonName()); } @Override public void onClick(View v) { mSelectedItem = getAdapterPosition(); notifyItemRangeChanged(0, itemList.size()); mAdapter.onItemHolderClick(SingleCheckViewHolder.this); } } } 

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM