【问题标题】:onClickListener in RecyclerView.ViewHolderRecyclerView.ViewHolder 中的 onClickListener
【发布时间】:2016-06-11 08:22:01
【问题描述】:

我有一个 RecyclerView.ViewHolder 和 RecyclerView.Adapter,我需要在单击项目后将有关此项目的信息发送到另一个 Activity

PlacesAdapter.java

public class PlacesAdapter extends RecyclerView.Adapter<PlacesViewHolder> {
private PlacesActivity placesActivity;

    Context context;
    private int position;
    List<Places> places;

    public PlacesAdapter(List<Places> places) {
        this.places = places;}

    @Override
    public void onAttachedToRecyclerView(RecyclerView recyclerView) {
        super.onAttachedToRecyclerView(recyclerView);
    }

    @Override
    public PlacesViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.places_view, viewGroup, false);
        PlacesViewHolder pvh = new PlacesViewHolder(v);
        return pvh;
    }

    @Override
    public void onBindViewHolder(PlacesViewHolder personViewHolder, int i) {
        personViewHolder.name.setText(places.get(i).name);
        personViewHolder.address.setText(places.get(i).address);
        Picasso.with(personViewHolder.itemView.getContext())
                .load(places.get(i).photo)
                .into(personViewHolder.getPhoto());
       }

    @Override
    public int getItemCount() {
        return places.size();
    }

}

PlacesViewHolder.java

在这一行"intent.putExtra(PlacesDetail.PLACES_NAME,);" 我如何发送姓名?

 public  class PlacesViewHolder extends RecyclerView.ViewHolder {

    CardView cv;
    public TextView name;
    public TextView address;
    public ImageView photo;
    public PlacesViewHolder(final View itemView) {
        super(itemView);
        cv = (CardView)itemView.findViewById(R.id.cv);
        name = (TextView)itemView.findViewById(R.id.person_name);
        address = (TextView)itemView.findViewById(R.id.person_age);
        photo = (ImageView)itemView.findViewById(R.id.person_photo);

        itemView.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View v) {
                Context context = v.getContext();
                Intent intent = new Intent(context, PlacesDetail.class);
                intent.putExtra(PlacesDetail.PLACES_NAME,);
                context.startActivity(intent);
            }
        });

    }

    public TextView getAddress() {
        return address;
    }

    public TextView getName() {
        return name;
    }
    public ImageView getPhoto() {
        return photo;
    }
}

【问题讨论】:

  • 只需将place item 作为字段放入viewholder。
  • 另一种方式是从viewholder获取item位置,从places获取item
  • 使用卡片视图,然后获取 cardView.setOnClickListener(new View.OnClickListener() 上的值,并通过 sharedpreference 或 intent 传递任何你想要的值
  • 查看下面的答案,如果您有任何疑问或困惑,请通过评论告诉我。

标签: java android android-recyclerview onclicklistener


【解决方案1】:

这是自定义适配器的完整示例,我可以在其中获取特定项目的详细信息。在 MainActivity 你需要设置适配器:

adapter = new MyAdapter(getApplicationContext(), account_no, title, aFN1, aLN1,aFN2, aLN2,aFN3, aLN3,isavilable,waitlist,flag);
                            adapter.notifyDataSetChanged();
                            mRecyclerView.setAdapter(adapter);

现在查看自定义适配器的代码:

 public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
    String TAG = "MyAdapter";
    Context context;
    private String[] accountNo;
    private String[] title;
    private String[] afn1;
    private String[] aln1;
    private String[] afn2;
    private String[] aln2;
    private String[] afn3;
    private String[] aln3;
    private String[] isAvailable;
    private String[] waitlist;
    private int flag;
 public static class ViewHolder extends RecyclerView.ViewHolder {
        public TextView account_no,title,afn1,afn2,aln1,aln2,color,is_available;
        private ImageView img_android;
        CardView cardView;
        public ViewHolder(CardView v) {
            super(v);
            account_no = (TextView)v.findViewById(R.id.acctno);
            title = (TextView)v.findViewById(R.id.title);
            afn1 = (TextView) v.findViewById(R.id.afn1);
            cardView = v;
        }
    }
    // Provide a suitable constructor (depends on the kind of dataset)
    public MyAdapter(Context context, String[] accountNo,String[] title,String[] afn1,String[] aln1,String[] afn2,String[] aln2,String[] afn3,String[] aln3,String[] isAvailable, String[] waitlist,int flag) {
        this.context = context;
        this.accountNo = accountNo;
        this.title = title;
        this.afn1 = afn1;
        this.aln1 = aln1;
        this.afn2 = afn2;
        this.aln2 = aln2;
        this.afn3 = afn3;
        this.aln3 = aln3;
        this.isAvailable = isAvailable;
        this.waitlist = waitlist;
        this.flag = flag;
        Log.d(TAG,afn1.toString() +aln1+afn2+aln2+afn3+aln3.toString()+waitlist);
    }
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent,int viewType) {
        CardView cv = (CardView) LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item, parent, false);
        return new ViewHolder(cv);
    }
    @Override
    public void onBindViewHolder(final ViewHolder holder, final int position) {
        final CardView cardView = holder.cardView;
        final TextView accountno = (TextView)cardView.findViewById(R.id.acctno);
        accountno.setText(accountNo[position]);
        final TextView titletxt = (TextView)cardView.findViewById(R.id.title);
        titletxt.setText(title[position]);
        final TextView afn1txt = (TextView) cardView.findViewById(R.id.afn1);
        afn1txt.setText(afn1[position]+" "+aln1[position]);
        Log.d(TAG,waitlist[position]);
        cardView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int id = getItemViewType(position);
                SharedPreferences sharedPreferences = context.getSharedPreferences(Constant.MYPREFERENCE,Context.MODE_PRIVATE);
                SharedPreferences.Editor edit = sharedPreferences.edit();
                edit.putString(Constant.ACCOUNT,accountNo[position]);
                edit.putString(Constant.TITLE,title[position]);
                edit.putString(Constant.AFN1,afn1[position]);
                edit.putString(Constant.ALN1,aln1[position]);
                edit.putString(Constant.AFN2,afn2[position]);
                edit.putString(Constant.ALN2,aln2[position]);
                edit.putString(Constant.AFN3,afn3[position]);
                edit.putString(Constant.ALN3,aln3[position]);
                edit.putBoolean(Constant.IS_AVAILABLE, Boolean.parseBoolean(isAvailable[position].toUpperCase()));
                edit.putString(Constant.WAITLIST,waitlist[position]);
                Log.d("WaitingNo2 :",""+String.valueOf(waitlist[position]));
                edit.commit();
                Intent intent = new Intent(v.getContext(), DetailsActivity.class);
                v.getContext().startActivity(intent);
            }
        });
    }

    // Return the size of your dataset (invoked by the layout manager)
    @Override
    public int getItemCount() {
        return accountNo.length;
    }
}

