問題來源:
我們的android適配器中,常常會在item中嵌套一層RecycleView,比如這樣...
但是,當我們設置整塊區域的點擊事件之後,RecycleView的區域(及圓形logo區域)並不響應點擊事件...
代碼是這樣的:
xml的代碼:
<LinearLayout
android:id="@+id/ll_item"
android:layout_width="match_parent"
android:layout_height="60dp"
android:orientation="vertical"
>
<android.support.v7.widget.RecyclerView
android:id="@+id/rlv_item"
android:layout_width="match_parent"
android:layout_height="30dp"/>
</LinearLayout>
adapter中的代碼:
public class RecycleViewAdapter extends RecyclerView.Adapter<RecycleViewAdapter.VH> {
private Context context;
public RecycleViewAdapter(Context context){
this.context = context;
}
@Override
public VH onCreateViewHolder(ViewGroup parent, int viewType) {
return new VH(LayoutInflater.from(context).inflate(R.layout.layout_item,null));
}
@Override
public void onBindViewHolder(VH holder, final int position) {
holder.ll_item.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(context,"點擊了第"+(position+1)+"個",Toast.LENGTH_SHORT).show();
}
});
}
@Override
public int getItemCount() {
return 5;
}
static class VH extends RecyclerView.ViewHolder{
private LinearLayout ll_item;
private RecyclerView rlv_item;
public VH(View itemView) {
super(itemView);
ll_item = (LinearLayout) itemView.findViewById(R.id.ll_item);
rlv_item = (RecyclerView) itemView.findViewById(R.id.rlv_item);
}
}
}
在onBindViewHolder()中,我們想設置LinearLayout的點擊事件,但是RecycleView並不會執行點擊的事件...
問題解決:
其實問題是在RecycleView的onTouchEvent函數裏面,首先會調用dispatchOnItemTouch函數進行一些工作,但是當我們重寫RecycleView的onTouchListener()後,在RecycleView分發點擊事情之前會調用我們添加的OnItemTouchListener對象,所以我們可以這樣做...
@Override
public void onBindViewHolder(final VH holder, final int position) {
holder.ll_item.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(context,"點擊了第"+(position+1)+"個",Toast.LENGTH_SHORT).show();
}
});
holder.rlv_item.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return holder.ll_item.onTouchEvent(event);
}
});
}
ok,問題暫時得到了解決,整塊區域都可以被點擊,並響應點擊事件,遇到這個問題的小夥伴也可以試試這個方法...