2017-09-27 109 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類

相關問題