在卡片点击调用的Activity中从sharedPreferences获取值之后:

preferences = getSharedPreferences("myshared", Context.MODE_PRIVATE);
AccountNo = sharedPreferences.getString(Constant.ACCOUNT,null).toUpperCase();
            title = sharedPreferences.getString(Constant.TITLE,null).toUpperCase();
            afn1 = sharedPreferences.getString(Constant.AFN1,null).toUpperCase();
            aln1 = sharedPreferences.getString(Constant.ALN1,null).toUpperCase();
            afn2 = sharedPreferences.getString(Constant.AFN2,null).toUpperCase();
            aln2 = sharedPreferences.getString(Constant.ALN2,null).toUpperCase();
            afn3 = sharedPreferences.getString(Constant.AFN3,null).toUpperCase();
            aln3 = sharedPreferences.getString(Constant.ALN3,null).toUpperCase();
            isAvailable = sharedPreferences.getBoolean(Constant.IS_AVAILABLE,isAvailable);
            waitlist = sharedPreferences.getString(Constant.WAITLIST,waitlist);

现在做任何你想做的事,享受代码吧。

【讨论】:

    【解决方案2】:

    您可以通过在适配器内为itemclicklistener 创建一个接口来实现此目的,然后您可以从PlacesActivity 设置onItemClickListener

    在您的PlacesAdapter 中的某个地方,您需要以下内容:

    private onRecyclerViewItemClickListener mItemClickListener;
    
     public void setOnItemClickListener(onRecyclerViewItemClickListener mItemClickListener) {
            this.mItemClickListener = mItemClickListener;
        }
    
        public interface onRecyclerViewItemClickListener {
            void onItemClickListener(View view, int position, String places_name);
        }
    

    然后在您的ViewHolder(我已将其添加为适配器中的内部类)中,您可以将侦听器应用于您希望用户单击的组件,如下所示:

    class PlacesViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
            PlacesViewHolder(View view) {
                super(view);
                view.setOnClickListener(this);
            }
    
            @Override
            public void onClick(View v) {
                if (mItemClickListener != null) {
                    mItemClickListener.onItemClickListener(v, getAdapterPosition(), PlacesDetail.PLACES_NAME);
                }
            }
        }
    

    这个例子展示了一个onClickListener被应用到PlacesViewHolder内部的视图。

    recyclerView.setAdapter(adapter);// set adapter on recyclerview
                adapter.notifyDataSetChanged();// Notify the adapter
                adapter.setOnItemClickListener(new PlacesAdapter.onRecyclerViewItemClickListener() {
                    @Override
                    public void onItemClickListener(View view, int position, String places_name) { 
    //perform click logic here (places_name is passed)
                        }
                    });
    

    要实现此代码,您将setOnItemClickListenerPlacesActivity 内的适配器,如上所示。

    【讨论】:

      【解决方案3】:

      试试这个,它对我很有效

      创建一个新类和这段代码

      public class RecyclerItemClickListener implements RecyclerView.OnItemTouchListener {
      private OnItemClickListener mListener;
      
      public interface OnItemClickListener {
          public void onItemClick(View view, int position);
      
          public void onLongItemClick(View view, int position);
      }
      
      GestureDetector mGestureDetector;
      
      public RecyclerItemClickListener(Context context, final RecyclerView recyclerView, OnItemClickListener listener) {
          mListener = listener;
          mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
              @Override
              public boolean onSingleTapUp(MotionEvent e) {
                  return true;
              }
      
              @Override
              public void onLongPress(MotionEvent e) {
                  View child = recyclerView.findChildViewUnder(e.getX(), e.getY());
                  if (child != null && mListener != null) {
                      mListener.onLongItemClick(child, recyclerView.getChildAdapterPosition(child));
                  }
              }
          });
      }
      
      @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){}
      } 
      

      并在您的 Activity 中将其添加到您的适配器实现中

      mRecyclerView.addOnItemTouchListener(
          new RecyclerItemClickListener(getActivity(), mRecyclerView, new RecyclerItemClickListener.OnItemClickListener() {
      @Override
      public void onItemClick(View view, int position) {
          // do something
          }
          }
          }
      
      @Override
      public void onLongItemClick(View view, int position) {
          // do whatever
          }
          })
          ); 
      

      【讨论】:

      • @Alice 检查我的答案
      猜你喜欢
      • 2018-01-14
      • 2022-01-02
      • 1970-01-01
      • 2017-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多