2017-02-24 19 views
0

我檢查瞭如何製作可單擊的RecyclerView的各種示例,並創建一個每行左側有一個圖標並且兩個文本標籤彼此堆疊在右側的示例,但我可以只有點擊圖標纔會觸發點擊處理程序。我希望能夠點擊行中的任何位置。我在這段代碼中做了什麼錯誤?只有recycleview單元格中的圖標是可點擊的

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v7.widget.RecyclerView android:id="@+id/record_list" 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_marginLeft="16dp" 
    android:layout_marginRight="16dp" 
    android:clickable="true" 
    app:layoutManager="LinearLayoutManager" 
    tools:listitem="@layout/list_content"/> 

<!-- list content --> 
<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:clickable="true" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content"> 
    <ImageView 
     android:id="@+id/icon" 
     android:layout_width="30dp" 
     android:layout_height="30dp" 
     android:src="@drawable/ic_icon"/> 
    <TextView 
     android:id="@+id/desc" 
     style="?android:attr/textAppearanceMedium" 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     android:layout_toEndOf="@id/icon" 
     android:layout_toRightOf="@id/icon" 
     android:layout_alignParentEnd="true" 
     android:layout_alignParentRight="true" 
     android:padding="0dp" 
     android:textIsSelectable="true"/> 
    <TextView 
     android:id="@+id/user_type" 
     style="?android:attr/textAppearanceSmall" 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     android:layout_toEndOf="@id/icon" 
     android:layout_toRightOf="@id/icon" 
     android:layout_below="@id/desc" 
     android:layout_alignParentEnd="true" 
     android:layout_alignParentRight="true" 
     android:padding="0dp" 
     android:textIsSelectable="true" 
     android:textStyle="italic"/> 
</RelativeLayout> 

    public class SimpleItemRecyclerViewAdapter 
      extends RecyclerView.Adapter<SimpleItemRecyclerViewAdapter.ViewHolder> { 

     private final List<Record> mValues; 

     public SimpleItemRecyclerViewAdapter(List<Record> items) { 
      mValues = items; 
     } 

     @Override 
     public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
      View view = LayoutInflater.from(parent.getContext()) 
        .inflate(R.layout.list_content, parent, false); 
      return new ViewHolder(view); 
     } 


     @Override 
     public void onBindViewHolder(final ViewHolder holder, final int position) { 
      Record record = mValues.get(position); 
      holder.mIcon.setImageResource(record.iconRes); 
      holder.mDescText.setText(record.desc); 
      holder.mDetailText.setText(record.detail); 
      holder.itemView.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        Context context = v.getContext(); 
        Intent intent = new Intent(context, DetailActivity.class); 
        context.startActivity(intent); 
       } 
      }); 
     } 

     public class ViewHolder extends RecyclerView.ViewHolder { 
      public final ImageView mIcon; 
      public final TextView mDescText; 
      public final TextView mDetailText; 

      public ViewHolder(View view) { 
       super(view); 
       mIcon = (ImageView)view.findViewById(R.id.icon); 
       mDescText = (TextView) view.findViewById(R.id.desc); 
       mDetailText = (TextView) view.findViewById(R.id.detail); 
      } 
     } 
} 

修訂

當我點擊在行,我看到logcat的記錄下面

I/ViewRootImpl: ViewRoot's Touch Event : ACTION_DOWN 
I/ViewRootImpl: ViewRoot's Touch Event : ACTION_UP 

等都以線條的東西是響應,但它不是ItemView控件和ItemView控件具有沒有父母。

回答

1

嘗試處理列表內容的根元素的點擊事件。 你的情況是RelativeLayout。

您的列表內容如下。

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:id="@+id/rootLay" 
android:layout_width="match_parent" 
android:layout_height="wrap_content" 
android:clickable="true"> 

<ImageView 
    android:id="@+id/icon" 
    android:layout_width="30dp" 
    android:layout_height="30dp" 
    android:src="@drawable/ic_icon" /> 

<TextView 
    android:id="@+id/desc" 
    style="?android:attr/textAppearanceMedium" 
    android:layout_width="0dp" 
    android:layout_height="wrap_content" 
    android:layout_alignParentEnd="true" 
    android:layout_alignParentRight="true" 
    android:layout_toEndOf="@id/icon" 
    android:layout_toRightOf="@id/icon" 
    android:padding="0dp" 
    android:textIsSelectable="true" /> 

