2017-09-27 110 views
-9

我在一个片段中使用了一个recycleView,并且希望为其添加itemClickListener。 这里是我的代码:如何在回收站视图中添加OnItemClick监听器

MyAdapter.java:

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> { 

    private String[] mDataset; 

    public static class MyViewHolder extends RecyclerView.ViewHolder{ 
     public CardView mCardView; 
     public TextView mTextView; 
     public MyViewHolder(View v){ 
      super(v); 

      mCardView = (CardView) v.findViewById(R.id.card_view); 
      mTextView = (TextView) v.findViewById(R.id.tv_text); 

     } 

    } 

    public MyAdapter(String[] myDataset){ 
     mDataset = myDataset; 
    } 

    @Override 
    public MyAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType){ 
     View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.card_item, parent, false); 
     MyViewHolder vh = new MyViewHolder(v); 
     return vh; 
    } 

    @Override 
    public void onBindViewHolder(MyViewHolder holder, final int position){ 
     holder.mTextView.setText(mDataset[position]); 
    } 

    @Override 
    public int getItemCount() { return mDataset.length; } 

} 

,这是当我在片段叫它,Staf3Fragment.java

/** 
* A simple {@link Fragment} subclass. 
* Activities that contain this fragment must implement the 
* {@link Staf3Fragment.OnFragmentInteractionListener} interface 
* to handle interaction events. 
* Use the {@link Staf3Fragment#newInstance} factory method to 
* create an instance of this fragment. 
*/ 
public class Staf3Fragment extends Fragment { 

    // TODO: Rename parameter arguments, choose names that match 
    // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER 
    private static final String ARG_PARAM1 = "param1"; 
    private static final String ARG_PARAM2 = "param2"; 

    // TODO: Rename and change types of parameters 
    private String mParam1; 
    private String mParam2; 

    private OnFragmentInteractionListener mListener; 

    public Staf3Fragment() { 
     // Required empty public constructor 
    } 

    /** 
    * Use this factory method to create a new instance of 
    * this fragment using the provided parameters. 
    * 
    * @param param1 Parameter 1. 
    * @param param2 Parameter 2. 
    * @return A new instance of fragment Staf3Fragment. 
    */ 
    // TODO: Rename and change types and number of parameters 
    public static Staf3Fragment newInstance(String param1, String param2) { 
     Staf3Fragment fragment = new Staf3Fragment(); 
     Bundle args = new Bundle(); 
     args.putString(ARG_PARAM1, param1); 
     args.putString(ARG_PARAM2, param2); 
     fragment.setArguments(args); 
     return fragment; 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     if (getArguments() != null) { 
      mParam1 = getArguments().getString(ARG_PARAM1); 
      mParam2 = getArguments().getString(ARG_PARAM2); 
     } 
    } 




    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     // Inflate the layout for this fragment 
     View view = inflater.inflate(R.layout.fragment_staf3, container, false); 


     RecyclerView rv = (RecyclerView) view.findViewById(R.id.rv_recycler_view); 
     rv.setHasFixedSize(true); 
     MyAdapter adapter = new MyAdapter(new String[]{"Upacara Bendera", "Info Aplikasi"}); 
     rv.setAdapter(adapter); 

     LinearLayoutManager llm = new LinearLayoutManager(getActivity()); 
     rv.setLayoutManager(llm); 

     return view; 
    } 

    // TODO: Rename method, update argument and hook method into UI event 
    public void onButtonPressed(Uri uri) { 
     if (mListener != null) { 
      mListener.onFragmentInteraction(uri); 
     } 
    } 

    @Override 
    public void onAttach(Context context) { 
     super.onAttach(context); 
     if (context instanceof OnFragmentInteractionListener) { 
      mListener = (OnFragmentInteractionListener) context; 
     } else { 
      //throw new RuntimeException(context.toString() 
        //+ " must implement OnFragmentInteractionListener"); 
     } 
    } 

    @Override 
    public void onDetach() { 
     super.onDetach(); 
     mListener = null; 
    } 

    /** 
    * This interface must be implemented by activities that contain this 
    * fragment to allow an interaction in this fragment to be communicated 
    * to the activity and potentially other fragments contained in that 
    * activity. 
    * <p> 
    * See the Android Training lesson <a href= 
    * "http://developer.android.com/training/basics/fragments/communicating.html" 
    * >Communicating with Other Fragments</a> for more information. 
    */ 
    public interface OnFragmentInteractionListener { 
     // TODO: Update argument type and name 
     void onFragmentInteraction(Uri uri); 
    } 
} 

