无法为RecyclerView解析方法setOnItemClickListener

问题描述 投票:0回答:5

我正在使用RecyclerView,我正在尝试为RecyclerView中的每个项目设置OnClick和OnLongClick。我道歉,但我不认为我真的理解代码发生了什么,其中一些是我的任务的幻灯片和一些我在本网站上找不到的东西的补丁。在我的RecyclerView Adapter类的顶部我hav static OnItemClickListener mItemClickListener;`然后我有一个新方法的接口,一个设置我的clicklistener的方法,然后是我的ViewHolder实现,如下所示:

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;
               }
            });
        }
    }

我的问题出现在我的片段的类中,该片段拥有recycleler视图,我正在尝试设置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");
            }
        });

它说这个问题与myAdapter.setOnItemClickListener有关 'Cannot resolve method 'setOnItemClickListener(anonymous com.example.kevin.assignment4.MyRecyclerAdapter.OnItemClickListener)' 但我不知道为什么会这么说。据我所知,应该能够找到合适的方法。 编辑:我的MyRecyclerView类导入如下:

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;
android android-recyclerview onitemclicklistener
5个回答
1
投票

我尝试了同样的事情并且工作很酷。检查一下。

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());
                }
            }
        }
    }
}

0
投票

所以我不确定为什么我的原始方法不起作用,因为我在网上看到了类似的方法,甚至这里发布的答案之一也是一样的。我通过更改我的适配器类的结构解决了我的问题,以便它将侦听器作为RecyclerView适配器的构造函数的参数。在那里,我将类中的侦听器设置为等于进入的侦听器。

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

然后在我的片段中,我创建了Recyclerview

myAdapter = new MyRecyclerAdapter(this);

我的fragment类实现了我的适配器类的接口。


0
投票

意外地将您的适配器声明为RecyclerView.Adapter而不是您的自定义适配器MyRecyclerAdapter()是可能的原因。

RecyclerView.Adapter adapter = new MyRecyclerAdapter()

代替,

MyRecyclerAdapter adapter = new MyRecyclerAdapter()

0
投票

我遇到了类似的问题..这段代码解决了我的问题。回答太迟了,但是这段代码就像魔法一样。这是我的java类。

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) {

    }
}

这是我的适配器类:

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);
        }
    }


}

0
投票

我太晚了,但这可能对某人有所帮助;尝试从活动中使用Adapter的自定义方法时,我只是遇到了“无法解决符号”的问题(为了使用Android Studio 3.3.2在Java中设置RecyclerView的点击监听器)。

令人困惑的是,尽管如此,同时,对于我的适配器实例,基类RecyclerView.Adapter自己的方法(例如getItemCount和onBindViewHolder)是可解析的。

我的问题是我有类似凯文的代码,凯文在他的片段中有:

myAdapter = new MyRecyclerAdapter();

什么解决了我的问题是我忽略了在实例化适配器时简单地指定一个类型 - 例如:

MyRecyclerAdapter myAdapter = new MyRecyclerAdapter();

...'无法解析符号'然后成为过去,我能够访问我的自定义适配器方法,如setOnItemClickedListener。

© www.soinside.com 2019 - 2024. All rights reserved.