ক্লিক করা আইটেম এবং পুনর্ব্যবহারযোগ্য ভিউতে এর অবস্থান পান


105

আমি আমার প্রতিস্থাপন করছি ListViewসঙ্গে RecyclerView, ঠিক আছে দেখাচ্ছে তালিকা, কিন্তু আমি কিভাবে ক্লিক আইটেমটি এবং এটির অবস্থান, পদ্ধতি অনুরূপ পেতে জানতে চাই OnItemClickListener.onItemClick(AdapterView parent, View v, int position, long id)আমরা ব্যবহার ListView

ধারণার জন্য ধন্যবাদ!


1
এই টিউটোরিয়ালটি দেখুন wiki.workassis.com/android-recyclerview- উদাহরণ
বিকাশ এম


আমার জন্য সবচেয়ে সহজ উপায়: CustomSelectionCallback
Ates

উত্তর:


177

লিঙ্কটির উপর ভিত্তি করে: কেন রিসাইক্লার ভিউতে আইটেমিক্লিকলিস্টার () নেই? এবং কীভাবে রিসাইক্লারভিউ তালিকাভুক্তির থেকে আলাদা? , এবং @ ডানকানের সাধারণ ধারণা, আমি আমার সমাধানটি এখানে দিচ্ছি:

  • 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
getPay (প্লে) হিসাবে getLayoutPosition () পদ্ধতিটি ব্যবহার করুন এখন চিত্রিত হয়েছে।
অঙ্কুর চৌধুরী চৌধুরী

2
এই টুকরা কোডের জন্য ধন্যবাদ :) মাত্র একটি টিপ: private static RecyclerViewClickListener itemListener;কনস্ট্রাক্টরে স্থির উপায়ে স্থির রেফারেন্স ।
ডেভিড আর্টম্যান

1
@ Khurramengr আমি পদ্ধতিতে প্রতিটি আইটেমটিতে শ্রোতা যুক্ত করে শেষ করেছি onBindViewHolder। তদুপরি, আমার তালিকার আইটেমটি সমস্ত ক্লিকযোগ্য ছিল না (আইটেমের কেবলমাত্র অংশ)।
ফেরান নেগ্রে

1
আপনি যদি একটি WeakReference এখানে ব্যবহার করছেন না হওয়া উচিত: new MyRecyclerViewAdapter(context, this)? এটি মেমরি ফাঁস হতে পারে
রামওয়াইম্যাট

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

    }

GetAdapterPostion কি (); এখানে?
TheDevMan

1
ক্লিক করার দৃশ্যের অবস্থান। একটি কাস্টম পদ্ধতি নয়।
গিলবার্তো ইবাররা

এটি এটি করার সবচেয়ে পরিষ্কার পদ্ধতির মতো বলে মনে হচ্ছে, বিশেষত যেহেতু আপনি প্রায় সবসময় অবস্থানটি ব্যবহার করে ডেটা পেতে আগ্রহী এবং রিস্যাকারভিউ অবজেক্টে অ্যাক্সেস নাও থাকতে পারে।
ফ্রস্টরোকট

অনেক অনেক ধন্যবাদint position = getAdapterPosition();
শৈলেন্দ্র ম্যাড্ডা

দয়া করে নোট করুন যে তালিকাটি আপডেট হওয়ার সময় getAdapterPosition কল করার সময় যেমন নোটিফাইফাইএডজেড কল করার কারণে ফিরে আসবে -১
ডেভিড

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.addOnItemTouchListener(  
new RecyclerItemClickListener(context, new RecyclerItemClickListener.OnItemClickListener() {
  @Override public void onItemClick(View view, int position) {
    // TODO Handle item click
  }
}));

RecyclerItemClickListenerকোনও ডিফল্ট অ্যান্ড্রয়েড বর্গ নয়, আপনার ব্যবহৃত লাইব্রেরি বা ক্লাস নিজেই সরবরাহ করা উচিত।
গ্রেগ

@ গ্রেগ থানেক্স !! আমি পোস্ট করতে ভুলে গেছি!
মাজরয়েড

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

আপনি ইন্টারফেস ব্যবহারের মতো অন্যান্য দীর্ঘ উপায়ও ব্যবহার করতে পারেন


,, হাই সেখানে, তবে আমাদের যদি ক্লিক করা আইটেমের অবস্থান পেতে হয় তবে কী হবে। ?
এমফাইসালহাইডার

আপনি শুধু অ্যাডাপ্টারের মাধ্যমে রুপে TAG এর মধ্যে আইটেমের অবস্থান সেট করতে পারেন এবং তারপর হিসাবে txtStatusChange.getTag () উপরে উল্লিখিত ট্যাগ পেতে toString ()।
Amandeep Rohila

@ আমনদীপরোহিলা কোডটি কাজ করার জন্য, আমাকে প্রথমে একটি অনুভূমিক পুনর্ব্যবহারের শেষের দিকে স্ক্রোল করতে হবে। তবেই টোস্টটি কাজ করে। প্রথমে পিছনে পিছনে স্ক্রোল না করে এটিকে কাজ করার কোনও উপায় নেই?
আইওএসএন্ড্রয়েডওয়াইন্ডোমোবাইল অ্যাপসদেব

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

