RecyclerView में क्लिक की गई वस्तु और उसकी स्थिति प्राप्त करें


105

मैं अपने जगह हूँ ListViewके साथ RecyclerView, ठीक दिखा सूची है, लेकिन मैं कैसे क्लिक किए गए आइटम और उसकी स्थिति, विधि के लिए इसी तरह पाने के लिए जानना चाहते हैं OnItemClickListener.onItemClick(AdapterView parent, View v, int position, long id)हम में उपयोग ListView

विचारों के लिए धन्यवाद!


1
इस ट्यूटोरियल की जाँच करें wiki.workassis.com/android-recyclerview-example
Bikesh M


मेरे लिए सबसे आसान तरीका: CustomSelectionCallback
ATES

जवाबों:


177

लिंक के आधार पर: RecyclerView में onItemClickListener () क्यों नहीं है? और कैसे RecyclerView Listview से अलग है? , और भी @ डंकन के सामान्य विचार, मैं अपना समाधान यहां देता हूं:

  • 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());     
    
           }
       }
    }

परीक्षण के बाद, यह ठीक काम करता है।


[ अद्यतन ]

चूंकि एपीआई 22, RecyclerView.ViewHoler.getPosition()पदावनत है, इसलिए इसके बजाय getLayoutPosition()


22
getLayoutPosition () विधि का उपयोग करें क्योंकि getPosition () अब समाप्त हो गया है।
अंकुर चौधरी

2
कोड के इस टुकड़े के लिए धन्यवाद :) बस एक टिप: private static RecyclerViewClickListener itemListener;कंस्ट्रक्टर में स्थिर तरीके से संदर्भ दें ।
डेविड आर्टमैन

1
@khurramengr मैंने विधि में प्रत्येक आइटम में एक श्रोता को जोड़ना समाप्त किया onBindViewHolder। इसके अलावा, मेरी सूची आइटम सभी क्लिक करने योग्य (केवल आइटम का हिस्सा) नहीं था।
फेरन नेग्रे

1
क्या आपको यहां एक कमजोर संदर्भ का उपयोग नहीं करना चाहिए new MyRecyclerViewAdapter(context, this):? इसके कारण मेमोरी लीक हो सकती है
RamwiseMatt

2
public void recyclerViewListClicked(View v, int position);संशोधक publicइंटरफ़ेस विधियों के लिए बेमानी है
जोएल राजू

35
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 () मैं क्या जरूरत है।
अयाज अलिफोव

1
कोड मैन के लिए धन्यवाद !! मेरा दिन बचाया। मुझे यकीन नहीं था कि getAdapterPosition () कहां रखा गया है और आपके कोड का पालन करते हुए मुझे यह काम मिल गया है ... अच्छा और आसान :)
विनय विस्

बहुत बहुत धन्यवाद, आपका कोड वास्तव में मुझे इसकी आवश्यकता थी! हैप्पी मैन
नवीन निहारन यादव

13

यहाँ एक उदाहरण के लिए एक क्लिक श्रोता सेट है।

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

    }

क्या है AdAdapterPostion (); यहाँ?
TheDevMan

1
देखने की स्थिति पर क्लिक किया। एक कस्टम तरीका नहीं है।
गिल्बर्टो इबारा

ऐसा करने के लिए यह सबसे साफ तरीका लगता है, खासकर जब से आप स्थिति का उपयोग करके डेटा प्राप्त करने में लगभग हमेशा रुचि रखते हैं और RecyclerView ऑब्जेक्ट तक पहुंच नहीं हो सकती है।
FrostRocket

बहुत बहुत धन्यवादint position = getAdapterPosition();
शीलेंद्र मद्दा

कृपया ध्यान दें कि कॉलिंग getAdapterPosition जबकि सूची को अद्यतन किया जा रहा है, उदाहरण के लिए कॉलिंग नोटिफाइक्सएक्सवाईजेड के कारण, -1 लौट आएगा
डेविड

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

    }
}

7

नीचे कोड के साथ जावा फ़ाइल बनाएँ

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एक डिफ़ॉल्ट एंड्रॉइड क्लास नहीं है, आपको उस लाइब्रेरी को प्रदान करना चाहिए जिसका आप उपयोग कर रहे हैं या स्वयं कक्षा।
ग्रेग

@ ग्रेग थैंक्स !! मैं पोस्ट करना भूल गया!
मजरॉइड 10

