代码之家  ›  专栏  ›  技术社区  ›  alfredmack

我的项目单击侦听器在适配器中不工作

  •  -1
  • alfredmack  · 技术社区  · 7 年前

    我有垂直的recyclerview,工作很好,当我尝试使另一个recyclerview水平时,问题来了。我的数据显示正确,但项目单击列表器不工作。我曾尝试在适配器中检查onClick方法,但令人惊讶的是,它正在工作,但侦听器为null。我在这里呆了一整天,想看看我做错了什么,但没有成功。这是我的密码

    这是其他适配器类

    public class OthersAdapter extends RecyclerView.Adapter<OthersAdapter.ItemViewHolder> {
        private static ArrayList<OthersModel> dataList;
        private LayoutInflater mInflater;
        private Context context;
        private OthersClickListener clicklistener = null;
    
        public OthersAdapter(Context ctx, ArrayList<OthersModel> data) {
            context = ctx;
            dataList = data;
            mInflater = LayoutInflater.from(context);
        }
    
        public class ItemViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
            private ImageView image;
            private TextView moviename;
            private TextView category;
            private TextView likes;
            private TextView views;
    
            public ItemViewHolder(View itemView) {
                super(itemView);
    
                itemView.setOnClickListener(this);
    
                image = (ImageView) itemView.findViewById(R.id.image);
                moviename = (TextView) itemView.findViewById(R.id.txtmoviename);
                category = (TextView) itemView.findViewById(R.id.txtcategory);
                views = (TextView) itemView.findViewById(R.id.txtviews);
                likes = (TextView) itemView.findViewById(R.id.txtlikes);
            }
    
            @Override
            public void onClick(View v) {
    
                if (clicklistener != null) {
                    clicklistener.itemClicked(v, getAdapterPosition());
                }
            }
        }
    
        public void setClickListener(OthersClickListener listener) {
            this.clicklistener = listener;
        }
    
        @Override
        public ItemViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.horizontal_item, parent, false);
            ItemViewHolder itemViewHolder = new ItemViewHolder(view);
            return itemViewHolder;
        }
    
        @Override
        public void onBindViewHolder(ItemViewHolder holder, int position) {
            RequestOptions options = new RequestOptions()
                    .centerCrop()
                    .placeholder(R.drawable.placeholder)
                    .error(R.drawable.placeholder)
                    .diskCacheStrategy(DiskCacheStrategy.ALL)
                    .priority(Priority.HIGH);
    
            Glide.with(context).load(dataList.get(position).getImageUrl())
                    .apply(options)
                    .into(holder.image);
            holder.moviename.setText(dataList.get(position).getMoviename());
            holder.category.setText("Category : "+ dataList.get(position).getCategories());
            holder.views.setText(dataList.get(position).getViews());
            holder.likes.setText(dataList.get(position).getRating());
        }
    
        @Override
        public int getItemCount() {
            return dataList.size();
        }
    }
    

    这是我的听众

        public interface OthersClickListener {
            void itemClicked(View view, int position);
        }
    

    这是我的活动

    public class PlayMoviesActivity extends AppCompatActivity implements OthersClickListener,View.OnClickListener{
    ....
    LinearLayoutManager layoutManager = new LinearLayoutManager(getApplicationContext(), LinearLayoutManager.HORIZONTAL, false);
            RecyclerView rView = (RecyclerView)findViewById(R.id.recyclerView);
            rView.setLayoutManager(layoutManager);
            rView.addItemDecoration(new DividerItemDecoration(getApplicationContext(), LinearLayoutManager.VERTICAL));
            rcAdapter = new OthersAdapter(getApplicationContext(), (ArrayList<OthersModel>) listModals);
            rView.setAdapter(rcAdapter);
    ......
    
       @Override
    public void itemClicked(View view, int position) {
        OthersModel dt = listModals.get(position);
        Toast.makeText(getApplicationContext(), dt.getMoviename() + " clicked!", Toast.LENGTH_SHORT).show();
    }
    
    2 回复  |  直到 7 年前
        1
  •  1
  •   OneCricketeer Gabriele Mariotti    7 年前

    在活动中,替换 getApplicationContext() 具有 this 您需要实际设置其他侦听器,否则,是的,它为null。

    rcAdapter = new OthersAdapter(this, listModals);
    rcAdapter.setClickListener(this); // <-- Missed this
    rView.setAdapter(rcAdapter);
    

    您还可以实现不同的构造函数

    private final ArrayList<OthersModel> dataList;
    private final LayoutInflater mInflater;
    private final Context context;
    private OthersClickListener clicklistener;
    
    public OthersAdapter(Context ctx, List<OthersModel> data) {
        this(ctx, data, null);
    }
    
    public OthersAdapter(Context ctx, List<OthersModel> data, OthersClickListener listener) {
        context = ctx;
        dataList = data;
        mInflater = LayoutInflater.from(context);
        clicklistener = listener;
    }
    

    然后,在活动中

    rcAdapter = new OthersAdapter(this, listModals, this);
    

    rcAdapter = new OthersAdapter(this, listModals, new OthersClickListener() {
    
    });
    
        2
  •  0
  •   Adib Faramarzi    7 年前

    要节省内存,请将ViewHolder设置为静态,然后将onClickListener传递给构造函数,并将其设置为私有变量(如适配器本身),然后将click listener设置为该变量。

    同时传递clickListener( this )在适配器的活动中。

    还要确保布局中的根视图 clickable 没有任何东西阻止点击。您可以在单击时使用背景进行双重检查,也可以在布局内使用其他视图进行检查。