রিসাইক্লারভিউ এ জাতীয় পদ্ধতি সরবরাহ করে না।

রিসিকারভিউতে ক্লিক ইভেন্টগুলি পরিচালনা করতে আমি ভিউহোল্ডারকে আবদ্ধ করার সময়, আমার অ্যাডাপ্টারে অন ক্লিকলিস্টনার প্রয়োগ করে শেষ করেছি: আমার ভিউহোল্ডারটিতে আমি মূল দৃশ্যের জন্য একটি রেফারেন্স রাখি (যেমন আপনি নিজের ইমেজভিউস, টেক্সটভিউস ইত্যাদির সাথে করতে পারেন) এবং যখন আবদ্ধ হয় ভিউহোল্ডার তথ্যের সাথে আমি ক্লিক করে (যেমন পজিশন) এবং একটি ক্লিকলিস্টার হ্যান্ডেল করতে হবে তার সাথে আমি একটি ট্যাগ সেট করি


3
হ্যাঁ আমরা ভিউহোল্ডারে ক্লিক শ্রোতাদের সেট করতে পারি, তবে আরও প্রক্রিয়াটির জন্য আমার ক্লিক করা আইটেম ভিউ এবং অবস্থানটি আমার খণ্ডে ফিরে যেতে হবে
এক্সসিহনেগ

1

এখানে ক্লিক করা আইটেমটির অবস্থান সন্ধান করার সবচেয়ে সহজ এবং সহজ উপায়:

আমিও একই সমস্যার মুখোমুখি হয়েছি।

আমি পুনর্ব্যবহারযোগ্য ভিউ () এর ক্লিক / নির্বাচিত আইটেমের অবস্থানটি খুঁজতে এবং সেই নির্দিষ্ট আইটেমটিতে কিছু নির্দিষ্ট ক্রিয়াকলাপ সম্পাদন করতে চেয়েছিলাম।

getAdapterPosition () পদ্ধতি এই ধরণের স্টাফগুলির জন্য কবজির মতো কাজ করে। একদিন দীর্ঘ গবেষণার পরে এবং অন্যান্য অসংখ্য পদ্ধতির চেষ্টা করার পরে আমি এই পদ্ধতিটি পেয়েছি।

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

আপনাকে কোনও অতিরিক্ত পদ্ধতি ব্যবহার করতে হবে না। কেবলমাত্র 'পজিশন' নামের একটি বৈশ্বিক পরিবর্তনশীল তৈরি করুন এবং অ্যাডাপ্টারের (শ্রেণি বা অনুরূপ) কোনও বড় পদ্ধতিতে getAdapterPosition () দিয়ে এটি আরম্ভ করুন।

এই লিঙ্ক থেকে একটি সংক্ষিপ্ত ডকুমেন্টেশন এখানে ।

getAdapterP स्थिति 22.1.0 সংস্করণে যুক্ত হয়েছে getAdapterPosition () এই ভিউহোল্ডার দ্বারা প্রতিনিধিত্ব করা আইটেমটির অ্যাডাপ্টারের অবস্থান প্রদান করে। মনে রাখবেন যে অ্যাডাপ্টারের আপডেটগুলি মুলতুবি থাকলেও একটি নতুন লেআউট পাস এখনও ঘটে নি তবে এটি getLayoutPosition () এর চেয়ে আলাদা হতে পারে। রিসাইক্লারভিউ পরবর্তী লেআউট ট্র্যাভারসাল না হওয়া পর্যন্ত কোনও অ্যাডাপ্টার আপডেট পরিচালনা করে না। এটি স্ক্রিনে ব্যবহারকারী কী দেখেন এবং অ্যাডাপ্টারের সামগ্রীগুলির মধ্যে সাময়িক অসঙ্গতি তৈরি করতে পারে। এই অসঙ্গতিটি গুরুত্বপূর্ণ নয় যেহেতু এটি 16 এমএমের চেয়ে কম হবে তবে আপনি অ্যাডাপ্টারে অ্যাক্সেসের জন্য ভিউহোল্ডার অবস্থান ব্যবহার করতে চাইলে সমস্যা হতে পারে। কখনও কখনও, ব্যবহারকারীর ইভেন্টগুলির প্রতিক্রিয়া হিসাবে কিছু ক্রিয়া করার জন্য আপনাকে সঠিক অ্যাডাপ্টারের অবস্থান পেতে হতে পারে। সেক্ষেত্রে আপনার এই পদ্ধতিটি ব্যবহার করা উচিত যা ভিউহোল্ডারের অ্যাডাপ্টারের অবস্থান গণনা করবে।

সাহায্য করতে পারলে খুশি. সন্দেহ জিজ্ঞাসা করুন নির্দ্বিধায়।


রিসাইক্লারভিউয়ের ক্লিক করা আইটেমটির মূল্য পাওয়ার সহজতম ও সহজ উপায় কী?
অক্ষে পরোলেকার

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