如何使项目点击不同的使用,我意思是当点击物品1时它会转到另一个活动,如果物品2将转到另一个活动

请帮我 谢谢

============================================== =======================

card_item.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="68dp" > 

    <android.support.v7.widget.CardView 
     android:id="@+id/card_view" 
     xmlns:card_view="http://schemas.android.com/apk/res-auto" 
     android:layout_width="match_parent" 
     android:layout_margin="10dp" 
     android:layout_height="62dp" 
     card_view:cardCornerRadius="4dp" 
     card_view:elevation="14dp"> 

     <RelativeLayout 
      android:layout_width="match_parent" 
      android:layout_height="match_parent"> 

      <ImageView 
       android:id="@+id/iv_image" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_alignParentLeft="true" 
       android:layout_alignParentStart="true" 
       android:layout_centerVertical="true" 
       android:src="@drawable/abc_btn_radio_material"></ImageView> 

      <TextView 
       android:id="@+id/tv_text" 

       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_toRightOf="@+id/iv_image" 
       android:layout_marginLeft="10dp" 
       android:layout_centerVertical="true" 
       android:gravity="center" 
       android:textSize="20dp"></TextView> 

     </RelativeLayout> 
    </android.support.v7.widget.CardView> 

</RelativeLayout> 

fragment_staf3.xml

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context="com.network.poeja.belibis.Staf3Fragment"> 

    <android.support.v7.widget.RecyclerView 
     android:id="@+id/rv_recycler_view" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 
    </android.support.v7.widget.RecyclerView> 
</FrameLayout> 
+0

点击监听器不能用于recyclerview.For recyclerview你必须使用触摸监听器 –

+0

如何做到这一点? –

+0

还有很多相同的教程。如果你想检测点击整个行比有一个简单的方法。您可以为该行的父级布局添加单击侦听器,并为其添加一个单击侦听器。 –

回答

0

像这样创建

public interface ClickInterface { 

    public void recyclerviewOnClick(int position); 
} 

一个自定义的接口类实现它在你的片段和初始化界面

YourFragment extends Fragment implements ClickInterface{ 

private ClickInterface listner; 

------- Your oncreateView -------- 
listner=this; //Now pass this in your adapter 
    } 

在适配器构造函数得到这个听者这样

public MyAdapter(String[] myDataset,ClickInterface listner){ 
     this.mDataset = myDataset; 
     this.listner=listner; 
    } 

,最后在你的ViewHolder

public class MyViewHolder extends RecyclerView.ViewHolder{ 
     public CardView mCardView; 
     public TextView mTextView; 
     public MyViewHolder(View v){ 
      super(v); 

      mCardView = (CardView) v.findViewById(R.id.card_view); 
      mTextView = (TextView) v.findViewById(R.id.tv_text); 

mTextView.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View view) { 

        listner.recyclerviewOnClick(getAdapterPosition()); 

       } 
      }); 
     } 
    } 

现在你会得到

public void recyclerviewOnClick(int position){ 
// Here you will get the position 
} 
+0

错误:(27,21)错误:无法从静态上下文中引用非静态变量列表器 –

+0

从您的视图持有者类中删除静态关键字 – AbhayBohra

+0

现在我无法找到符号blockuserOnClick(int) –

0

