2016-06-11 68 views
5

我有一个RecyclerView.ViewHolder和RecyclerView.Adapter,我需要点击物品后,然后发送有关此物品的信息到另一个ActivityonClickListener在RecyclerView.ViewHolder

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; 
    } 
} 
+0

简单地说'地方'项目作为一个字段到视图中。 –

+0

另一种方法是从视图中获取物品位置并从地点获取物品 –

+0

使用卡片视图然后获取cardView.setOnClickListener(新视图)的值。OnClickListener()并通过sharedpreference或intent将值传递给 –

回答

0

您可以通过创建适配器内部的接口的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(我已经添加了我的适配器中的内部类),你会监听器适用于你的组件”如用户d点击,像这样:

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) 
        } 
       }); 

为了实现这个代码,你就如上图所示setOnItemClickListener您转接器内PlacesActivity

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; 
    } 
} 

所有这一切之后得到的活性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); 

现在做任何你想要的,并享受代码。

-1

试试这个,这是工作,我正确

创建一个新的类,并验证码

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){} 
} 

而在你的活动添加到您的适配器实现

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 
    } 
    }) 
    ); 
+0

@爱丽丝检查我的答案 –