รับรายการที่คลิกและตำแหน่งใน RecyclerView


106

ฉันกำลังแทนที่ของฉันListViewกับRecyclerViewรายการแสดง ok แต่ผมอยากจะทราบวิธีการรับรายการคลิกและตำแหน่งของมันคล้ายกับวิธีการที่เราใช้ในOnItemClickListener.onItemClick(AdapterView parent, View v, int position, long id)ListView

ขอบคุณสำหรับไอเดีย!


1
ตรวจสอบบทช่วย
Bikesh M


วิธีที่ง่ายที่สุดสำหรับฉัน: CustomSelectionCallback
ATES

คำตอบ:


177

ตามลิงค์: ทำไม RecyclerView ถึงไม่มี onItemClickListener ()? และ RecyclerView แตกต่างจาก Listview อย่างไร? และแนวคิดทั่วไปของ @ Duncan ฉันให้คำตอบที่นี่:

  • กำหนดหนึ่งอินเทอร์เฟซRecyclerViewClickListenerสำหรับการส่งข้อความจากอะแด็ปเตอร์ไปยังActivity/ Fragment:

    public interface RecyclerViewClickListener {
        public void recyclerViewListClicked(View v, int position);
    }
    
  • ในActivity/ Fragmentใช้งานอินเทอร์เฟซและส่งฟังไปยังอะแดปเตอร์:

    @Override
    public void recyclerViewListClicked(View v, int position){... ...}
    
    //set up adapter and pass clicked listener this
    myAdapter = new MyRecyclerViewAdapter(context, this);
    
  • ในAdapterและViewHolder:

    public class MyRecyclerViewAdapter extends RecyclerView.Adapter<MyRecyclerViewAdapter.ItemViewHolder> {
       ... ... 
       private Context context;
       private static RecyclerViewClickListener itemListener;
    
    
       public MyRecyclerViewAdapter(Context context, RecyclerViewClickListener itemListener) {
           this.context = context;
           this.itemListener = itemListener;
           ... ...
       }
    
    
       //ViewHolder class implement OnClickListener, 
       //set clicklistener to itemView and, 
       //send message back to Activity/Fragment 
       public static class ItemViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
           ... ...
           public ItemViewHolder(View convertView) {
               super(convertView);
               ... ...
               convertView.setOnClickListener(this);
           }
    
           @Override
           public void onClick(View v) {
               itemListener.recyclerViewListClicked(v, this.getPosition());     
    
           }
       }
    }
    

หลังจากทดสอบแล้วก็ใช้งานได้ดี


[ อัปเดต ]

เนื่องจาก API 22 RecyclerView.ViewHoler.getPosition()เลิกใช้งานแล้วจึงใช้getLayoutPosition().


22
ใช้เมธอด getLayoutPosition () เนื่องจาก getPosition () เลิกใช้แล้ว
Ankur Chaudhary

2
ขอบคุณสำหรับโค้ดชิ้นนี้ :) เพียงเคล็ดลับเดียว: อ้างอิงสแตprivate static RecyclerViewClickListener itemListener;ติกแบบคงที่ในคอนสตรัคเตอร์
David Artmann

1
@khurramengr onBindViewHolderฉันสิ้นสุดขึ้นการเพิ่มฟังในแต่ละรายการในวิธีการ นอกจากนี้รายการของฉันไม่สามารถคลิกได้ทั้งหมด (เป็นเพียงบางส่วนของรายการ)
Ferran Negre

1
คุณไม่ควรใช้ WeakReference ที่นี่: new MyRecyclerViewAdapter(context, this)? อาจทำให้หน่วยความจำรั่ว
RamwiseMatt

2
public void recyclerViewListClicked(View v, int position);ตัวปรับเปลี่ยนpublicซ้ำซ้อนสำหรับวิธีการเชื่อมต่อ
Joel Raju