5

यदि आप एडॉप्टर के बजाय गतिविधि / टुकड़े से रीसायकल-व्यू के ईवेंट पर क्लिक करना चाहते हैं तो आप शॉर्ट कट तरीके से भी उपयोग कर सकते हैं।

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 () .String ()
अमनदीप रोहिला

@AmandeepRohila कोड काम करने के लिए, मुझे पहले एक क्षैतिज recyclerview के अंत में स्क्रॉल करना होगा। तभी टोस्ट काम करता है। क्या पहले और पीछे स्क्रॉल किए बिना इसे काम करने का कोई तरीका नहीं है?
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) {
            }
        }
    )
);

यह कैसा मायाजाल है? अच्छी तरह से काम।
बोलिंग

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, आदि ...) और बाइंडिंग के दौरान कर सकते हैं। व्यूहॉल्डर मैंने उस पर एक टैग सेट किया है जिसमें मुझे जानकारी को क्लिक (जैसे स्थिति) और एक क्लिकलिस्टर को संभालने की आवश्यकता है


3
हाँ, हम ViewHolder में क्लिकर श्रोता सेट कर सकते हैं, लेकिन मुझे क्लिक किए गए आइटम दृश्य को वापस करने और आगे की प्रक्रिया के लिए मेरे टुकड़े करने की स्थिति की आवश्यकता है
Xcihnegn

1

यहां क्लिक की गई वस्तु की स्थिति जानने का सबसे सरल और आसान तरीका है:

मैंने भी इसी समस्या का सामना किया है।

मैं RecyclerView () के क्लिक / चयनित आइटम की स्थिति का पता लगाना चाहता था और उस विशेष आइटम पर कुछ विशिष्ट संचालन करना चाहता था।

getAdapterPosition () विधि इस तरह के सामान के लिए एक आकर्षण की तरह काम करती है। मुझे यह तरीका एक दिन के लंबे शोध के बाद और कई अन्य तरीकों को आजमाने के बाद मिला।

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

आपको किसी भी अतिरिक्त विधि का उपयोग करने की आवश्यकता नहीं है। बस 'स्थिति' नाम का एक वैश्विक वैरिएबल बनाएं और इसे एडैप्टरपोजिशन () एडॉप्टर (क्लास या समान) के किसी भी प्रमुख तरीके से शुरू करें।

इस लिंक से एक संक्षिप्त दस्तावेज यहां दिया गया है ।

getAdapterPosition संस्करण 22.1.0 int getAdcapePosition में जोड़ा गया () इस ViewHolder द्वारा दर्शाए गए आइटम के एडाप्टर की स्थिति देता है। ध्यान दें कि यह getLayoutPosition () से भिन्न हो सकता है यदि लंबित एडेप्टर अपडेट हैं लेकिन एक नया लेआउट पास अभी तक नहीं हुआ है। अगले लेआउट ट्रैवर्सल तक RecyclerView किसी भी एडेप्टर अपडेट को हैंडल नहीं करता है। इससे उपयोगकर्ता स्क्रीन पर क्या देखता है और एडॉप्टर सामग्री क्या है, इसके बीच अस्थायी विसंगतियां पैदा हो सकती हैं। यह असंगतता महत्वपूर्ण नहीं है क्योंकि यह 16ms से कम होगा, लेकिन यह एक समस्या हो सकती है यदि आप एडेप्टर तक पहुंचने के लिए 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();
    }


OnBindViewHolder में आइटम में एडाप्टर onClickLictener

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

अब जब भी आप RecyclerView में स्थिति बदलते हैं तो यह धारक में पकड़ है (या शायद इसे श्रोता कहा जाना चाहिए)

मुझे उम्मीद है कि यह उपयोगी होगा

मेरी पहली पोस्ट; पी


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
कृपया एक स्पष्टीकरण जोड़ें, बस परिचय के बिना डंपिंग कोड और यह कैसे समस्या को हल करता है एक स्पष्टीकरण बहुत उपयोगी नहीं है।
मार्क रोटेवेल

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 विधि कैसी दिखनी चाहिए? मैं एक इरादे के लिए आइटम की स्थिति को पास करने की कोशिश कर रहा हूं (अगली गतिविधि खोलने के लिए) और मैं गलत स्थिति प्राप्त कर रहा हूं।
एजेडब्ल्यू

0

