Android RecyclerView中setTag(...)/ getTag(...)的否定点和替代方法

时间:2016-01-12 14:08:16

标签: android android-recyclerview

我的目标(为了一个简单的例子)是检测LinearLayout内的ImageView上的点击。每个由LinearLayout表示的项目列表使用RecyclerView设置。

public class SomeRecyclerAdapter extends RecyclerView.Adapter<SomeRecyclerAdapter.SomeListViewHolder> {

    ....

@Override
public void onBindViewHolder(final SomeViewHolder holder, final int position) {
    SomeItem item = someList.get(position);

    holder.vImage.setTag(item);
    holder.vImage
            .setOnClickListener(new CompoundButton.OnClickListener(){

                @Override
                public void onClick(View v) {
                    SomeListItem item = (SomeItem) holder.vImage.getTag();
                    Toast.makeText(context, item.getName() + " Image Clicked", Toast.LENGTH_SHORT).show();
                }
            });
    ....

    public static class SomeListViewHolder extends RecyclerView.ViewHolder{
        protected ImageView vImage;

        public SomeListViewHolder(View itemView) {
            super(itemView);
            vImage = (ImageView) itemView.findViewById(R.id.tem_some_list);
        }

    }

}

这种方法可以正常运行但是,虽然我没有足够的知识来陈述,但它似乎并不是一种有效的工具。

我试图用onInterceptTouchEvent实现这个,但我只能点击LinearLayout,意思是项目,而不是按钮(图像,在这种情况下)。

如果我写错了,或者如果我想要的话有替代方法,请告诉我。

1 个答案:

答案 0 :(得分:3)

将项目绑定到视图,并让ViewHolders自己处理点击。像这样:

public class SomeItemViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
   private final ImageView mImg;
   private SomeItem mBoundItem;

   public SomeItemViewHolder(View view) {
      mImg = view.findViewById(R.id.imageId);
      mImg.setOnClickListener(this);
   }
   ...
   public void bind(SomeItem item) {
      mBoundItem = item;
      // Update the ViewHolder to the item's specifications.
   }

   @Override
   public void onClick(View v) {
      Toast.makeText(v.getContext(), mBoundItem.getName() + " Image Clicked", Toast.LENGTH_SHORT).show();
   }
}

然后,在适配器中,只需调用它。

@Override
public void onBindViewHolder(SomeItemViewHolder holder, int position) {
   SomeItem item = someList.get(position);
   holder.bind(item);
}