36
public class MyRvAdapter extends RecyclerView.Adapter<MyRvAdapter.MyViewHolder>{
    public Context context;
    public ArrayList<RvDataItem> dataItems;

    ...
    constructor
    overrides
    ...

    class MyViewHolder extends RecyclerView.ViewHolder{
        public TextView textView;
        public Context context;

        public MyViewHolder(View itemView, Context context) {
            super(itemView);

            this.context = context;

            this.textView = (TextView)itemView.findViewById(R.id.textView);

            // on item click
            itemView.setOnClickListener(new View.OnClickListener(){
                @Override
                public void onClick(View v) {
                    // get position
                    int pos = getAdapterPosition();

                    // check if item still exists
                    if(pos != RecyclerView.NO_POSITION){
                        RvDataItem clickedDataItem = dataItems.get(pos);
                        Toast.makeText(v.getContext(), "You clicked " + clickedDataItem.getName(), Toast.LENGTH_SHORT).show();
                    }
                }
            });
        }
    }
}

4
ขอบคุณ. getAdapterPosition () คือสิ่งที่ฉันต้องการ
Ayaz Alifov

1
ขอบคุณสำหรับคนรหัส !! บันทึกวันของฉัน ฉันไม่แน่ใจว่าจะวาง getAdapterPosition () ไว้ที่ไหนและทำตามรหัสของคุณฉันทำให้มันใช้งานได้ ... ดีและง่าย :)
Vinay Vissh

ขอบคุณเพื่อนมากรหัสของคุณคือฉันต้องการสิ่งนั้น! Happy man
Naveen Nirban Yadav

13

นี่คือตัวอย่างการตั้งค่า Listener การคลิก

Adapter extends  RecyclerView.Adapter<MessageAdapter.MessageViewHolder> {  ...  }

 public static class MessageViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        public TextView     tv_msg;
        public TextView     tv_date;
        public TextView     tv_sendTime;
        public ImageView    sharedFile;
        public ProgressBar sendingProgressBar;

        public MessageViewHolder(View v) {
            super(v);
            tv_msg =  (TextView) v.findViewById(R.id.tv_msg);
            tv_date = (TextView)  v.findViewById(R.id.tv_date);
            tv_sendTime = (TextView)  v.findViewById(R.id.tv_sendTime);
            sendingProgressBar = (ProgressBar) v.findViewById(R.id.sendingProgressBar);
            sharedFile = (ImageView) v.findViewById(R.id.sharedFile);

            sharedFile.setOnClickListener(this);

        }

        @Override
        public void onClick(View view) {
        int position  =   getAdapterPosition();


            switch (view.getId()){
                case R.id.sharedFile:


                    Log.w("", "Selected"+position);


                    break;
            }
        }

    }

getAdapterPostion () คืออะไร ที่นี่?
TheDevMan

1
ตำแหน่งของมุมมองที่คลิก ไม่ใช่วิธีการที่กำหนดเอง
Gilberto Ibarra

ดูเหมือนว่าจะเป็นวิธีที่สะอาดที่สุดโดยเฉพาะอย่างยิ่งเมื่อคุณสนใจที่จะรับข้อมูลโดยใช้ตำแหน่งและอาจไม่มีสิทธิ์เข้าถึงวัตถุ RecyclerView
FrostRocket

ขอบคุณมากสำหรับint position = getAdapterPosition();
Shylendra Madda

โปรดทราบว่าการเรียก getAdapterPosition ในขณะที่รายการกำลังอัปเดตเช่นเนื่องจากการโทร notififyXYZ จะส่งกลับ -1
David

11

ใส่รหัสนี้ที่คุณกำหนดมุมมองผู้รีไซเคิลในกิจกรรม

    rv_list.addOnItemTouchListener(
            new RecyclerItemClickListener(activity, new RecyclerItemClickListener.OnItemClickListener() {
                @Override
                public void onItemClick(View v, int position) {

                    Toast.makeText(activity, "" + position, Toast.LENGTH_SHORT).show();
                }
            })
    );

