【问题标题】:ButterKnife onClick listener inside ViewHolder method [duplicate]ViewHolder 方法中的 ButterKnife onClick 侦听器[重复]
【发布时间】:2017-10-18 09:04:37
【问题描述】:

在此方法中将黄油刀的@OnClick 添加到视图中的正确方法是什么?

    private List<Foo> foos;
    private RecyclerView recyclerView;
    private MapActivity mapView;
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(final ViewGroup parent, final int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_foo, parent,
                false);
        view.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int selectedPosition = recyclerView.getChildAdapterPosition(v);
                mapView.onFooSelected(foos.get(selectedPosition));
            }
        });

        return new FooInfoViewHolder(view);
    }

这个问题的不同之处在于我想将@OnClick绑定到FooInfoViewHolder本身。

【问题讨论】:

    标签: java android onclick android-viewholder butterknife


    【解决方案1】:

    使用 ViewHolder 类,在该类中我们可以处理黄油刀的点击。

    以下只是理解的例子。

    public class YourAdapter extends RecyclerView.Adapter<YourAdapter.ViewHolder> {
    
        private List<Data> list;
    
        public YourAdapter(List<Data> list) {
            this.list = list;
        }
    
        @Override
        public YourAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            LayoutInflater inflater = LayoutInflater.from(parent.getContext());
            return new ViewHolder(inflater.inflate(R.layout.list_item_layout, parent, false));
        }
    
        @Override
        public void onBindViewHolder(YourAdapter.ViewHolder holder, int position) {
            Data item = list.get(position);
            holder.tvTitle1.setText(item.getTitle1());
        }
    
        @Override
        public int getItemCount() {
            int count = 0;
            if (null != list) {
                count = list.size();
            }
            return count;
        }
    
        public class ViewHolder extends RecyclerView.ViewHolder {
    
            @BindView(R.id.tvVRValue1)
            TextView tvTitle1;
    
            public ViewHolder(View itemView) {
                super(itemView);
                ButterKnife.bind(this, itemView);
            }
    
            @OnClick(R.id.tvVRValue1)
            public void onClickYourFunction(){
                //Here your onclick method goes
            }
        }
    }
    

    希望对您有所帮助。干杯!!!

    【讨论】:

      【解决方案2】:

      我知道出了什么问题。实际上,我认为这与可能的重复答案略有不同。 关键是在 ViewHolder ITSELF 上实现 @OnClick (不像另一个问题,在视图的子视图上):

      private List<Foo> foos;
      private RecyclerView recyclerView;
      private MapActivity mapView;
      @Override
      public RecyclerView.ViewHolder onCreateViewHolder(final ViewGroup parent, final int viewType) {
          View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_foo, parent,
                  false);
          return new FooInfoViewHolder(view);
      }
      

      然后是 FooInfoViewHolder:

      public class FooInfoViewHolder extends RecyclerView.ViewHolder {
      
              @OnClick
              public void onClick(View v) {
                  int selectedPosition = recyclerView.getChildAdapterPosition(v);
                  mapView.onFooSelected(foos.get(selectedPosition));
              }
      
              public FooInfoViewHolder(View itemView) {
                  super(itemView);
                  ButterKnife.bind(this, itemView);
              }
          }
      

      【讨论】:

        猜你喜欢
        • 2015-06-02
        • 2013-02-13
        • 2014-12-04
        • 2020-06-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-26
        • 1970-01-01
        相关资源
        最近更新 更多