2015-12-13 30 views
2

我想測試RecyclerViewsetOnClickListener,但它不起作用,有什麼問題?爲什麼RecyclerView的setOnClickListener不生效?

片段:

public class CrimeListFragment extends Fragment { 
private RecyclerView mRecyclerView; 

@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    final View view = inflater.inflate(R.layout.fragment_crime_list, container, false); 
    mRecyclerView = (RecyclerView) view.findViewById(R.id.crime_list_view); 
    mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); 
    mRecyclerView.setAdapter(new CrimeAdapter(CrimeLab.get(getActivity()).getCrimes())); 
    mRecyclerView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Toast.makeText(getActivity(), "test", Toast.LENGTH_LONG).show(); 
      Log.d("CrimeListFragment", "test"); 
     } 
    }); 
    return view; 
} 

private class CrimeViewHolder extends RecyclerView.ViewHolder { 
    private TextView mTitleTextView; 

    public CrimeViewHolder(View itemView) { 
     super(itemView); 
    } 

} 

private class CrimeAdapter extends RecyclerView.Adapter { 
    private List<Crime> mCrimes; 


    public CrimeAdapter(List<Crime> crimes) { 
     this.mCrimes = crimes; 
    } 

    @Override 
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     final LayoutInflater inflater = LayoutInflater.from(getActivity()); 
     final View view = inflater.inflate(R.layout.list_item_crime, parent, false); 
     return new CrimeViewHolder(view); 
    } 

    @Override 
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
    } 

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

}

片段佈局的xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:orientation="vertical"> 

    <android.support.v7.widget.RecyclerView 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:id="@+id/crime_list_view"></android.support.v7.widget.RecyclerView> 
</LinearLayout> 

的充氣佈局的xml:通過啓動活動不

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent"> 
    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/list_item_crime_title" 
     android:layout_alignParentLeft="true" 
     android:textStyle="bold" 
     android:padding="4dp" 
     android:text="Title"/> 

</RelativeLayout> 
+0

你甚至填充你的recyclerView提到? –

+0

是的,我複製更多的代碼。 – shaoyihe

回答

0

測試它吐司,我有Ë同樣的問題yasterday ID沒有采取效應,烤麪包,但與真正的工作工作

+0

我不這麼認爲,它沒有影響調試斷點,調試信息,吐司。 – shaoyihe

+0

即時通訊也是這樣,但多數民衆贊成什麼都不開玩笑 – H4F

0

您可以創建自己的類,它實現RecyclerView.OnItemTouchListener處理OnClickListner

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

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

如何使用:

RecyclerView mRecyclerView = view.findViewById(R.id.crime_list_view); 
    mRecyclerView.addOnItemTouchListener(
     new RecyclerItemClickListener(context, new RecyclerItemClickListener.OnItemClickListener() { 
      @Override public void onItemClick(View view, int position) { 
      // you can handle here 
      Toast.makeText(getActivity(), "test", Toast.LENGTH_LONG).show(); 
      Log.d("CrimeListFragment", "test"); 

      } 
     }) 
    ); 
+0

我知道你的意思。其實我正在看'Android Programming The Big Nerd Ranch Guide 2nd Edition'這本書,它給'CrimeAdapter#onCreateViewHolder'上的點擊監聽,它工作正常。但爲什麼整個'RecyclerView'不能響應'View.OnClickListener',因爲它是一個'ViewGroup'? – shaoyihe

0

RecyclerView不響應setOnClickListener

我已更新您的適配器,它將用於g ET的recyclerView

private class CrimeAdapter extends RecyclerView.Adapter<CrimeAdapter.ViewHolder> { 
    private List<Crime> mCrimes; 


    public CrimeAdapter(List<Crime> crimes) { 
     this.mCrimes = crimes; 
    } 

    @Override 
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     final LayoutInflater inflater = LayoutInflater.from(getActivity()); 
     final View view = inflater.inflate(R.layout.list_item_crime, parent, false); 
     ViewHolder viewHolder = new ViewHolder(view); 
    return viewHolder; 
    } 

    @Override 
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
holder.place_TextView.setText("" + mCrimes.get(position).getTheStringValueYouWant()); 
    } 

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

public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 

    TextView place_TextView; 

    public ViewHolder(View itemView) { 
     super(itemView); 
     place_TextView = (TextView) itemView.findViewById(R.id.list_item_crime_title); 
     place_TextView.setOnClickListener(this); 
    } 

    @Override 
    public void onClick(View v) { 
     Toast.makeText(getActivity(), "test", Toast.LENGTH_LONG).show(); 
    } 
} 
} 

OnClick事件的點擊事件不是在RecyclerView我們在ListView使用同樣的事情。

隨着自定義列表視圖的尺寸視圖和動畫越來越多,Google試圖讓手掌更具靈活性。

進一步的事情你可以做的就是點擊事件在以下 後 OnItemClickListener in RecyclerView

相關問題