จากนั้นสร้างคลาสแยกจากนั้นใส่รหัสนี้:

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.getChildAdapterPosition(childView));
        }
        return false;
    }

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

    @Override
    public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {

    }
}

8

สร้างไฟล์ java ด้วยรหัสด้านล่าง

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.getChildLayoutPosition(childView));
        return true;
    }
    return false;
}

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

@Override
public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {

}

และใช้ฟังบนวัตถุ RecyclerView ของคุณ

recyclerView.addOnItemTouchListener(  
new RecyclerItemClickListener(context, new RecyclerItemClickListener.OnItemClickListener() {
  @Override public void onItemClick(View view, int position) {
    // TODO Handle item click
  }
}));

RecyclerItemClickListenerไม่ใช่คลาสเริ่มต้นของ Android คุณควรจัดเตรียมไลบรารีที่คุณใช้หรือคลาสนั้นเอง
Greg

@ เกร็กขอบคุณ !! ฉันลืมโพสต์!
MazRoid

5

หากคุณต้องการ Click event of recycle-View จาก activity / fragment แทน adapter คุณสามารถใช้ทางลัดต่อไปนี้

recyclerView.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                final TextView txtStatusChange = (TextView)v.findViewById(R.id.txt_key_status);
                txtStatusChange.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Log.e(TAG, "hello text " + txtStatusChange.getText().toString() + " TAG " + txtStatusChange.getTag().toString());
                        Util.showToast(CampaignLiveActivity.this,"hello");
                    }
                });
                return false;
            }
        });

คุณยังสามารถใช้วิธีอื่น ๆ ที่ยาวนานเช่นการใช้อินเทอร์เฟซ


,, สวัสดี แต่ถ้าเราต้องได้รับตำแหน่งของรายการที่คลิกด้วย เหรอ?
mfaisalhyder

คุณสามารถกำหนดตำแหน่งของรายการใน TAG ผ่านอะแดปเตอร์จากนั้นรับแท็กตามที่กล่าวไว้ข้างต้น txtStatusChange.getTag () toString ()
Amandeep Rohila

@AmandeepRohila เพื่อให้โค้ดทำงานได้ฉันต้องเลื่อนไปที่จุดสิ้นสุดของมุมมองรีไซเคิลแนวนอนก่อน แค่นั้นขนมปังก็ใช้ได้ ไม่มีวิธีทำให้มันใช้งานได้โดยไม่ต้องเลื่อนไปมาก่อนหรือ?
iOSAndroidWindowsMobileAppsDev

4
recyclerViewObject.addOnItemTouchListener(
    new RecyclerItemClickListener(
        getContext(),
        recyclerViewObject,
        new RecyclerItemClickListener.OnItemClickListener() {
            @Override public void onItemClick(View view, int position) {
                // view is the clicked view (the one you wanted
                // position is its position in the adapter
            }
            @Override public void onLongItemClick(View view, int position) {
            }
        }
    )
);

นี่คือเวทมนตร์อะไร? ทำงานได้อย่างสมบูรณ์
Bolling

2

ใช้รหัสด้านล่าง: -

public class SergejAdapter extends RecyclerView.Adapter<SergejAdapter.MyViewHolder>{

...

class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{


    @Override
    public void onClick(View v) {
        // here you use position
        int position = getAdapterPosition();
        ...

    }
}
}

1

RecyclerView ไม่มีวิธีการดังกล่าว

ในการจัดการเหตุการณ์การคลิกบน RecyclerView ฉันลงเอยด้วยการใช้ onClickListener ในอะแดปเตอร์ของฉันเมื่อผูก ViewHolder: ใน ViewHolder ของฉันฉันเก็บข้อมูลอ้างอิงไปยังมุมมองรูท (อย่างที่คุณสามารถทำได้กับ ImageViews, TextViews ฯลฯ ... ) และเมื่อเชื่อมโยง viewHolder ฉันตั้งค่าแท็กด้วยข้อมูลที่ฉันต้องการเพื่อจัดการกับการคลิก (เช่นตำแหน่ง) และรายการคลิก


