【问题标题】:How to add Recycler item SetOnClickListener in javatechig example如何在 javatechig 示例中添加 Recycler 项 SetOnClickListener
【发布时间】:2015-09-21 05:48:20
【问题描述】:

我正在尝试为此 RecyclerView 添加 onclicklistener,但我尝试了所有方法,但它不起作用!:

FeedItem:

public class FeedItem {
    private String title;
    private String thumbnail;
    private String date;
    private String tags;

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getThumbnail() {
        return thumbnail;
    }

    public void setThumbnail(String thumbnail) {
        this.thumbnail = thumbnail;
    }

    public String getDate() {
        return date;
    }

    public void getDate(String date) {
        this.date = date;
    }

    public String getTags() {
        return tags;
    }

    public void setTags(String tags) {
        this.tags = tags;
    }

}

FeedListRowHolder:

public class FeedListRowHolder extends RecyclerView.ViewHolder {
    protected ImageView thumbnail;
    protected TextView title;
    protected TextView date;
    protected TextView tags;

    public FeedListRowHolder(View view) {
        super(view);
        this.thumbnail = (ImageView) view.findViewById(R.id.thumbnail);
        this.title = (TextView) view.findViewById(R.id.title);
        this.date = (TextView) view.findViewById(R.id.date);
        this.tags = (TextView) view.findViewById(R.id.tagsItems);
    }

}

适配器:

public class MyRecyclerAdapter extends RecyclerView.Adapter<FeedListRowHolder> {

    private List<FeedItem> feedItemList;
    private Context mContext;

    public MyRecyclerAdapter(Context context, List<FeedItem> feedItemList) {
        this.feedItemList = feedItemList;
        this.mContext = context;
    }

    @Override
    public FeedListRowHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.list_row, null);
        return new FeedListRowHolder(v);
    }

    @Override
    public void onBindViewHolder(FeedListRowHolder feedListRowHolder, int i) {
        FeedItem feedItem = feedItemList.get(i);
        Picasso.with(mContext).load(feedItem.getThumbnail())
                .error(R.drawable.placeholder)
                .placeholder(R.drawable.placeholder)
                .into(feedListRowHolder.thumbnail);

        feedListRowHolder.title.setText(Html.fromHtml(feedItem.getTitle()));
        feedListRowHolder.date.setText(Html.fromHtml(feedItem.getDate()));
        feedListRowHolder.tags.setText(Html.fromHtml(feedItem.getTags()));
    }

    @Override
    public int getItemCount() {
        return (null != feedItemList ? feedItemList.size() : 0);
    }
}

我们如何将OnClickListener 添加到这个RecyclerView

谢谢

【问题讨论】:

  • 您要单击整个列表项吗?或列表中的任何特定项目?
  • 只是为了展示他们的详细信息......

标签: android onclicklistener android-recyclerview


【解决方案1】:

写入 OnCreate 方法

 recyclerview.addOnItemTouchListener(
                    new RecyclerItemClickListener(getActivity(), new RecyclerItemClickListener.OnItemClickListener() {
                        @Override
                        public void onItemClick(View view, int position) {
                            FeedItem bookScreenDateEntity = (FeedItem)yourList.get(position);

                            bookScreenDateEntity.getServiceid();

                        }
                    })
            );

RecyclerItemClickListener 类:

public class RecyclerItemClickListener implements RecyclerView.OnItemTouchListener {
        private OnItemClickListener mListener;

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

        GestureDetector mGestureDetector;

        public RecyclerItemClickListener(Context context, OnItemClickListener listener) {
            mListener = listener;
            mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
                @Override
                public boolean onSingleTapUp(MotionEvent e) {
                    return true;
                }
            });
        }

        @Override
        public boolean onInterceptTouchEvent(RecyclerView view, MotionEvent e) {

            View childView = view.findChildViewUnder(e.getX(), e.getY());
            if (childView != null && mListener != null && mGestureDetector.onTouchEvent(e)) {
                mListener.onItemClick(childView, view.getChildAdapterPosition(childView));
                return true;
            }
            return false;
        }

        @Override
        public void onTouchEvent(RecyclerView view, MotionEvent motionEvent) {
        }

        @Override
        public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
        }
    }

