มีใครใช้วิธีRecyclerView
พบการตั้งค่าonClickListener
รายการในRecyclerView
? ฉันคิดว่าการตั้งค่าผู้ฟังให้กับแต่ละเลย์เอาท์ของแต่ละรายการ แต่ดูเหมือนจะยุ่งยากมากเกินไปฉันแน่ใจว่ามีวิธีที่RecyclerView
จะฟังonClick
เหตุการณ์ แต่ฉันคิดไม่ออกเลย
มีใครใช้วิธีRecyclerView
พบการตั้งค่าonClickListener
รายการในRecyclerView
? ฉันคิดว่าการตั้งค่าผู้ฟังให้กับแต่ละเลย์เอาท์ของแต่ละรายการ แต่ดูเหมือนจะยุ่งยากมากเกินไปฉันแน่ใจว่ามีวิธีที่RecyclerView
จะฟังonClick
เหตุการณ์ แต่ฉันคิดไม่ออกเลย
คำตอบ:
เนื่องจาก API มีการเปลี่ยนแปลงอย่างรุนแรงมันจะไม่แปลกใจถ้าคุณจะสร้างOnClickListener
สำหรับแต่ละรายการ มันไม่ได้เป็นเรื่องยุ่งยากมากนัก ในการดำเนินการของRecyclerView.Adapter<MyViewHolder>
คุณคุณควรจะมี:
private final OnClickListener mOnClickListener = new MyOnClickListener();
@Override
public MyViewHolder onCreateViewHolder(final ViewGroup parent, final int viewType) {
View view = LayoutInflater.from(mContext).inflate(R.layout.myview, parent, false);
view.setOnClickListener(mOnClickListener);
return new MyViewHolder(view);
}
onClick
วิธีการ:
@Override
public void onClick(final View view) {
int itemPosition = mRecyclerView.getChildLayoutPosition(view);
String item = mList.get(itemPosition);
Toast.makeText(mContext, item, Toast.LENGTH_LONG).show();
}
onClick()
เป็นของOnClickListener
สามารถแนบไปกับมุมมองใดก็ได้ คำถามทั้งหมดที่นี่คือที่! โปรดใช้ความพยายามไม่เพียง แต่จะระบุชื่อด้วยวิธีการเท่านั้น แต่อย่างน้อยต้องมีชั้นเรียนด้วย หากคุณไม่ได้บอกว่ารหัสของคุณจะถูกเพิ่มลงในอะแดปเตอร์คำตอบของคุณไม่ได้ช่วยจริงๆ
นี่คืองานที่ดีและน้อยทางคู่แน่นที่จะใช้สำหรับ OnClickListener
RecyclerView
ตัวอย่างการใช้งาน:
RecyclerView recyclerView = findViewById(R.id.recycler);
recyclerView.addOnItemTouchListener(
new RecyclerItemClickListener(context, recyclerView ,new RecyclerItemClickListener.OnItemClickListener() {
@Override public void onItemClick(View view, int position) {
// do whatever
}
@Override public void onLongItemClick(View view, int position) {
// do whatever
}
})
);
RecyclerItemClickListener
การดำเนินงาน:
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);
public void onLongItemClick(View view, int position);
}
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 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){}
}
ฉันทำอย่างนี้โดยไม่ต้องเรียนเกินควรตรวจจับ ฯลฯ รหัสง่าย ๆ ในอะแดปเตอร์ของเรา ทางออกที่ดีโดยเฉพาะอย่างยิ่งสำหรับ longClick นำเสนอก่อนหน้านี้
public class PasswordAdapter extends RecyclerView.Adapter<PasswordAdapter.ViewHolder> {
private static ClickListener clickListener;
public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener {
TextView name;
public ViewHolder(View itemView) {
super(itemView);
itemView.setOnClickListener(this);
itemView.setOnLongClickListener(this);
name = (TextView) itemView.findViewById(R.id.card_name);
}
@Override
public void onClick(View v) {
clickListener.onItemClick(getAdapterPosition(), v);
}
@Override
public boolean onLongClick(View v) {
clickListener.onItemLongClick(getAdapterPosition(), v);
return false;
}
}
public void setOnItemClickListener(ClickListener clickListener) {
PasswordAdapter.clickListener = clickListener;
}
public interface ClickListener {
void onItemClick(int position, View v);
void onItemLongClick(int position, View v);
}
}
จากนั้นในส่วนหรือกิจกรรมเพียงแค่กด:
PasswordAdapter mAdapter = ...;
mAdapter.setOnItemClickListener(new PasswordAdapter.ClickListener() {
@Override
public void onItemClick(int position, View v) {
Log.d(TAG, "onItemClick position: " + position);
}
@Override
public void onItemLongClick(int position, View v) {
Log.d(TAG, "onItemLongClick pos = " + position);
}
});
ตรวจสอบที่คล้ายกันคำถาม @ CommonsWare ของความคิดเห็นลิงก์ไปนี้ซึ่งจะใช้งานอินเตอร์เฟซในOnClickListener
viewHolder
นี่คือตัวอย่างง่ายๆของViewHolder
:
TextView textView;//declare global with in adapter class
public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
private ViewHolder(View itemView) {
super(itemView);
itemView.setOnClickListener(this);
textView = (TextView)view.findViewById(android.R.id.text1);
}
@Override
public void onClick(View view) {
Toast.makeText(view.getContext(), "position = " + getLayoutPosition(), Toast.LENGTH_SHORT).show();
//go through each item if you have few items within recycler view
if(getLayoutPosition()==0){
//Do whatever you want here
}else if(getLayoutPosition()==1){
//Do whatever you want here
}else if(getLayoutPosition()==2){
}else if(getLayoutPosition()==3){
}else if(getLayoutPosition()==4){
}else if(getLayoutPosition()==5){
}
//or you can use For loop if you have long list of items. Use its length or size of the list as
for(int i = 0; i<exampleList.size(); i++){
}
}
}
Adapter
แล้วมีลักษณะเช่นนี้
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view =LayoutInflater.from(parent.getContext()).inflate(android.R.layout.simple_list_item_1, parent, false);
return new ViewHolder(view);
}
ListView
อยู่แล้วมีปัญหาถ้าคุณมีการสร้างรายการของวัตถุที่มีความซับซ้อนมากขึ้นกว่าเพียงแถวที่เรียบง่าย ถ้าคุณต้องการจัดการเหตุการณ์ต่าง ๆ ขึ้นอยู่กับว่าคุณคลิกที่รายการใดใน ListView คุณเมาแล้ว ที่นี่คุณมีผู้ฟังแต่ละคน
getPosition()
เลิกใช้getAdapterPosition()
หรือgetLayoutPosition()
แทนที่
จากคำตอบของ Jacob Tabak (+1 สำหรับเขา) ฉันสามารถเพิ่มผู้ฟัง LongClick:
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 {
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.getChildAdapterPosition(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.getChildAdapterPosition(childView));
}
return false;
}
@Override
public void onTouchEvent(RecyclerView view, MotionEvent motionEvent) {
}
@Override
public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
}
}
จากนั้นคุณสามารถใช้สิ่งนี้:
recyclerView.addOnItemTouchListener(new RecyclerItemClickListener(getActivity(), recyclerView, new RecyclerItemClickListener.OnItemClickListener() {
@Override
public void onItemClick(View view, int position) {
// ...
}
@Override
public void onItemLongClick(View view, int position) {
// ...
}
}));
public void onRequestDisallowInterceptTouchEvent (boolean disallowIntercept){}
view.getId() == R.id.selection
นี่คือสิ่งที่ได้ผลสำหรับฉัน แนบไปOnClickListener
onBindView
ฉันไม่รู้จริงๆว่าสิ่งนี้จะส่งผลกระทบต่อประสิทธิภาพหรือไม่ แต่ดูเหมือนว่าจะทำงานได้ดีเมื่อใช้รหัสน้อย
public void onBindViewHolder(ViewHolder holder, final int position) {
holder.view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(context, "Recycle Click" + position, Toast.LENGTH_SHORT).show();
}
});
}
นี่เป็นเรื่องยากสำหรับฉันที่จะมีผู้ฟังรายการคลิกในกิจกรรมและยังมีผู้ฟังคลิกสำหรับมุมมองเดียวของรายการที่จะไม่เรียกผู้ฟังรายการคลิก หลังจากเล่นกับคำตอบของ Jacob Tabak ฉันเคารพคำตอบของเขาในการคลิกไอเท็มหากไม่มีการดำเนินการสัมผัสอื่น ๆ ภายในไอเท็ม
ฉันมีประเพณี OnClickListener
อินเทอร์เฟซที่มีในรายการคลิกเหตุการณ์ซึ่งเก็บมุมมองของรายการที่ถูกคลิกและตำแหน่งรายการจากอะแดปเตอร์ ฉันนำเสนออินสแตนซ์ของมันในตัวสร้าง (หรืออาจเป็นกับ setter) และแนบไปที่ฟังดูคลิกฟังคอนเทนเนอร์
ฉันยังมีฟังคลิกอื่น ๆ ในอะแดปเตอร์ (สามารถอยู่ในมุมมองผู้ถือ) ซึ่งจะจัดการคลิกดูปัจจุบันจากภาชนะ
public class MyRecyclerAdapter extends RecyclerView.Adapter<MyViewHolder> {
private ArrayList<String> mData;
private OnItemClickListener mOnItemClickListener;
public interface OnItemClickListener {
public void onItemClick(View view, int position);
}
public MyRecyclerAdapter(ArrayList<String> itemsData,
OnItemClickListener onItemClickListener) {
mOnItemClickListener = onItemClickListener;
this.mData = itemsData;
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent,
int viewType) {
View layoutView = LayoutInflater.from(mContext).inflate(
R.layout.list_item, parent, false);
final MyViewHolder viewHolder = new MyViewHolder(layoutView);
viewHolder.container.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
mOnItemClickListener.onItemClick(v, viewHolder.getAdapterPosition());
}
});
viewHоlder.button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//do button click work here with
// mData.get( viewHolder.getAdapterPosition() );
}
});
return viewHolder;
}
@Override
public int getItemCount() {
return mData.size();
}}
ในกิจกรรมที่คุณต้องเริ่มต้นอะแดปเตอร์โดยผ่านอินสแตนซ์ของ OnItemClickListener
public class FeedActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);
.....
MyRecyclerAdapter adapter = new MyRecyclerAdapter(new ArrayList<String>(), new OnItemClickListener() {
@Override
public void onItemClick(View view, int position) {
///list item was clicked
}
});
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setAdapter(mFeedsAdapter);
}
และ ViewHolder ของฉัน
public class MyViewHolder extends RecyclerView.ViewHolder {
public Button button;
public View container;
public MyViewHolder(View itemLayoutView) {
super(itemLayoutView);
container = itemLayoutView;
button = (Button) itemLayoutView.findViewById(R.id.button);
}}
นี่คือสิ่งที่ฉันต้องการในกรณีที่มีคนพบว่ามีประโยชน์:
public static class ViewHolder extends RecyclerView.ViewHolder {
public ViewHolder(View item) {
super(item);
item.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Log.d("RecyclerView", "onClick:" + getAdapterPosition());
}
});
}
}
ที่มา: http://blog.csdn.net/jwzhangjie/article/details/36868515
ผมมีทางออกที่ดีสำหรับRecyclerView
's onItemClickListener
สำหรับรายการและไอเทมย่อย
ขั้นตอนที่ 1-สร้างอินเทอร์เฟซ
public interface OnRecyclerViewItemClickListener
{
/**
* Called when any item with in recyclerview or any item with in item
* clicked
*
* @param position
* The position of the item
* @param id
* The id of the view which is clicked with in the item or
* -1 if the item itself clicked
*/
public void onRecyclerViewItemClicked(int position, int id);
}
ขั้นตอนที่ 2-จากนั้นใช้ในonBindViewHolder
วิธีของอะแดปเตอร์ด้วยวิธีต่อไปนี้
/**
* Custom created method for Setting the item click listener for the items and items with in items
* @param listener OnRecyclerViewItemClickListener
*/
public void setOnItemClickListener(OnRecyclerViewItemClickListener listener)
{
this.listener = listener;
}
@Override
public void onBindViewHolder(ViewHolder viewHolder, final int position)
{
// viewHolder.albumBg.setBackgroundResource(_itemData[position]
// .getImageUrl());
viewHolder.albumName.setText(arrayList.get(position).getName());
viewHolder.artistName.setText(arrayList.get(position).getArtistName());
String imgUrl = arrayList.get(position).getThumbImageUrl();
makeImageRequest(imgUrl, viewHolder);
viewHolder.parentView.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
listener.onRecyclerViewItemClicked(position, -1);
}
});
viewHolder.settingButton.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
listener.onRecyclerViewItemClicked(position, v.getId());
}
});
}
// class to hold a reference to each item of RecyclerView
public static class ViewHolder extends RecyclerView.ViewHolder
{
public TextView albumName, artistName;
public ImageView albumIcon, settingButton;
public LinearLayout parentView;
public ViewHolder(View itemLayoutView)
{
super(itemLayoutView);
// albumBg = (LinearLayout) itemLayoutView
// .findViewById(R.id.albumDlbg);
albumName = (TextView) itemLayoutView.findViewById(R.id.albumName);
artistName = (TextView) itemLayoutView
.findViewById(R.id.artistName);
albumIcon = (ImageView) itemLayoutView.findViewById(R.id.albumIcon);
parentView = (LinearLayout) itemLayoutView
.findViewById(R.id.albumDlbg);
settingButton = (ImageView) itemLayoutView
.findViewById(R.id.settingBtn);
}
}
ขั้นตอนที่ 3ค้นหาและตั้งค่ามุมมองรีไซเคิลในกิจกรรมหรือส่วนที่คุณใช้งานอยู่
recyclerView = (RecyclerView) rootview.findViewById(R.id.vmtopsongs);
lm = new LinearLayoutManager(mActivity);
lm.setOrientation(LinearLayoutManager.VERTICAL);
recyclerView.setLayoutManager(lm);
recyclerView.addItemDecoration(
new HorizontalDividerItemDecoration.Builder(getActivity())
.paint(Utils.getPaint()).build());
PopularSongsadapter mAdapter = new PopularSongsadapter(gallery,
mActivity, true);
// set adapter
recyclerView.setAdapter(mAdapter);
mAdapter.setOnItemClickListener(this);
// set item animator to DefaultAnimator
recyclerView.setItemAnimator(new DefaultItemAnimator());
ขั้นตอนที่ 4 -ใช้อินเทอร์เฟซในกิจกรรมหรือส่วนที่คุณใช้ recyclerview
@Override
public void onRecyclerViewItemClicked(int position, int id)
{
if(id==-1){
Toast.makeText(mActivity, "complete item clicked", Toast.LENGTH_LONG).show();
}else{
Toast.makeText(mActivity, "setting button clicked", Toast.LENGTH_LONG).show();
}
}
นี่คือสิ่งที่ฉันทำ โซลูชันนี้รองรับทั้ง onClick และ onLongClick ทั้งใน RecyclerView Items และ Views ภายใน RecyclerView Items (มุมมองภายใน)
ฉันติดแท็กมุมมองผู้จัดวางบนมุมมองที่ฉันเลือก:
public RecyclerViewAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_item, null);
ViewHolder viewHolder = new ViewHolder(itemView);
itemView.setOnClickListener( this);
itemView.setOnLongClickListener(this);
viewHolder.imageIV.setOnClickListener(this);
viewHolder.imageIV.setOnLongClickListener(this);
viewHolder.imageIV.setTag(viewHolder);
itemView.setTag(viewHolder);
return viewHolder;
}
และฉันใช้ holder.getPosition () เพื่อดึงตำแหน่งใน onClick () วิธี (onLongClick คล้าย):
public void onClick(View view) {
ViewHolder holder = (ViewHolder) view.getTag();
int position = holder.getPosition();
if (view.getId() == holder.imageIV.getId()){
Toast.makeText(context, "imageIV onClick at" + position, Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(context, "RecyclerView Item onClick at " + position, Toast.LENGTH_SHORT).show();
}
}
ตัวแปรที่มี getChildPosition ก็สามารถใช้ได้เช่นกัน โปรดทราบว่าสำหรับมุมมองภายในใช้ onClick ():
int position = recyclerView.getChildPosition((View)view.getParent());
ในใจของฉันข้อได้เปรียบของการแก้ปัญหานี้คือเมื่อคลิกที่รูปเพียงฟังรูปเท่านั้นที่เรียกว่า onclick () ในขณะที่เมื่อฉันรวมโซลูชันของ Jacob สำหรับมุมมองรายการ RecyclerView และโซลูชันของฉันสำหรับมุมมองภายในมุมมอง RecyclerView Item onclick ( ) เรียกอีกอย่างว่า (เมื่อคลิกที่ภาพ)
มีวิธีที่ง่ายกว่ามากในการทำเช่นนี้ เพียงใช้กับการคลิกในonBindViewHolder
มุมมองราก
พิจารณาว่านี่เป็นมุมมองของคุณสำหรับอะแดปเตอร์
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:card_view="http://schemas.android.com/apk/res-auto"
android:id="@+id/linearlayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/textview"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="1dp"
android:textSize="15sp" />
</LinearLayout>
จากนั้นทำตามในอะแดปเตอร์ของคุณ
//get the layout and make view holder
@Override
public RVAdapter.ViewHolder1 onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.adapter_layout, null);
ViewHolder1 viewHolder = new ViewHolder1(view);
return viewHolder;
}
@Override
public void onBindViewHolder(RVAdapter.ViewHolder1 holder, int position) {
//apply on click on your root view
holder.linearlayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//Do on click stuff
}
});
}
//make references to views in layout including root view
public class ViewHolder1 extends RecyclerView.ViewHolder {
protected LinearLayout linearlayout = null
protected TextView textview = null;
public CareerLinksViewHolder(View itemView) {
super(itemView);
this.linearlayout = (LinearLayout) itemView.findViewById(R.id.linearlayout);
this.tvCompName = (TextView) itemView.findViewById(R.id.textview);
}
}
คุณสามารถผ่านไปclickListener
Adapter
ในActivity
:
private View.OnClickListener mItemClick = new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = null;
int position = list.getChildPosition(v);
switch (position) {
case 0:
intent = new Intent(MainActivity.this, LeakCanaryActivity.class);
break;
case 1:
intent = new Intent(MainActivity.this, ButterKnifeFragmentActivity.class);
break;
}
if (intent != null) {
MainActivity.this.startActivity(intent);
}
}
};
จากนั้นส่งไปที่Adapter
:
MainAdapter mainAdapter = new MainAdapter(this, mItemClick);
ในAdapter
's onCreateViewHolder
:
@Override
public MainAdapter.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int position) {
View itemView = activity.getLayoutInflater().inflate(R.layout.main_adapter_item, viewGroup, false);
ViewHolder holder = new ViewHolder(itemView);
itemView.setOnClickListener(mItemClick);
return holder;
}
holder
ค่าผ่านความตั้งใจได้อย่างไร
ฉันได้พัฒนาไลบรารี่แบบเบาสำหรับ Android คุณสามารถเยี่ยมชมได้ https://github.com/ChathuraHettiarachchi/RecycleClick
และติดตามตัวอย่างต่อไปนี้
RecycleClick.addTo(YOUR_RECYCLEVIEW).setOnItemClickListener(new RecycleClick.OnItemClickListener() {
@Override
public void onItemClicked(RecyclerView recyclerView, int position, View v) {
// YOUR CODE
}
});
คุณสามารถใช้ OnClickListener กับคลาส ViewHolder ของคุณ
public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
public Item item
@InjectView(R.id.tv_title)
public TextView tvTitle;
@InjectView(R.id.rl_row)
public RelativeLayout rlRow;
public ViewHolder(View v) {
super(v);
ButterKnife.inject(this, v);
v.setOnClickListener(this);
}
@Override
public void onClick(View view) {
Log.e("item title",item.getTitle());
}
}
และ onBindViewHolder ตั้งค่ารายการมุมมองของคุณ
public void onBindViewHolder(ViewHolder holder, int position) {
holder.tvTitle.setText(objects.get(position).getTitle());
holder.item = objects.get(position);
}
วิธีง่ายเกินไปและมีประสิทธิภาพ
แทนที่จะใช้อินเทอร์เฟซView.OnClickListener
ภายในตัวยึดมุมมองหรือการสร้างและอินเทอร์เฟซและการใช้อินเทอร์เฟซในกิจกรรมของคุณ - ฉันใช้รหัสนี้เพื่อง่าย ๆ ในOnClickListener
การใช้งาน
public static class SimpleStringRecyclerViewAdapter
extends RecyclerView.Adapter<SimpleStringRecyclerViewAdapter.ViewHolder> {
// Your initializations goes here...
private List<String> mValues;
public static class ViewHolder extends RecyclerView.ViewHolder {
//create a variable mView
public final View mView;
/*All your row widgets goes here
public final ImageView mImageView;
public final TextView mTextView;*/
public ViewHolder(View view) {
super(view);
//Initialize it here
mView = view;
/* your row widgets initializations goes here
mImageView = (ImageView) view.findViewById(R.id.avatar);
mTextView = (TextView) view.findViewById(android.R.id.text1);*/
}
}
public String getValueAt(int position) {
return mValues.get(position);
}
public SimpleStringRecyclerViewAdapter(Context context, List<String> items) {
mBackground = mTypedValue.resourceId;
mValues = items;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.list_item, parent, false);
view.setBackgroundResource(mBackground);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(final ViewHolder holder, int position) {
holder.mBoundString = mValues.get(position);
holder.mTextView.setText(mValues.get(position));
//Here it is simply write onItemClick listener here
holder.mView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Context context = v.getContext();
Intent intent = new Intent(context, ExampleActivity.class);
context.startActivity(intent);
}
});
}
@Override
public int getItemCount() {
return mValues.size();
}
}
คำตอบที่โพสต์ทั้งหมดเป็นวิธีแก้ปัญหาที่ยอดเยี่ยมอย่างไรก็ตามหากคุณไม่ต้องการจัดการกับรายละเอียดการติดตั้งที่มากเกินไปและเพียงต้องการให้มันทำงานคล้ายกับที่ ListView ทำฉันจะแนะนำให้ใช้ TwoWay-View ดังที่เห็นที่นี่:
https://github.com/lucasr/twoway-view
โปรดทราบว่าการใช้งานนี้ยังสนับสนุนการกดแบบยาวในรายการรวมถึงการสนับสนุนสำหรับสถานะแบบกด (ซึ่งเป็นสิ่งสำคัญที่โซลูชันอื่น ๆ สำหรับคำถามนี้ขาด)
หากคุณไม่ต้องการใช้ทั้งไลบรารีลองดูที่คลาสClickItemTouchListenerซึ่งสามารถใช้เป็นแบบสแตนด์อโลนได้หากจำเป็น ปัญหาเดียวที่ฉันพบในขณะนี้คือด้วยการกดแบบยาว + การเลื่อนดูเหมือนว่าจะมีพฤติกรรมที่ไม่ถูกต้อง
ถ้าคุณต้องการที่จะจับเหตุการณ์การคลิกในแต่ละรายการจากนั้นนำไปใช้OnClickListener
ในViewHolder
ชั้นเรียนแล้วตั้งค่าฟังคลิกในมุมมองของแต่ละบุคคลหรือทั้งหมดitemView
การเรียนและการตั้งค่าแล้วคลิกฟังในมุมมองของแต่ละบุคคลหรือทั้งหมด
ตัวอย่างต่อไปนี้แสดงให้เห็นเหมือนกัน
public class ContactViewHolder extends RecyclerView.ViewHolder implements OnClickListener
{
TextView txt_title,txt_name,txt_email;
public ContactViewHolder(View itemView)
{
super(itemView);
txt_title = (TextView)itemView.findViewById(R.id.txt_title);
txt_name = (TextView)itemView.findViewById(R.id.txt_name);
txt_email = (TextView)itemView.findViewById(R.id.txt_email);
txt_name.setOnClickListener(this);
txt_email.setOnClickListener(this);
itemView.setOnClickListener(this);
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if(v == itemView)
{
Toast.makeText(RecyclerDemoActivity.this, "Visiting Card Clicked is ==>"+txt_name.getText(), Toast.LENGTH_SHORT).show();
}
if(v == txt_name)
{
Toast.makeText(RecyclerDemoActivity.this, "Name ==>"+txt_name.getText(), Toast.LENGTH_SHORT).show();
}
if(v == txt_email)
{
Toast.makeText(RecyclerDemoActivity.this, "Email ==>"+txt_email.getText(), Toast.LENGTH_SHORT).show();
}
}
}
}
สำหรับฉันนี่เป็นวิธีที่ดีที่สุด:
class YourRecyclerAdapter extends RecyclerView.Adapter<ContactViewHolder> implements View.OnClickListener {
...
@Override
public void onClick(View view) {
int itemPosition = vRecycle.getChildPosition(view);
//And use itemPosition to get the item from your collection. This way you dont restrain the ViewHolder with a OnClick callback
}
...
}
RecyclerView
ไม่ได้OnClickListener
และจะต้องใช้มันเอง
ผมชอบที่จะเพิ่มOnItemClickListener
อินเตอร์เฟซในAdapter
ที่มีวิธีการเรียกเมื่อคุณคลิกที่มุมมองรายการจากonClick
ViewHolder
ดังนั้นความรับผิดชอบในการจัดการการคลิกที่รายการนั้นอยู่นอกViewHolder
และAdapter
และกิจกรรมหรือส่วนที่จะตัดสินใจว่าจะทำอย่างไร
เพิ่มส่วนต่อประสานกับผู้ฟังและวัตถุผู้ฟัง
public class ItemsAdapter extends RecyclerView.Adapter<ItemsAdapter.ViewHolder> {
...
private static OnItemClickListener onItemClickListener;
...
public static interface OnItemClickListener {
public void onItemClick(View view, int position);
}
...
}
เราจับภาพการคลิกของมุมมองรูทของรายการและเมื่อการเรียกกลับถูกเรียกใช้onClick
ฟังอะแดปเตอร์
public class ItemsAdapter extends RecyclerView.Adapter<ItemsAdapter.ViewHolder> {
...
private static OnItemClickListener onItemClickListener;
...
public static interface OnItemClickListener {
public void onItemClick(View view, int position);
}
...
public static class ViewHolder extends RecyclerView.ViewHolder {
public ImageView imageView;
public ViewHolder(View itemRootView) {
super(itemRootView);
imageView = (ImageView) itemRootView.findViewById(R.id.itemImage);
itemRootView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
int position = ViewHolder.super.getAdapterPosition();
onItemClickListener.onItemClick(view,position);
}
});
}
}
}
เนื่องจากกิจกรรมหรือส่วนย่อยส่วนในกรณีของเราเรากำหนดผู้ฟังให้กับอะแดปเตอร์และการเรียกกลับ onClick เราจะได้รับรายการที่เลือกตามตำแหน่งและเปิดกิจกรรมรายละเอียดของรายการ
public class ItemsFragment extends Fragment {
...
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
...
((ItemsAdapter) adapter).setOnItemClickListener(new ItemsAdapter.OnItemClickListener() {
@Override
public void onItemClick(View view, int position) {
//Do something when an item has been clicked
}
});
...
}
...
}
แต่น่าเสียดายที่RecyclerView
จะหายไปคู่ของคุณสมบัติที่ListView
มีในตัว ตัวอย่างเช่นความสามารถในการเพิ่มOnItemClickListener
ทริกเกอร์ที่เมื่อมีการคลิกรายการ
RecyclerView
ช่วยให้คุณสามารถตั้งค่าOnClickListener
ในอะแดปเตอร์ของคุณ แต่ผ่านการฟังการคลิกที่จากรหัสโทรของคุณไปยังอะแดปเตอร์และไปที่ViewHolder
มีความซับซ้อนสำหรับการจับคลิกรายการที่เรียบง่าย
public class ItemClickSupport {
private final RecyclerView mRecyclerView;
private OnItemClickListener mOnItemClickListener;
private OnItemLongClickListener mOnItemLongClickListener;
private View.OnClickListener mOnClickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mOnItemClickListener != null) {
RecyclerView.ViewHolder holder = mRecyclerView.getChildViewHolder(v);
mOnItemClickListener.onItemClicked(mRecyclerView, holder.getAdapterPosition(), v);
}
}
};
private View.OnLongClickListener mOnLongClickListener = new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
if (mOnItemLongClickListener != null) {
RecyclerView.ViewHolder holder = mRecyclerView.getChildViewHolder(v);
return mOnItemLongClickListener.onItemLongClicked(mRecyclerView, holder.getAdapterPosition(), v);
}
return false;
}
};
private RecyclerView.OnChildAttachStateChangeListener mAttachListener
= new RecyclerView.OnChildAttachStateChangeListener() {
@Override
public void onChildViewAttachedToWindow(View view) {
if (mOnItemClickListener != null) {
view.setOnClickListener(mOnClickListener);
}
if (mOnItemLongClickListener != null) {
view.setOnLongClickListener(mOnLongClickListener);
}
}
@Override
public void onChildViewDetachedFromWindow(View view) {
}
};
private ItemClickSupport(RecyclerView recyclerView) {
mRecyclerView = recyclerView;
mRecyclerView.setTag(R.id.item_click_support, this);
mRecyclerView.addOnChildAttachStateChangeListener(mAttachListener);
}
public static ItemClickSupport addTo(RecyclerView view) {
ItemClickSupport support = (ItemClickSupport) view.getTag(R.id.item_click_support);
if (support == null) {
support = new ItemClickSupport(view);
}
return support;
}
public static ItemClickSupport removeFrom(RecyclerView view) {
ItemClickSupport support = (ItemClickSupport) view.getTag(R.id.item_click_support);
if (support != null) {
support.detach(view);
}
return support;
}
public ItemClickSupport setOnItemClickListener(OnItemClickListener listener) {
mOnItemClickListener = listener;
return this;
}
public ItemClickSupport setOnItemLongClickListener(OnItemLongClickListener listener) {
mOnItemLongClickListener = listener;
return this;
}
private void detach(RecyclerView view) {
view.removeOnChildAttachStateChangeListener(mAttachListener);
view.setTag(R.id.item_click_support, null);
}
public interface OnItemClickListener {
void onItemClicked(RecyclerView recyclerView, int position, View v);
}
public interface OnItemLongClickListener {
boolean onItemLongClicked(RecyclerView recyclerView, int position, View v);
}
}
คุณต้องกำหนดR.id.item_click_support
โดยใช้ ids.xml:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<item name="item_click_support" type="id" />
</resources>
ขณะนี้ผู้ฟังการคลิกรหัสที่เป็นผลลัพธ์มีลักษณะดังนี้:
ItemClickSupport.addTo(mRecyclerView).setOnItemClickListener(new ItemClickSupport.OnItemClickListener() {
@Override
public void onItemClicked(RecyclerView recyclerView, int position, View v) {
// do it
}
});
สำหรับคำอธิบายโดยย่อเกี่ยวกับการคลิกที่ recyclerview โปรดดูที่littlerobots_blog
คุณสามารถกำหนดsetOnClickListenerในคลาส ViewHolder ของคุณได้อย่างง่ายดายดังนี้:
public class ViewHolder extends RecyclerView.ViewHolder {
TextView product_name;
ViewHolder(View itemView) {
super(itemView);
product_name = (TextView) itemView.findViewById(R.id.product_name);
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
int itemPosition = getLayoutPosition();
Toast.makeText(getApplicationContext(), itemPosition + ":" + String.valueOf(product_name.getText()), Toast.LENGTH_SHORT).show();
}
});
}
}
นี่คือสิ่งที่ฉันทำอ่านเพิ่มเติมและดาวน์โหลดส่วนสำคัญที่นี่
เพิ่มเหมือนกันที่นี่
CustomItemClickListener.java
public interface CustomItemClickListener {
public void onItemClick(View v, int position);
}
ItemsListAdapter.java
public class ItemsListAdapter extends RecyclerView.Adapter<ItemsListAdapter.ViewHolder> {
ArrayList<ItemListSingleItem> data;
Context mContext;
CustomItemClickListener listener;
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View mView = LayoutInflater.from(parent.getContext()).inflate(R.layout.items_list_single_item, parent, false);
final ViewHolder mViewHolder = new ViewHolder(mView);
mView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
listener.onItemClick(v, mViewHolder.getAdapterPosition());
}
});
return mViewHolder;
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
holder.itemTitle.setText(Html.fromHtml(data.get(position).getTitle()));
if (!TextUtils.isEmpty(data.get(position).getThumbnailURL())) {
// I Love picasso library :) http://square.github.io/picasso/
Picasso.with(mContext).load(data.get(position).getThumbnailURL()).error(R.drawable.ic_no_image).
placeholder(R.drawable.ic_no_image).
transform(new RoundedCornersTransformation(5, 0)).
into(holder.thumbnailImage);
} else {
holder.thumbnailImage.setImageResource(R.drawable.ic_no_image);
}
}
@Override
public int getItemCount() {
return data.size();
}
public ItemsListAdapter(Context mContext, ArrayList<ItemsListSingleItem> data, CustomItemClickListener listener) {
this.data = data;
this.mContext = mContext;
this.listener = listener;
}
public static class ViewHolder extends RecyclerView.ViewHolder {
public TextView itemTitle;
public ImageView thumbnailImage;
ViewHolder(View v) {
super(v);
itemTitle = (TextView) v
.findViewById(R.id.post_title);
thumbnailImage = (ImageView) v.findViewById(R.id.post_thumb_image);
}
}
}
จากคำตอบส่วนใหญ่ข้างต้นดูเหมือนว่าพวกเขากำลังตั้งค่าตัวเลือกผู้ประกาศในรายการแต่ละรายการ อย่างไรก็ตามการแก้ปัญหาที่ฉันกำลังจะนำเสนอนั้นง่ายมาก แต่ก็ไม่ง่ายนักสำหรับหลาย ๆ คน หลายคนลืมว่าส่วนประกอบอื่น ๆ มักจะอยู่ในองค์ประกอบหลักที่ใช้ในการแสดงรายการในมุมมองรายการหรือรีไซเคิล วิธีการแก้ปัญหานี้เป็นเพียงเกี่ยวกับการตั้งค่าฟังเดียวคลิกเพื่อดูผู้ปกครองนี้และเปิดเล่น การแก้ปัญหายังรวมถึงวิธีการส่งผ่านตำแหน่งของรายการที่ถูกคลิกจากรายการหรือมุมมองรีไซเคิล ที่นี่รูทวิวหลักของเราคือ CardView จากห้องสมุดสนับสนุน android นี่คือตัวอย่างรหัส
public class ListAdapter extends RecyclerView.Adapter<ListAdapter.ViewHolder> {
public static final String LOG_TAG = ListAdapter.class.getSimpleName();
private Cursor mDataset;
private Context mContext;
private ViewHolder mViewHolder;
// Provide a suitable constructor (depends on the kind of dataset)
public ListAdapter(Context context, Cursor Dataset) {
mDataset = Dataset;
mContext = context;
}
// Create new views (invoked by the layout manager)
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
// create a new view
View v = LayoutInflater.from(parent.getContext())
.inflate(R.layout.list_business_view, parent, false);
mViewHolder = new ViewHolder(v);
return mViewHolder;
}
public void setData(Cursor newdata) {
this.mDataset = newdata;
}
// Replace the contents of a view (invoked by the layout manager)
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
//Bind data to other items here. To save time, i have ommited that.
//here is where we attach a click listerner for an item in the recycler list rather than for each element of a given item.
holder.card.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(mContext, " Just cliked item at position " + itemPosition, Toast.LENGTH_LONG).show();
}
});
}
}
// Return the size of your dataset (invoked by the layout manager)
@Override
public int getItemCount() {
if (null != mDataset) {
return mDataset.getCount();
}
return 0;
}
// Provide a reference to the views for each data item
// Complex data items may need more than one view per item, and
// you provide access to all the views for a data item in a view holder
public static class ViewHolder extends RecyclerView.ViewHolder{
// each data item is just a string in this case
public final TextView mBusinesssName; // View for the business name
public final TextView mBusinessCategory; //View for the category name
public final ImageView businessImage; // View for the business category image Image
public final TextView mBusinessDistance; // View for the distance
public final CardView card;
public ViewHolder(View view) {
super(view);
mBusinesssName = (TextView) view.findViewById(R.id.list_item_name_textview);
mBusinessCategory = (TextView) view.findViewById(R.id.list_item_category_textview);
mBusinessDistance = (TextView) view.findViewById(R.id.list_item_dist_textview);
businessImage = (ImageView) view.findViewById(R.id.list_item_icon);
card = (CardView) view.findViewById(R.id.card_view);
}
}
}
การใช้ Kotlin ใน คำตอบของ nhaarman :
mRecyclerView.addOnItemTouchListener(object : RecyclerItemClickListener(this, mRecyclerView,object :RecyclerItemClickListener.OnItemClickListener{
override fun onItemClick(view: View, position: Int) {
}
override fun onLongItemClick(view: View?, position: Int) {
}
}){})
RecyclerItemClickListener.java:
import android.content.Context
import android.support.v7.widget.RecyclerView
import android.view.GestureDetector
import android.view.MotionEvent
import android.view.View
open class RecyclerItemClickListener(context: Context, recyclerView: RecyclerView, private val mListener: OnItemClickListener?) : RecyclerView.OnItemTouchListener {
private var mGestureDetector: GestureDetector
interface OnItemClickListener {
fun onItemClick(view: View, position: Int)
fun onLongItemClick(view: View?, position: Int)
}
init {
mGestureDetector = GestureDetector(context, object : GestureDetector.SimpleOnGestureListener() {
override fun onSingleTapUp(e: MotionEvent): Boolean {
return true
}
override fun onLongPress(e: MotionEvent) {
val child = recyclerView.findChildViewUnder(e.x, e.y)
if (child != null && mListener != null) {
mListener.onLongItemClick(child, recyclerView.getChildAdapterPosition(child))
}
}
})
}
override fun onInterceptTouchEvent(view: RecyclerView, e: MotionEvent): Boolean {
val childView = view.findChildViewUnder(e.x, e.y)
if (childView != null && mListener != null && mGestureDetector.onTouchEvent(e)) {
mListener.onItemClick(childView, view.getChildAdapterPosition(childView))
return true
}
return false
}
override fun onTouchEvent(view: RecyclerView, motionEvent: MotionEvent) {}
override fun onRequestDisallowInterceptTouchEvent(disallowIntercept: Boolean) {}
}
public class MyViewHolder extends RecyclerView.ViewHolder {
public TextView title, year, genre;
public MyViewHolder(View view) {
super(view);
title = (TextView) view.findViewById(R.id.title);
genre = (TextView) view.findViewById(R.id.genre);
year = (TextView) view.findViewById(R.id.year);
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(context, ""+getAdapterPosition(), Toast.LENGTH_SHORT).show();
}
});
}
}
นี่คือรหัสที่สมบูรณ์สำหรับอะแดปเตอร์ที่กำหนดเองของฉันรหัสนี้จะขยายแถวด้วยรายการที่กำหนดไว้ในไฟล์ xml ชื่อ "list_item" มันจะทำการคลิกเหตุการณ์ในแถวรายการทั้งหมดที่มีตำแหน่งตามลำดับ
public class MyCustomAdapter extends RecyclerView.Adapter`<`AdapterMyCustomAdapter.ViewHolder> {
public static class ViewHolder extends RecyclerView.ViewHolder implements OnClickListener {
public onItemClickListener mListener;
public ViewHolder(View v, onItemClickListener listener) {
super(v);
mListener =listener;
v.setOnClickListener(this);
}
@Override
public void onClick(View v) {
mListener.onRecyclerItemClick(v, getPosition());
}
public static interface onItemClickListener {
public void onRecyclerItemClick(View view , int position);
}
}
@Override
public int getItemCount() {
return 5;
}
@Override
public void onBindViewHolder(ViewHolder holder, int pos) {
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int position) {
View v = LayoutInflater.from(parent.getContext())
.inflate(R.layout.list_item, parent, false);
/* here list_item is an xml file we want to inflate ...it is same as we do in case of listview for customization.*/
MyCustomAdapter.ViewHolder vh = new ViewHolder(v, new MyCustomAdapter.ViewHolder.onItemClickListener() {
@Override
public void onRecyclerItemClick(View view, int position) {
System.out.println("clicked on list item at position " +position);
}
});
return vh;
}
}
เราสามารถทำได้โดยใช้การอ้างอิงที่อ่อนแอของ Java ความหมายผู้ถือมุมมองเป็นผู้ที่ควรตอบสนองต่อเหตุการณ์คลิกหรือมอบหมายให้ผู้ตอบกลับถูกต้อง
เป้าหมายของเรา:
ขั้นตอน:
สร้างอินเทอร์เฟซเพื่อจัดการการตอบสนองการคลิก
ใช้อินเทอร์เฟซนี้ในกิจกรรมที่จะจัดการการคลิก
เพิ่มตัวแปรสมาชิกใน RecyclerView Adaptor เพื่อเก็บ Weak Reference และ Constructor ที่ตั้งค่าไว้
ทำเช่นเดียวกันใน RecyclerView ViewHolder และเพิ่มตัวแปรสมาชิกเพื่อติดตามตำแหน่ง
ตั้งค่าให้ผู้ฟังคลิกของคุณในมุมมองใด ๆ ที่คุณต้องการใน ViewHolder จากนั้นโทรกลับไปที่ผู้ตอบคำถามเพื่อจัดการกับพวกเขา
เปลี่ยนเมธอด onBindViewHolder ของคุณเพื่อตั้งค่าตำแหน่งเมื่อเชื่อมโยง
ส่งผู้ตอบกลับไปที่ ViewHolder
ในการตอบกลับตอนนี้คุณสามารถใช้ getId () บนมุมมองเพื่อกำหนดว่ามุมมองใดถูกคลิก
และนี่คือส่วนสำคัญเพื่อให้คุณเห็นว่าทุกอย่างลงตัวเข้าด้วยกันได้อย่างไร: RecyclerViewView handling handling
ฉันรู้ว่ามีคำตอบมากมาย แต่ฉันคิดว่าฉันอาจให้การใช้งานของฉันเช่นกัน (รายละเอียดทั้งหมดสามารถพบได้ในคำถามอื่นที่ฉันตอบ )
ดังนั้นเพื่อเพิ่มฟังคลิกภายในของคุณระดับความต้องการที่จะดำเนินการViewHolder
View.OnClickListener
นี้เป็นเพราะคุณจะตั้งค่าOnClickListener
ให้กับitemView
พารามิเตอร์ของViewHolder
คอนสตรัค 's ให้ฉันแสดงสิ่งที่ฉันหมายถึง:
public class ExampleClickViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
TextView text1, text2;
ExampleClickViewHolder(View itemView) {
super(itemView);
// we do this because we want to check when an item has been clicked:
itemView.setOnClickListener(this);
// now, like before, we assign our View variables
title = (TextView) itemView.findViewById(R.id.text1);
subtitle = (TextView) itemView.findViewById(R.id.text2);
}
@Override
public void onClick(View v) {
// The user may not set a click listener for list items, in which case our listener
// will be null, so we need to check for this
if (mOnEntryClickListener != null) {
mOnEntryClickListener.onEntryClick(v, getLayoutPosition());
}
}
}
สิ่งอื่น ๆ ที่คุณต้องเพิ่มเท่านั้นคือส่วนต่อประสานที่กำหนดเองสำหรับคุณ Adapter
และตัวตั้งค่า:
private OnEntryClickListener mOnEntryClickListener;
public interface OnEntryClickListener {
void onEntryClick(View view, int position);
}
public void setOnEntryClickListener(OnEntryClickListener onEntryClickListener) {
mOnEntryClickListener = onEntryClickListener;
}
ดังนั้นการสนับสนุนคลิกใหม่ของคุณ Adapter
เสร็จสมบูรณ์
ตอนนี้มาใช้มันกันเถอะ ...
ExampleClickAdapter clickAdapter = new ExampleClickAdapter(yourObjects);
clickAdapter.setOnEntryClickListener(new ExampleClickAdapter.OnEntryClickListener() {
@Override
public void onEntryClick(View view, int position) {
// stuff that will happen when a list item is clicked
}
});
มันเป็นวิธีการที่คุณจะตั้งค่าปกติ Adapter
อย่างไรยกเว้นว่าคุณใช้วิธีการตั้งค่าที่คุณสร้างขึ้นเพื่อควบคุมสิ่งที่คุณจะทำเมื่อผู้ใช้คลิกรายการบางรายการ
นอกจากนี้คุณยังสามารถดูชุดตัวอย่างที่ฉันทำกับ Gist นี้ใน GitHub:
https://gist.github.com/FarbodSalamat-Zadeh/7646564f48ee708c1582c013e1de4f07
นี่คือสิ่งที่ฉันทำเพื่อนำมาใช้ใหม่ OnClickListener
public class TestAdapter extends RecyclerView.Adapter<TestAdapter.MyviewHolder>
implements View.OnClickListener
ใน ViewHoder ใช้พาเรนต์ของการเลย์เอาต์รายการ
public class MyviewHolder extends RecyclerView.ViewHolder {
LinearLayout linearLayout_item;
public MyviewHolder(View itemView) {
super(itemView);
linearLayout_item=itemView.findViewById(R.id.linearLayout_item);
}
}
ในแท็กชุด onBindViewHolder เป็นตำแหน่ง
@Override
public void onBindViewHolder(MyviewHolder holder, int position) {
holder.linearLayout_item.setTag(position);
holder.linearLayout_item.setOnClickListener(this);
}
และใน Onclick
@Override
public void onClick(View v) {
int position = (int) v.getTag();
switch (v.getId()) {
case R.id.linearLayout_item:
// do some thing with position
break;
}
}
สำหรับฉันวิธีที่สะอาดในการทำเช่นนี้คือ
ตัวสร้างอะแดปเตอร์
private class EnvironmentTypeRecyclerViewAdapter extends RecyclerView.Adapter<EnvironmentTypeRecyclerViewAdapter.ViewHolder>
{
private final EnvironmentTypeRecyclerViewAdapterListener mEnvironmentTypeRecyclerViewAdapterListener;
private List<Environment> mEnvironmentsData;
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener
{
public ViewHolder(View v)
{
super(v);
v.setOnClickListener(this);
}
@Override
public void onClick(View v)
{
Environment environment = mEnvironmentsData.get(getAdapterPosition());
if (mEnvironmentTypeRecyclerViewAdapterListener != null && environment != null) {
mEnvironmentTypeRecyclerViewAdapterListener.onListItemSelected(environment);
}
}
public EnvironmentTypeRecyclerViewAdapter(List<SmallCellEnvironment> environments, EnvironmentTypeRecyclerViewAdapterListener environmentTypeRecyclerViewAdapterListener)
{
mEnvironmentTypeRecyclerViewAdapterListener = environmentTypeRecyclerViewAdapterListener;
mEnvironmentsData = environments;
}
}
อินเทอร์เฟซที่เชื่อมโยง
private interface EnvironmentTypeRecyclerViewAdapterListener
{
void onListItemSelected(Environment environment);
}