3
ใช่เราสามารถตั้งค่าฟังคลิกใน ViewHolder ได้ แต่ฉันต้องการส่งคืนมุมมองรายการที่คลิกและตำแหน่งไปยังส่วนของฉันเพื่อดำเนินการต่อไป
Xcihnegn

1

นี่คือวิธีที่ง่ายและสะดวกที่สุดในการค้นหาตำแหน่งของรายการที่คลิก:

ฉันก็ประสบปัญหาเดียวกัน

ฉันต้องการค้นหาตำแหน่งของรายการที่คลิก / เลือกของ RecyclerView () และดำเนินการบางอย่างกับรายการนั้น ๆ

getAdapterPosition () วิธีการทำงานเหมือนเสน่ห์สำหรับสิ่งเหล่านี้ ฉันพบวิธีนี้หลังจากค้นคว้ามาทั้งวันและหลังจากลองใช้วิธีอื่น ๆ อีกมากมาย

int position = getAdapterPosition();
Toast.makeText(this, "Position is: "+position, Toast.LENGTH_SHORT).show();

คุณไม่ต้องใช้วิธีเสริมใด ๆ เพียงสร้างตัวแปรโกลบอลชื่อ 'ตำแหน่ง' และเริ่มต้นด้วย getAdapterPosition () ในเมธอดหลัก ๆ ของอะแด็ปเตอร์ (คลาสหรือที่คล้ายกัน)

นี่คือเอกสารโดยย่อจากลิงค์นี้

getAdapterPosition ที่เพิ่มในเวอร์ชัน 22.1.0 int getAdapterPosition () ส่งคืนตำแหน่งอะแดปเตอร์ของรายการที่แสดงโดย ViewHolder นี้ โปรดทราบว่าสิ่งนี้อาจแตกต่างจาก getLayoutPosition () หากมีการอัปเดตอะแด็ปเตอร์ที่รอดำเนินการ แต่ยังไม่มีการส่งผ่านเค้าโครงใหม่ RecyclerView ไม่จัดการการอัปเดตอะแด็ปเตอร์ใด ๆ จนกว่าจะมีการส่งผ่านโครงร่างถัดไป สิ่งนี้อาจสร้างความไม่สอดคล้องกันชั่วคราวระหว่างสิ่งที่ผู้ใช้เห็นบนหน้าจอและเนื้อหาของอะแดปเตอร์ที่มี ความไม่สอดคล้องกันนี้ไม่สำคัญเนื่องจากจะน้อยกว่า 16ms แต่อาจเป็นปัญหาหากคุณต้องการใช้ตำแหน่ง ViewHolder เพื่อเข้าถึงอะแด็ปเตอร์ บางครั้งคุณอาจต้องได้รับตำแหน่งอะแดปเตอร์ที่แน่นอนเพื่อดำเนินการบางอย่างเพื่อตอบสนองต่อเหตุการณ์ของผู้ใช้ ในกรณีนั้นคุณควรใช้วิธีนี้ซึ่งจะคำนวณตำแหน่ง Adapter ของ ViewHolder

ยินดีที่ได้ช่วย. อย่าลังเลที่จะถามข้อสงสัย


วิธีใดที่ง่ายที่สุดและง่ายที่สุดในการรับมูลค่ารายการที่คลิกของ RecyclerView
अक्षयपरूळेकर

1

วิธีง่ายๆของฉัน

Make a position holder:

    public class PositionHolder {

    private int position;

    public PositionHolder(int position) {
        this.position = position;
    }

    public int getPosition() {
        return position;
    }

    public void setPosition(int position) {
        this.position = position;
    }
}