<TextView 
    android:id="@+id/user_type" 
    style="?android:attr/textAppearanceSmall" 
    android:layout_width="0dp" 
    android:layout_height="wrap_content" 
    android:layout_alignParentEnd="true" 
    android:layout_alignParentRight="true" 
    android:layout_below="@id/desc" 
    android:layout_toEndOf="@id/icon" 
    android:layout_toRightOf="@id/icon" 
    android:padding="0dp" 
    android:textIsSelectable="true" 
    android:textStyle="italic" /> 
</RelativeLayout> 

和適配器文件將如下所示。

public class SimpleItemRecyclerViewAdapter 
     extends RecyclerView.Adapter<SimpleItemRecyclerViewAdapter.ViewHolder> { 

    private final List<Record> mValues; 

    public SimpleItemRecyclerViewAdapter(List<Record> items) { 
     mValues = items; 
    } 

    @Override 
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View view = LayoutInflater.from(parent.getContext()) 
       .inflate(R.layout.list_content, parent, false); 
     return new ViewHolder(view); 
    } 


    @Override 
    public void onBindViewHolder(final ViewHolder holder, final int position) { 
     Record record = mValues.get(position); 
     holder.mIcon.setImageResource(record.iconRes); 
     holder.mDescText.setText(record.desc); 
     holder.mDetailText.setText(record.detail); 
     /*holder.itemView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Context context = v.getContext(); 
       Intent intent = new Intent(context, DetailActivity.class); 
       context.startActivity(intent); 
      } 
     });*/ 

     holder.mRootLay.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Context context = v.getContext(); 
       Intent intent = new Intent(context, DetailActivity.class); 
       context.startActivity(intent); 
      } 
     }); 
    } 

    public class ViewHolder extends RecyclerView.ViewHolder { 
     public final ImageView mIcon; 
     public final TextView mDescText; 
     public final TextView mDetailText; 
     public final RelativeLayout mRootLay; 

     public ViewHolder(View view) { 
      super(view); 
      mIcon = (ImageView)view.findViewById(R.id.icon); 
      mDescText = (TextView) view.findViewById(R.id.desc); 
      mDetailText = (TextView) view.findViewById(R.id.detail); 
      mRootLay = (RelativeLayout) view.findViewById(R.id.rootLay); 
     } 
    } 
}         
+0

您是否嘗試過實施recyclerviewItem點擊事件? –

+0

選中此鏈接。 http://sapandiwakar.in/recycler-view-item-click-handler/ –

+0

@AmitThakkar物品點擊處理程序的作品!從本質上講,我們需要聽取來自回收者視圖的觸摸事件! –

0

嘗試此,

<RelativeLayout 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:tools="http://schemas.android.com/tools" 
     android:clickable="true" 
     android:id="@+id/rel_main" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content"> 
     <ImageView 
      android:id="@+id/icon" 
      android:layout_width="30dp" 
      android:layout_height="30dp" 
      android:src="@drawable/ic_icon"/> 
      . 
      . 
      . 
     </RelativeLayout> 

在適配器

 public class ViewHolder extends RecyclerView.ViewHolder { 
     public final ImageView mIcon; 
     public final TextView mDescText; 
     public final TextView mDetailText; 
     public final RelativeLayout rel_main; 

     public ViewHolder(View view) { 
      super(view); 
      mIcon = (ImageView)view.findViewById(R.id.icon); 
      mDescText = (TextView) view.findViewById(R.id.desc); 
      mDetailText = (TextView) view.findViewById(R.id.detail); 
      rel_main = (RelativeLayout) view.findViewById(R.id.rel_main); 
     } 
    } 

     holder.rel_main.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Context context = v.getContext(); 
       Intent intent = new Intent(context, DetailActivity.class); 
       context.startActivity(intent); 
      } 
     }); 
0

實現此代碼

public class RecyclerItemClickListener implements RecyclerView.OnItemTouchListener { 

public interface OnItemClickListener { 
    void onItemClick(View view, int position); 
    void onItemLongClick(View view, int position); 
} 

private OnItemClickListener mListener; 
private 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 childView = recyclerView.findChildViewUnder(e.getX(), e.getY()); 

      if (childView != null && mListener != null) { 
       mListener.onItemLongClick(childView, recyclerView.getChildPosition(childView)); 
      } 
     } 
    }); 
} 

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

@Override 
public void onTouchEvent(RecyclerView view, MotionEvent motionEvent) { 
} 

@Override 
public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) { 

} 

}

設置此監聽器Recylerview

recylerView.addOnItemTouchListener(new RecyclerItemClickListener(YourActivity.this, 
       recylerView, new RecyclerItemClickListener.OnItemClickListener() { 
      @Override 
      public void onItemClick(View view, int position) { 

      //Do your changes here 

      } 

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

      } 
     })); 

希望這將幫助!

相關問題