你可以做通过下面的代码;

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> { 

private String[] mDataset; 

public static class MyViewHolder extends RecyclerView.ViewHolder{ 
    public CardView mCardView; 
    public TextView mTextView; 

    public View mainView; 

    public MyViewHolder(View v){ 
     super(v); 

     mainView = v; 

     mCardView = (CardView) v.findViewById(R.id.card_view); 
     mTextView = (TextView) v.findViewById(R.id.tv_text); 

    } 

} 

public MyAdapter(String[] myDataset){ 
    mDataset = myDataset; 
} 

@Override 
public MyAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType){ 
    View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.card_item, parent, false); 
    MyViewHolder vh = new MyViewHolder(v); 
    return vh; 
} 

@Override 
public void onBindViewHolder(MyViewHolder holder, final int position){ 
    holder.mTextView.setText(mDataset[position]); 

    //And below code will execute item click event for RecyclerView's item.... 

    holder.mainView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

      //Do your code here for item click .... 

      } 
     }); 

} 

@Override 
public int getItemCount() { return mDataset.length; } 

} 
1

您可以尝试ButterKnife@onClick()方式。

@OnClick(R.id.btnCheck) 
    public void onCheck() { 
     Log.d("ViewHolder", "position ->" + getAdapterPosition()); 
    } 
0

在片段中的位置你clickListenr添加到viewHolder这样

public class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{ 
public CardView mCardView; 
public TextView mTextView; 

public MyViewHolder(View v) { 
    super(v); 

    mCardView = (CardView) v.findViewById(R.id.card_view); 
    mTextView = (TextView) v.findViewById(R.id.tv_text); 
    mCardView.setOnClickListener(this); 
    mTextView.setOnClickListener(this); 

} 

@Override 
public void onClick(View view) { 

    switch (view.getId()) { 
     case R.id.card_view: 

      //Action when card_view is clicked 

      break; 
     case R.id.tv_text: 

      //Action when tv_text is clicked 

      break; 
     default: 
      break; 
    } 
    } 
} 
+0

错误:(25,9)错误:方法不覆盖或实现方法超类型“@Override” –

+0

什么?这是工作代码...发布错误日志 – Anonymous

+0

我尝试添加敬酒案例card_view,它说没有找到合适的方法发现makeText(视图,字符串,int)方法toast.maketext和所以... –

0

可以设置点击侦听器内部的适配器类,也可以使用RecyclerView单击侦听器类。 如果您使用RecyclerView自定义点击,则必须使用此类,并在需要的任何位置使用此侦听器的活动或片段。这是类,你必须保持util包。

public class RecyclerOnClickListener 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 RecyclerOnClickListener(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){} 

}

,并在此之后,你可以通过调用这样的方法,使用这个类,这里​​是代码。

私人无效recycleClick(){

product_recycleview.addOnItemTouchListener(
      new RecyclerOnClickListener(ProductListActivity.this, product_recycleview, new RecyclerOnClickListener.OnItemClickListener() {     @Override 
       public void onItemClick(View view, int position) { 
       Intent intent = new Intent(ProductListActivity.this, ProductDetailsActivity.class);      intent.putExtra("data", detailList.get(position)); 
        startActivity(intent); 
        overridePendingTransition(R.anim.slide_in_left, R.anim.fade_out); 
       } 

       @Override 
       public void onLongItemClick(View view, int position) { 

       } 
      })); 

} 

您可以通过意向将数据发送到下一个活动和另一个解决方案是这样的,你可以在ViewHolder类项目实现点击监听器,你可以管理单击适配器类内这样,下面的代码

itemRowHolder.lnr_layout_package.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Intent intent = new Intent(mContext, SinglePackageShowOnlyActivity.class); 
      intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_MULTIPLE_TASK); 
      intent.putExtra("list", dataList.get(i).getSingleItemModels()); 
      intent.putExtra("title", model.getType()); 
      intent.putExtra("image", model.getImages()); 
      intent.putExtra("service_name", service_title); 
      intent.putExtra("pack_name",package_title); 


      mContext.getApplicationContext().startActivity(intent); 

     } 
    }); 

记住,如果你可以设置点击某个项目,那么你必须喜欢在适配器类按一下,如果你可以设置一个转接器内独立点击监听器,那么你必须把它放在onBindView类

相关问题