เพียงวางตำแหน่งหรือใส่ข้อมูลที่คุณต้องการเพื่อรับจากกิจกรรม

ตัวสร้างอะแดปเตอร์:

public ItemsAdapter(Context context, List<Item> items, PositionHolder positionHolder){
        this.context = context;
        this.items = items;
        this.positionHolder = positionHolder;
}

ในกิจกรรม:

 @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        selectedPosition = 0;

        positionHolder = new PositionHolder(selectedPosition);
        initView();
    }

ใน Adapter onClickLictener ในรายการ
ใน onBindViewHolder

holder.holderButton.setOnClickListener(v -> {
            positionHolder.setPosition(position);
            notifyDataSetChanged();
        });

ตอนนี้เมื่อใดก็ตามที่คุณเปลี่ยนตำแหน่งใน RecyclerView จะค้างไว้ใน Holder (หรืออาจเรียกว่า Listener)

ฉันหวังว่ามันจะเป็นประโยชน์

กระทู้แรกของฉัน P


0
//Create below methods into the Activity which contains RecyclerView.


private void createRecyclerView() {

final RecyclerView recyclerView = (RecyclerView)findViewById(R.id.recyclerView);
    recyclerView.setLayoutManager(new LinearLayoutManager(this));
    MyAdapter myAdapter=new MyAdapter(dataAray,MianActivity.this);
    recyclerView.setAdapter(myAdapter);
    recyclerView.setItemAnimator(new DefaultItemAnimator());

    setRecyclerViewClickListner(recyclerView);
}

private void setRecyclerViewClickListner(RecyclerView recyclerView){

    final GestureDetector gestureDetector = new GestureDetector(MainActivity.this,new GestureDetector.SimpleOnGestureListener() {
        @Override public boolean onSingleTapUp(MotionEvent e) {
            return true;
        }
    });


    recyclerView.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() {
        @Override
        public boolean onInterceptTouchEvent(RecyclerView recyclerView, MotionEvent motionEvent) {
            View child =recyclerView.findChildViewUnder(motionEvent.getX(),motionEvent.getY());
            if(child!=null && gestureDetector.onTouchEvent(motionEvent)){
               int position=recyclerView.getChildLayoutPosition(child);
                String name=itemArray.get(position).name;

            return true;
        }

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

        }

        @Override
        public void onRequestDisallowInterceptTouchEvent(boolean b) {

        }
    });
}

3
โปรดเพิ่มคำอธิบายเพียงแค่การทิ้งโค้ดโดยไม่มีการแนะนำและคำอธิบายว่าวิธีนี้แก้ไขปัญหาอย่างไรก็ไม่เป็นประโยชน์มากนัก
Mark Rotteveel

0

ลองใช้วิธีนี้

คลาสอะแดปเตอร์:

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

public interface OnItemClickListener {
    void onItemClick(ContentItem item);
}

private final List<ContentItem> items;
private final OnItemClickListener listener;

public ContentAdapter(List<ContentItem> items, OnItemClickListener listener) {
    this.items = items;
    this.listener = listener;
}

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

@Override public void onBindViewHolder(ViewHolder holder, int position) {
    holder.bind(items.get(position), listener);
}

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

static class ViewHolder extends RecyclerView.ViewHolder {

    private TextView name;
    private ImageView image;

    public ViewHolder(View itemView) {
        super(itemView);
        name = (TextView) itemView.findViewById(R.id.name);
        image = (ImageView) itemView.findViewById(R.id.image);
    }

    public void bind(final ContentItem item, final OnItemClickListener listener) {
        name.setText(item.name);
        itemView.setOnClickListener(new View.OnClickListener() {
            @Override public void onClick(View v) {
                listener.onItemClick(item);
            }
        });
    }
}

}

ในกิจกรรมหรือส่วนของคุณ:

ContentAdapter adapter = new ContentAdapter(itemList, this);