অনবিন্দ ভিউহোল্ডার আইটেমটিতে অ্যাডাপ্টারে অন
ক্লিকলিস্টনার

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

এখন যখনই আপনি পুনর্ব্যবহারযোগ্য ভিউতে অবস্থান পরিবর্তন করবেন এটি ধারককে ধারণ করবে (অথবা সম্ভবত এটি শ্রোতা বলা উচিত)

আমি আশা করি এটি কার্যকর হবে

আমার প্রথম পোস্ট; পি


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

দ্রষ্টব্য: ক্রিয়াকলাপ বা খণ্ড এবং ওভারাইড পদ্ধতিতে আপনার দেওয়া প্রসঙ্গের ভিত্তিতে অনআইটেমিক্লিকলিস্টনার প্রয়োগ করুন।


উপরে ভাল সমাধান। ক্রিয়াকলাপে আইটেমিক্লিক পদ্ধতিটি দেখতে কেমন হওয়া উচিত তা দেখাতে আপনি কি উপরের সাথে যুক্ত করতে পারেন? আমি আইটেমের অবস্থানটি একটি ইন্টেন্টে (পরবর্তী ক্রিয়াকলাপটি খোলার জন্য) পাস করার চেষ্টা করছি এবং আমি ভুল অবস্থান পেতে থাকি।
এজেডাব্লু

0

প্রতিবার আমি অন্য পদ্ধতি ব্যবহার করি। লোকেরা ভিউহোল্ডার দ্বারা প্রদর্শিত কোনও অবজেক্টের রেফারেন্স সঞ্চয় করার চেয়ে ভিউতে সঞ্চয় বা অবস্থান পেয়েছে বলে মনে হয়।

পরিবর্তে আমি এই পদ্ধতির ব্যবহার করি এবং অনবিন্দ ভিহোল্ডার () ডাকা হয়ে গেলে কেবল ভিউহোল্ডার এ সঞ্চয় করি এবং অনভিউরাইসাইক্ল্ড () এ নালকে রেফারেন্স সেট করে।

যতবার ভিউহোল্ডার অদৃশ্য হয়ে যায়, এটি পুনর্ব্যবহারযোগ্য। সুতরাং এটি বড় মেমরির ব্যবহারে প্রভাব ফেলবে না।

@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
স্ট্যাক ওভারফ্লোতে স্বাগতম! লিঙ্কগুলি জ্ঞান ভাগ করে নেওয়ার দুর্দান্ত উপায়, ভবিষ্যতে যদি তারা ভাঙা যায় তবে তারা সত্যই প্রশ্নের উত্তর দেবে না। আপনার উত্তরে লিঙ্কটির প্রয়োজনীয় বিষয়বস্তু যুক্ত করুন যা প্রশ্নের উত্তর দেয়। যদি বিষয়বস্তু এখানে জটিল বা খুব বেশি ফিট হয় তবে প্রস্তাবিত সমাধানটির সাধারণ ধারণাটি বর্ণনা করুন। মূল সমাধানের ওয়েবসাইটে সর্বদা একটি লিঙ্কের রেফারেন্স রাখতে ভুলবেন না। দেখুন: আমি কীভাবে ভাল উত্তর লিখব?
সুনুন ןɐ কিউপি

0

ডিজাইনার থেকে আপনি তালিকার onClickসম্পত্তিটিকে একটি প্যারামিটার দিয়ে সংজ্ঞায়িত পদ্ধতিতে সেট করতে পারেন । আমি নীচে সংজ্ঞায়িত একটি উদাহরণ পদ্ধতি আছে। GetAdapterPosition পদ্ধতিটি আপনাকে নির্বাচিত তালিকা আইটেমের সূচি দেয়।

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

একটি রিসাইক্লারভিউ সেটআপ সম্পর্কিত তথ্যের জন্য, ডকুমেন্টেশন এখানে দেখুন: 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
কোনও পুরানো প্রশ্নের উত্তর দেওয়ার সময়, অন্য উত্তর স্ট্যাকওভারফ্লো ব্যবহারকারীদের কাছে আপনার উত্তরটি আরও কার্যকর হবে যদি আপনি নিজের উত্তর কীভাবে সহায়তা করে তা ব্যাখ্যা করার জন্য কিছু প্রসঙ্গ অন্তর্ভুক্ত করে, বিশেষত ইতিমধ্যে স্বীকৃত উত্তর রয়েছে এমন একটি প্রশ্নের জন্য। দেখুন: আমি কীভাবে ভাল উত্তর লিখব
ডেভিড বাক

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

অনভিউহোল্ডারটিতে যে কোনও ভিউতে ক্লিকলিস্টিনারে সেট করুন এবং সাইড ক্লিকে এই কোডটি ব্যবহার করুন:

টোস্ট.মেকটেক্সট (ড্রয়ার_বার.এই, "পজিশন" + পজিশন, টোস্ট। এলএনজিটিএসএসএইচআরটি) .শো ();

Drawer_Barআপনার ক্রিয়াকলাপের নামটি প্রতিস্থাপন করুন ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.