【讨论】:

    【解决方案2】:

    您可以像这样使RecyclerItem 可点击

    public class FeedListRowHolder extends RecyclerView.ViewHolder {
        protected ImageView thumbnail;
        protected TextView title;
        protected TextView date;
        protected TextView tags;
    
        public FeedListRowHolder(View view) {
            super(view);
            this.thumbnail = (ImageView) view.findViewById(R.id.thumbnail);
            this.title = (TextView) view.findViewById(R.id.title);
            this.date = (TextView) view.findViewById(R.id.date);
            this.tags = (TextView) view.findViewById(R.id.tagsItems);
            view.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    // do you stuff here
                }
          });
        }
    
    }
    

    【讨论】:

      【解决方案3】:

      您应该在 RecyclerView.ViewHolder 中实现 View.OnClickListener。如果您想收听整个项目,请单击。见下面修改后的viewholder类

      public class FeedListRowHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
      
          protected ImageView thumbnail;
          protected TextView title;
          protected TextView date;
          protected TextView tags;
      
          public FeedListRowHolder(View view) {
              super(view);
              this.thumbnail = (ImageView) view.findViewById(R.id.thumbnail);
              this.title = (TextView) view.findViewById(R.id.title);
              this.date = (TextView) view.findViewById(R.id.date);
              this.tags = (TextView) view.findViewById(R.id.tagsItems);
          }
      
      
          @Override
          public void onClick(View v) {
      
          }
      }
      

      让我们这样做。如果您想要单个视图点击,则将每个按钮或视图点击注册到此视图持有者中。例如,缩略图点击可以注册如下。

      public class FeedListRowHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
      
          protected ImageView thumbnail;
          protected TextView title;
          protected TextView date;
          protected TextView tags;
      
          public FeedListRowHolder(View view) {
              super(view);
              this.thumbnail = (ImageView) view.findViewById(R.id.thumbnail);
              this.thumbnail.setOnClickListener(new View.OnClickListener() {
                  @Override
                  public void onClick(View v) {
      
                  }
              });
              this.title = (TextView) view.findViewById(R.id.title);
              this.date = (TextView) view.findViewById(R.id.date);
              this.tags = (TextView) view.findViewById(R.id.tagsItems);
          }
      
      
          @Override
          public void onClick(View v) {
      
          }
      }
      

      【讨论】:

        【解决方案4】:

        有很多方法可以解决这个问题,但是下面给出了其中一种

        RecyclerView recyclerView = findViewById(R.id.recycler);
        recyclerView.addOnItemTouchListener(
            new RecyclerItemClickListener(context, new RecyclerItemClickListener.OnItemClickListener() {
              @Override public void onItemClick(View view, int position) {
                // do whatever
              }
            })
        );
        

        RecyclerItemClickListener 实现:

        import android.content.Context;
        import android.support.v7.widget.RecyclerView;
        import android.view.GestureDetector;
        import android.view.MotionEvent;
        import android.view.View;
        
        
        public class RecyclerItemClickListener implements RecyclerView.OnItemTouchListener {
          private OnItemClickListener mListener;
        
          public interface OnItemClickListener {
            public void onItemClick(View view, int position);
          }
        
          GestureDetector mGestureDetector;
        
          public RecyclerItemClickListener(Context context, OnItemClickListener listener) {
            mListener = listener;
            mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
              @Override public boolean onSingleTapUp(MotionEvent e) {
                return true;
              }
            });
          }
        
          @Override public boolean onInterceptTouchEvent(RecyclerView view, MotionEvent e) {
            View childView = view.findChildViewUnder(e.getX(), e.getY());
            if (childView != null && mListener != null && mGestureDetector.onTouchEvent(e)) {
              mListener.onItemClick(childView, view.getChildPosition(childView));
              return true;
            }
            return false;
          }
        
          @Override public void onTouchEvent(RecyclerView view, MotionEvent motionEvent) { }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-08-31
          • 2017-08-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-01-29
          相关资源
          最近更新 更多