หมายเหตุ: ใช้ OnItemClickListener ตามบริบทที่คุณกำหนดในกิจกรรมหรือวิธีการแยกส่วนและวิธีการแทนที่


ทางออกที่ดีข้างต้น คุณสามารถเพิ่มด้านบนเพื่อแสดงว่าเมธอด onItemClick ควรมีลักษณะอย่างไรในกิจกรรม ฉันพยายามส่งต่อตำแหน่งของไอเทมไปยัง Intent (เพื่อเปิดกิจกรรมถัดไป) และฉันได้รับตำแหน่งที่ไม่ถูกต้อง
AJW

0

ทุกครั้งฉันใช้วิธีอื่น ผู้คนดูเหมือนจะจัดเก็บหรือได้รับตำแหน่งบนมุมมองแทนที่จะเก็บข้อมูลอ้างอิงไปยังวัตถุที่ ViewHolder แสดง

ฉันใช้วิธีนี้แทนและเก็บไว้ใน ViewHolder เมื่อเรียก onBindViewHolder () และตั้งค่าการอ้างอิงเป็น null ใน onViewRecycled ()

ทุกครั้งที่ ViewHolder มองไม่เห็นมันจะถูกรีไซเคิล ดังนั้นจึงไม่ส่งผลต่อการใช้หน่วยความจำขนาดใหญ่

@Override
public void onBindViewHolder(final ItemViewHolder holder, int position) {
    ...
    holder.displayedItem = adapterItemsList.get(i);
    ...
}

@Override
public void onViewRecycled(ItemViewHolder holder) {
    ...
    holder.displayedItem = null;
    ...
}

class ItemViewHolder extends RecyclerView.ViewHolder {
    ...
    MySuperItemObject displayedItem = null;
    ...
}

0

ส่วนขยายแบบสั้นสำหรับKotlin
Method ส่งคืนตำแหน่งที่แน่นอนของรายการทั้งหมด (ไม่ใช่ตำแหน่งของรายการที่มองเห็นได้เท่านั้น)

fun RecyclerView.getChildPositionAt(x: Float, y: Float): Int {
    return getChildAdapterPosition(findChildViewUnder(x, y))
}

และการใช้งาน

val position = recyclerView.getChildPositionAt(event.x, event.y)

0

ใช้ getLayoutPosition () ในเมธอด java อินเทอร์เฟซที่กำหนดเองของคุณ สิ่งนี้จะส่งคืนตำแหน่งที่เลือกของรายการตรวจสอบรายละเอียดทั้งหมดบน

https://becody.com/get-clicked-item-and-its-position-in-recyclerview/


1
ยินดีต้อนรับสู่ Stack Overflow! แม้ว่าลิงก์จะเป็นวิธีที่ดีในการแบ่งปันความรู้ แต่ก็ไม่สามารถตอบคำถามได้หากเกิดปัญหาในอนาคต เพิ่มคำตอบของคุณเนื้อหาสำคัญของลิงค์ที่ตอบคำถาม ในกรณีที่เนื้อหาซับซ้อนเกินไปหรือใหญ่เกินไปที่จะใส่ในที่นี้ให้อธิบายแนวคิดทั่วไปของโซลูชันที่เสนอ อย่าลืมอ้างอิงลิงค์ไปยังเว็บไซต์ของโซลูชันเดิมเสมอ ดู: ฉันจะเขียนคำตอบที่ดีได้อย่างไร?
sɐunıɔןɐqɐp

0

จากผู้ออกแบบคุณสามารถตั้งค่าonClickคุณสมบัติของ listItem เป็นวิธีการที่กำหนดด้วยพารามิเตอร์เดียว ฉันมีวิธีการตัวอย่างที่กำหนดไว้ด้านล่าง เมธอด getAdapterPosition จะให้ดัชนีของ listItem ที่เลือก