हर बार मैं एक और दृष्टिकोण का उपयोग करता हूं। लोग ViewHolder द्वारा प्रदर्शित किसी वस्तु के संदर्भ को संग्रहीत करने के बजाय किसी दृश्य पर संग्रहीत या प्राप्त कर सकते हैं।

मैं इसके बजाय इस दृष्टिकोण का उपयोग करता हूं, और onBindViewHolder () कहे जाने पर ViewHolder में इसे स्टोर करता हूं, और 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

कोटलिन
विधि के लिए लघु विस्तार सभी वस्तुओं की पूर्ण स्थिति देता है (केवल दृश्यमान वस्तुओं की स्थिति नहीं)।

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

और उपयोग

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

0

अपने कस्टम इंटरफ़ेस जावा विधि में getLayoutPosition () का उपयोग करें। यह किसी आइटम की चयनित स्थिति को लौटाएगा, पूर्ण विवरण की जांच करेगा

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


1
ढेर अतिप्रवाह में आपका स्वागत है! जबकि लिंक ज्ञान साझा करने का बहुत अच्छा तरीका है, अगर वे भविष्य में टूट जाते हैं तो वे वास्तव में इस सवाल का जवाब नहीं देंगे। अपने उत्तर में उस लिंक की आवश्यक सामग्री को जोड़ें जो प्रश्न का उत्तर देती है। यदि सामग्री बहुत जटिल या यहाँ फिट होने के लिए बहुत बड़ी है, तो प्रस्तावित समाधान के सामान्य विचार का वर्णन करें। हमेशा याद रखें कि मूल समाधान की वेबसाइट पर एक लिंक संदर्भ रखें। देखें: मैं एक अच्छा उत्तर कैसे लिखूं?
s --unıɐ ɐ qɐp

0

डिजाइनर से, आप onClicklistItem की संपत्ति को एकल पैरामीटर के साथ परिभाषित विधि में सेट कर सकते हैं। मेरे पास एक उदाहरण विधि नीचे परिभाषित है। विधि 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 उपयोगकर्ताओं के लिए अधिक उपयोगी होगा यदि आपने यह समझाने के लिए कुछ संदर्भ शामिल किए कि आपका उत्तर कैसे मदद करता है, विशेष रूप से उस प्रश्न के लिए जो पहले से ही स्वीकृत उत्तर है। देखें: कैसे मैं एक अच्छा जवाब लिख सकता हूं
डेविड बक

0

बहुत परीक्षण और त्रुटि के बाद मैंने पाया कि ऐसा करने का एक बहुत ही आसान तरीका है जो कि एडेप्टर वर्ग में एक इंटरफ़ेस बनाकर और इसे लागू करने से कि अब यहाँ खंडन में ट्विस्ट आता है, मैंने अपने ओवरराइड फंक्शन में मौजूद व्यू मॉडल को वर्तमान में तोड़ दिया। टुकड़ा अब आप उस फ़ंक्शन से डेटा को वेमोडेल और वहां से कहीं भी भेज सकते हैं।

मुझे नहीं पता कि यह तरीका अच्छा कोडिंग तरीका है लेकिन कृपया मुझे कमेंट में बताएं और यदि कोई मुझे कमेंट सेक्शन में यह बताना चाहता है कि मैं नियमित रूप से स्टैकओवर फ्लो खोलता हूं।


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

            })

यदि कोटलिन का उपयोग करें


हालांकि यह कोड प्रश्न को हल कर सकता है, जिसमें यह भी बताया गया है कि यह समस्या कैसे और क्यों हल करती है, इससे वास्तव में आपके पोस्ट की गुणवत्ता को बेहतर बनाने में मदद मिलेगी, और शायद अधिक वोट भी मिलेंगे। याद रखें कि आप भविष्य में पाठकों के लिए प्रश्न का उत्तर दे रहे हैं, न कि केवल उस व्यक्ति से जो अब पूछ रहा है। कृपया स्पष्टीकरण जोड़ने के लिए अपने उत्तर को संपादित करें और संकेत दें कि क्या सीमाएँ और मान्यताएँ लागू होती हैं।
Богдан Опир

-4

किसी भी दृश्य पर onClickListiner सेट onViewHolder में और साइड क्लिक में इस कोड का उपयोग करें:

Toast.makeText (Drawer_bar.this, "position" + position, Toast.LENGTH_SHORT) .show ();

Drawer_Barअपने गतिविधि नाम से बदलें ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.