public void exampleOnClickMethod(View view){
    myRecyclerView.getChildViewHolder(view).getAdapterPosition());
}

สำหรับข้อมูลเกี่ยวกับการตั้งค่า RecyclerView โปรดดูเอกสารที่นี่: https://developer.android.com/guide/topics/ui/layout/recyclerview


0
//simply check if the adapter position you get not less than zero

holder.btnDelItem.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        if(holder.getAdapterPosition()>=0){
            list.remove(holder.getAdapterPosition());
            notifyDataSetChanged();
        }
    }
});

3
เมื่อตอบคำถามเก่าคำตอบของคุณจะมีประโยชน์มากกว่าสำหรับผู้ใช้ StackOverflow คนอื่น ๆ หากคุณรวมบริบทบางส่วนเพื่ออธิบายว่าคำตอบของคุณช่วยได้อย่างไรโดยเฉพาะสำหรับคำถามที่มีคำตอบที่ยอมรับแล้ว ดู: ฉันจะเขียนคำตอบที่ดีได้อย่างไร
David Buck

0

หลังจากการลองผิดลองถูกมากมายฉันพบว่ามีวิธีที่ง่ายมากในการทำเช่นนี้นั่นคือการสร้างอินเทอร์เฟซในคลาสอะแดปเตอร์และการใช้งานในแฟรกเมนต์ในตอนนี้ฉันได้สร้างโมเดลมุมมองภายในฟังก์ชันการแทนที่ของฉันที่มีอยู่ใน ตอนนี้คุณสามารถส่งข้อมูลจากฟังก์ชันนั้นไปยัง viemodel และจากที่นั่นได้ทุกที่

ฉันไม่รู้ว่าวิธีนี้เป็นวิธีการเข้ารหัสที่ดีหรือไม่ แต่โปรดแจ้งให้เราทราบในความคิดเห็นและหากต้องการดูแจ้งให้เราทราบในส่วนความคิดเห็นฉันจะเปิดโฟลว์สแต็กโอเวอร์เป็นประจำ


0
recyclerView.addOnItemTouchListener(object : AdapterView.OnItemClickListener,
                RecyclerView.OnItemTouchListener {
                override fun onItemClick(p0: AdapterView<*>?, p1: View?, p2: Int, p3: Long) {
                    TODO("Not yet implemented")
                }

                override fun onTouchEvent(rv: RecyclerView, e: MotionEvent) {
                    TODO("Not yet implemented")
                }

                override fun onInterceptTouchEvent(rv: RecyclerView, e: MotionEvent): Boolean {
                    TODO("Not yet implemented")
                }

                override fun onRequestDisallowInterceptTouchEvent(disallowIntercept: Boolean) {
                    TODO("Not yet implemented")
                }

            })

ถ้าใช้ Kotlin


แม้ว่ารหัสนี้อาจช่วยแก้ปัญหาได้รวมถึงคำอธิบายว่าทำไมจึงแก้ปัญหานี้ได้จะช่วยปรับปรุงคุณภาพของโพสต์ของคุณได้อย่างแท้จริงและอาจส่งผลให้มีการโหวตเพิ่มขึ้น โปรดจำไว้ว่าคุณกำลังตอบคำถามสำหรับผู้อ่านในอนาคตไม่ใช่แค่คนที่ถามตอนนี้ โปรดแก้ไขคำตอบของคุณเพื่อเพิ่มคำอธิบายและระบุข้อ จำกัด และสมมติฐานที่ใช้
БогданОпир

-4

ใน onViewHolder ตั้งค่า onClickListiner เป็นมุมมองใด ๆ และในการคลิกด้านข้างใช้รหัสนี้:

Toast.makeText (Drawer_bar.this, "ตำแหน่ง" + ตำแหน่ง, Toast.LENGTH_SHORT) .show ();

แทนที่Drawer_Barด้วยชื่อกิจกรรมของคุณ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.