java কেন RecyclerView onItemClickListener ()?





15 Answers

একটি বিকল্প সমাধান হল হুগো ভিসার , একটি Android GDE প্রস্তাবিত। আপনার কোডটি কেবলমাত্র ড্রপ করতে এবং এটি ব্যবহার করার জন্য তিনি একটি লাইসেন্স-মুক্ত শ্রেণি তৈরি করেছেন।

ব্যবহার:

ItemClickSupport.addTo(mRecyclerView)
        .setOnItemClickListener(new ItemClickSupport.OnItemClickListener() {
    @Override
    public void onItemClicked(RecyclerView recyclerView, int position, View v) {
        // do it
    }
});

(এটি দীর্ঘ আইটেম ক্লিক সমর্থন করে)

বাস্তবায়ন (আমার দ্বারা মন্তব্য যোগ করা হয়েছে):

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) {
                // ask the RecyclerView for the viewHolder of this view.
                // then use it to get the position for the adapter
                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) {
            // every time a new child view is attached add click listeners to it
            if (mOnItemClickListener != null) {
                view.setOnClickListener(mOnClickListener);
            }
            if (mOnItemLongClickListener != null) {
                view.setOnLongClickListener(mOnLongClickListener);
            }
        }

        @Override
        public void onChildViewDetachedFromWindow(View view) {

        }
    };

    private ItemClickSupport(RecyclerView recyclerView) {
        mRecyclerView = recyclerView;
        // the ID must be declared in XML, used to avoid
        // replacing the ItemClickSupport without removing
        // the old one from the RecyclerView
        mRecyclerView.setTag(R.id.item_click_support, this);
        mRecyclerView.addOnChildAttachStateChangeListener(mAttachListener);
    }

    public static ItemClickSupport addTo(RecyclerView view) {
        // if there's already an ItemClickSupport attached
        // to this RecyclerView do not replace it, use it
        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);
    }
}

এছাড়াও একটি ফাইল values/ids.xml তৈরি করুন এবং এতে এটি লিখুন:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <item name="item_click_support" type="id" />
</resources>

এই ক্লাসটি RecyclerView.OnChildAttachStateChangeListener সংযুক্ত করে RecyclerView.OnChildAttachStateChangeListener সংযুক্ত করে কাজ করে। এই শ্রোতা প্রতিবার একটি শিশু সংযুক্ত করা হয় বা RecyclerView থেকে বিচ্ছিন্ন করা হয়। কোডটি দেখার জন্য একটি ট্যাপ / লম্বা ক্লিক শ্রোতা যুক্ত করতে এটি ব্যবহার করে। যে শ্রোতা RecyclerView জন্য RecyclerView জিজ্ঞাসা যা অবস্থান রয়েছে।

আপনি আরো প্রয়োজন হলে আপনি ধারক নিজেকে ফিরে দিতে কোডটি মানিয়ে নিতে পারে।

মনে রাখবেন যে এটি আপনার অ্যাডাপ্টারে পরিচালনা করার জন্য এটি সম্পূর্ণ সূক্ষ্ম, আপনার তালিকার প্রতিটি দৃশ্যকে প্রস্তাবিত অন্যান্য উত্তরগুলির মত একটি ক্লিক শ্রোতা সেট করে। এটি কেবল সবচেয়ে কার্যকরী কাজ নয় (আপনি যখন কোনও দৃশ্য পুনঃব্যবহার করেন তখন আপনি একটি নতুন শ্রোতা তৈরি করেন) তবে এটি কাজ করে এবং বেশিরভাগ ক্ষেত্রে এটি কোনও সমস্যা নয়।

RecyclerView নেই কেন সম্পর্কে।

RecyclerView হল একটি টুলবক্স, পুরানো তালিকা ListView বিপরীতে এতে বৈশিষ্ট্যগুলি কম বিল্ড এবং আরো নমনীয়তা রয়েছে। onItemClickListener ListView থেকে সরানো হচ্ছে একমাত্র বৈশিষ্ট্য নয়। কিন্তু এতে অনেক শ্রোতা এবং পদ্ধতি আপনার পছন্দসইতে প্রসারিত করতে পারে, এটি ডান হাতে অনেক বেশি শক্তিশালী।)।

আমার মতে, RecyclerView সরানো সবচেয়ে জটিল বৈশিষ্ট্য দ্রুত স্ক্রোল । অন্যান্য বৈশিষ্ট্য অধিকাংশ সহজেই পুনরায় বাস্তবায়িত করা যেতে পারে।

java android android-recyclerview

আমি RecyclerView অনুসন্ধান করছিলাম এবং আমি দেখেছি যে RecyclerView onItemClickListener()RecyclerView প্রসারিত কারণ

android.view.ViewGroup

এবং ListView প্রসারিত

android.widget.AbsListView

। যাইহোক আমি আমার onClick মধ্যে ক্লিক ক্লিক করে আমার সমস্যা সমাধান:

public static class ViewHolder extends RecyclerView.ViewHolder implements OnClickListener {

    public TextView txtViewTitle;
    public ImageView imgViewIcon;

    public ViewHolder(View itemLayoutView) {
        super(itemLayoutView);
        txtViewTitle = (TextView) itemLayoutView.findViewById(R.id.item_title);
        imgViewIcon = (ImageView) itemLayoutView.findViewById(R.id.item_icon);
    }

    @Override
    public void onClick(View v) {

    }
}

কিন্তু এখনও আমি জানতে চাই কেন Google onItemClickListener() কে সরানো হয়েছে?

একটি কর্মক্ষমতা সমস্যা বা অন্য কিছু আছে?




OnItemClickListener এর মাধ্যমে Android পুনর্ব্যবহারযোগ্য, কেন আমরা চেষ্টা করতে পারি না এটি শুধুমাত্র ListView মতো কাজ করছে।

উত্স: Link

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

  }
}

এবং RecyclerView এ সেট করুন:

    recyclerView = (RecyclerView)rootView. findViewById(R.id.recyclerView);
    RecyclerView.LayoutManager mLayoutManager = new            LinearLayoutManager(getActivity());
    recyclerView.setLayoutManager(mLayoutManager);
    recyclerView.addOnItemTouchListener(
            new RecyclerItemClickListener(getActivity(), new   RecyclerItemClickListener.OnItemClickListener() {
                @Override
                public void onItemClick(View view, int position) {
                    // TODO Handle item click
                    Log.e("@@@@@",""+position);
                }
            })
    );



বন্ধুরা আপনার প্রধান কার্যকলাপ এই কোড ব্যবহার করুন। অত্যন্ত কার্যকর পদ্ধতি

RecyclerView recyclerView = (RecyclerView) findViewById(R.id.users_list);            
UsersAdapter adapter = new UsersAdapter(users, this);
recyclerView.setAdapter(adapter);
adapter.setOnCardClickListner(this);

এখানে আপনার অ্যাডাপ্টার ক্লাস হয়।

public class UsersAdapter extends RecyclerView.Adapter<UsersAdapter.UserViewHolder> {
        private ArrayList<User> mDataSet;
        OnCardClickListner onCardClickListner;


        public UsersAdapter(ArrayList<User> mDataSet) {
            this.mDataSet = mDataSet;
        }

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

        @Override
        public void onBindViewHolder(UserViewHolder holder, final int position) {
            holder.name_entry.setText(mDataSet.get(position).getUser_name());
            holder.cardView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    onCardClickListner.OnCardClicked(v, position);
                }
            });
        }

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

        @Override
        public void onAttachedToRecyclerView(RecyclerView recyclerView) {
            super.onAttachedToRecyclerView(recyclerView);
        }


        public static class UserViewHolder extends RecyclerView.ViewHolder {
            CardView cardView;
            TextView name_entry;

            public UserViewHolder(View itemView) {
                super(itemView);
                cardView = (CardView) itemView.findViewById(R.id.user_layout);
                name_entry = (TextView) itemView.findViewById(R.id.name_entry);
             }
        }

        public interface OnCardClickListner {
            void OnCardClicked(View view, int position);
        }

        public void setOnCardClickListner(OnCardClickListner onCardClickListner) {
            this.onCardClickListner = onCardClickListner;
        }
    }

এই পরে আপনি আপনার কার্যকলাপ এই override পদ্ধতি পাবেন।

@Override
    public void OnCardClicked(View view, int position) {
        Log.d("OnClick", "Card Position" + position);
    }



কিভাবে সব একসাথে উদাহরণ স্থাপন করা ...

  • onclick () হ্যান্ডলিং
  • কার্সার - পুনর্ব্যবহারযোগ্য দেখুন
  • ViewHolder ধরনের

    public class OrderListCursorAdapter extends CursorRecyclerViewAdapter<OrderListCursorAdapter.ViewHolder> {
    
    private static final String TAG = OrderListCursorAdapter.class.getSimpleName();
    private static final int ID_VIEW_HOLDER_ACTUAL = 0;
    private static final int ID_VIEW_HOLDER = 1;
    
    public OrderListCursorAdapter(Context context, Cursor cursor) {
        super(context, cursor);
    }
    
    public static class ViewHolderActual extends ViewHolder {
        private static final String TAG = ViewHolderActual.class.getSimpleName();
        protected IViewHolderClick listener;
        protected Button button;
    
        public ViewHolderActual(View v, IViewHolderClick listener) {
            super(v, listener);
            this.listener = listener;
            button = (Button) v.findViewById(R.id.orderList_item_button);
            button.setOnClickListener(this);
        }
    
        public void initFromData(OrderData data) {
            Log.d(TAG, "><initFromData(data=" + data + ")");
            orderId = data.getId();
            vAddressStart.setText(data.getAddressStart());
            vAddressEnd.setText(data.getAddressEnd());
        }
    
        @Override
        public void onClick(View view) {
            if (view instanceof Button) {
                listener.onButtonClick((Button) view, getPosition(), this);
            } else {
                super.onClick(view);
            }
        }
    
        public interface IViewHolderClick extends ViewHolder.IViewHolderClick {
            public void onButtonClick(Button button, int position, ViewHolder viewHolder);
        }
    }
    
    public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        private static final String TAG = ViewHolder.class.getSimpleName();
        protected long orderId;
        protected IViewHolderClick listener;
        protected TextView vAddressStart;
        protected TextView vAddressEnd;
        protected TextView vStatus;
    
        public ViewHolder(View v, IViewHolderClick listener) {
            super(v);
            this.listener = listener;
            v.setOnClickListener(this);
    
            vAddressStart = (TextView) v.findViewById(R.id.addressStart);
            vAddressEnd = (TextView) v.findViewById(R.id.addressEnd);
            vStatus = (TextView) v.findViewById(R.id.status);
        }
    
        public void initFromData(OrderData data) {
            Log.d(TAG, "><initFromData(data=" + data + ")");
            orderId = data.getId();
            vAddressStart.setText(data.getAddressStart());
            vAddressEnd.setText(data.getAddressEnd());
        }
    
        public long getOrderId() {
            return orderId;
        }
    
        @Override
        public void onClick(View view) {
            listener.onCardClick(view, getPosition(), this);
        }
    
        public interface IViewHolderClick {
            public void onCardClick(View view, int position, ViewHolder viewHolder);
        }
    }
    
    @Override
    public int getItemViewType(int position) {
        return position == 0 ? ID_VIEW_HOLDER_ACTUAL : ID_VIEW_HOLDER;
    }
    
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        Log.d(TAG, ">>onCreateViewHolder(parent=" + parent + ", viewType=" + viewType + ")");
    
        ViewHolder result;
    
        switch (viewType) {
            case ID_VIEW_HOLDER_ACTUAL: {
                View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.card_layout_actual, parent, false);
                result = new ViewHolderActual(itemView, new ViewHolderActual.IViewHolderClick() {
                    @Override
                    public void onCardClick(View view, int position, ViewHolder viewHolder) {
                        Log.d(TAG, "><onCardClick(view=" + view + ", position=" + position + ", viewHolder=" + viewHolder + ")");
                        Intent intent = new Intent(view.getContext(), OrderDetailActivity.class);
                        intent.putExtra(OrderDetailActivity.ARG_ORDER_ID, viewHolder.getOrderId());
                        view.getContext().startActivity(intent);
                    }
    
                    @Override
                    public void onButtonClick(Button button, int position, ViewHolder viewHolder) {
                        Log.d(TAG, "><onButtonClick(button=" + button + ", position=" + position + ", viewHolder=" + viewHolder + ")");
                        Intent intent = new Intent(button.getContext(), OrderMapActivity.class);
                        intent.putExtra(OrderMapActivity.ARG_ORDER_ID, viewHolder.getOrderId());
                        button.getContext().startActivity(intent);
                    }
                });
                break;
            }
            case ID_VIEW_HOLDER:
            default: {
                View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.card_layout, parent, false);
                result = new ViewHolder(itemView, new ViewHolder.IViewHolderClick() {
                    @Override
                    public void onCardClick(View view, int position, ViewHolder viewHolder) {
                        Log.d(TAG, "><onCardClick(view=" + view + ", position=" + position + ", viewHolder=" + viewHolder + ")");
                        Intent intent = new Intent(view.getContext(), OrderDetailActivity.class);
                        intent.putExtra(OrderDetailActivity.ARG_ORDER_ID, viewHolder.getOrderId());
                        view.getContext().startActivity(intent);
                    }
                });
                break;
            }
        }
    
        Log.d(TAG, "<<onCreateViewHolder(parent=" + parent + ", viewType=" + viewType + ")= " + result);
        return result;
    }
    
    @Override
    public void onBindViewHolder(ViewHolder viewHolder, Cursor cursor) {
        Log.d(TAG, "><onBindViewHolder(viewHolder=" + viewHolder + ", cursor=" + cursor + ")");
        final OrderData orderData = new OrderData(cursor);
        viewHolder.initFromData(orderData);
    }
    }



এমএল প্রোগ্রামার-সিআইএম এর চমৎকার এক্সএক্স জাভা সমাধান অনুসরণ করুন

ভোগ / ক্লিক পর্যবেক্ষণ

ReactiveAdapter rxAdapter = new ReactiveAdapter();
rxAdapter.getPositionClicks().subscribe(mClickConsumer);

Consumer<String> mClickConsumer = new Consumer<String>() {
        @Override
        public void accept(@NonNull String element) throws Exception {
            Toast.makeText(getApplicationContext(), element +" was clicked", Toast.LENGTH_LONG).show();
        }
    };

RxJava 2. +

মূল টিএল সংশোধন করুন ; যেমন:

public Observable<String> getPositionClicks(){
    return onClickSubject;
}

PublishSubject#asObservable() সরানো হয়েছে। শুধু PublishSubject যা একটি Observable ফিরে।




আমি এই ভাবে করেছি, এটি খুব সহজ:

ক্লিক করা পুনর্ব্যবহারযোগ্য অবস্থানের জন্য মাত্র 1 লাইন যুক্ত করুন:

int position = getLayoutPosition()

ViewHolder ক্লাসের জন্য সম্পূর্ণ কোড:

private class ChildViewHolder extends RecyclerView.ViewHolder {
        public ImageView imageView;
        public TextView txtView;

        public ChildViewHolder(View itemView) {
            super(itemView);
            imageView= (ImageView)itemView.findViewById(R.id.imageView);
            txtView= (TextView) itemView.findViewById(R.id.txtView);
            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Log.i("RecyclerView Item Click Position", String.valueOf(getLayoutPosition()));
                }
            });
        }
    }

আশা করি এটা তোমাকে সাহায্য করবে।




আপনার যদি POJO গুলির একটি তালিকা থাকে এবং এটিকে অ্যাডাপ্টারের বাইরে থেকে ক্লিক করে পুনরুদ্ধার করতে চান তবে এখানে এটি সহজে প্রয়োগ করার একটি উপায়।

আপনার অ্যাডাপ্টারে, ক্লিক ইভেন্টগুলির জন্য শ্রোতা তৈরি করুন এবং এটি সেট করার একটি পদ্ধতি তৈরি করুন:

public class MyAdapter extends RecyclerView.Adapter<SitesListAdapter.ViewHolder> {
...
private List<MyPojo> mMyPojos;
private static OnItemClickListener mOnItemClickListener;

...
public interface OnItemClickListener {
    public void onItemClick(MyPojo pojo);
}

...
public void setOnItemClickListener(OnItemClickListener onItemClickListener){
    mOnItemClickListener = onItemClickListener;
}
...

}

আপনার ভিউ হোল্ডারে, অন ক্লিকলিস্টার প্রয়োগ করুন এবং POJO সাময়িকভাবে উপস্থাপন করছে এমন একটি শ্রেণির সদস্য তৈরি করুন যা দৃশ্যটি উপস্থাপিত হচ্ছে, এভাবে (এটি একটি উদাহরণ, একটি সেট্টার তৈরি করা আরও ভাল হবে):

public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
    public MyPojo mCurrentPojo;
    ...
    public ViewHolder(View view) {
        super(v);
        ...
        view.setOnClickListener(this); //You could set this on part of the layout too
    }

    ...
    @Override
    public void onClick(View view) {
        if(mOnItemClickListener != null && mCurrentPojo != null){
            mOnItemClickListener.onItemClick(mCurrentPojo);
        }
    }

আপনার অ্যাডাপ্টারে ফিরে, ভিউহোলার আবদ্ধ থাকলে বর্তমান POJO সেট করুন (বা বর্তমান দৃশ্যটি যদি না থাকে তবে নল করুন):

@Override
public void onBindViewHolder(final ViewHolder holder, final int position) {
    final MyPojo currentPojo = mMyPojos.get(position); 
    holder.mCurrentPojo = currentPojo;
    ...

এটি যে, এখন আপনি এটি আপনার টুকরা / ক্রিয়াকলাপ থেকে এটি ব্যবহার করতে পারেন:

    mMyAdapter.setOnItemClickListener(new mMyAdapter.OnItemClickListener() {
        @Override
        public void onItemClick(MyPojo pojo) {
            //Do whatever you want with your pojo here
        }
    });



পুনর্ব্যবহারযোগ্য দৃশ্যটি নেই onItemClickListenerকারণ RecyclerView পুনঃব্যবহারযোগ্য দৃষ্টিভঙ্গি (অবাক!) এর জন্য দায়ী, তাই এটি এমন দৃশ্যের দায় যা এটি প্রাপ্ত ইভেন্টগুলির পরিচালনা করার জন্য পুনর্ব্যবহৃত হয়।

এটি আসলে এটি ব্যবহার করা অনেক সহজ করে তোলে, বিশেষত যদি আপনার কাছে আইটেমগুলি একাধিক স্থানে ক্লিক করা যেতে পারে।

যাইহোক, RecyclerView আইটেমটি ক্লিক করে সনাক্ত করা খুব সহজ। আপনাকে যা করতে হবে তা হল একটি ইন্টারফেস সংজ্ঞায়িত করা (যদি আপনি কোটলিন ব্যবহার করেন না, তবে কোন ক্ষেত্রে আপনি কেবল একটি Lambda এ পাস করেন):

public class MyAdapter extends RecyclerView.Adapter<MyViewHolder> {
    private final Clicks clicks;

    public MyAdapter(Clicks clicks) {
        this.clicks = clicks;
    }

    private List<MyObject> items = Collections.emptyList();

    public void updateData(List<MyObject> items) {
        this.items = items;
        notifyDataSetChanged(); // TODO: use ListAdapter for diffing instead if you need animations
    }

    public interface Clicks {
        void onItemSelected(MyObject myObject, int position);
    }

    public class MyViewHolder extends RecyclerView.ViewHolder {
        private MyObject myObject;    

        public MyViewHolder(View view) {
            super(view);
            // bind views
            view.setOnClickListener((v) -> {
                int adapterPosition = getAdapterPosition();
                if(adapterPosition >= 0) {
                    clicks.onItemSelected(myObject, adapterPosition);
                }
            });
        }

        public void bind(MyObject myObject) {
            this.myObject = myObject;
            // bind data to views
        }
    }
}

কোটলিনের একই কোড:

class MyAdapter(val itemClicks: (MyObject, Int) -> Unit): RecyclerView.Adapter<MyViewHolder>() {
    private var items: List<MyObject> = Collections.emptyList()

    fun updateData(items: List<MyObject>) {
        this.items = items
        notifyDataSetChanged() // TODO: use ListAdapter for diffing instead if you need animations
    }

    inner class MyViewHolder(val myView: View): RecyclerView.ViewHolder(myView) {
        private lateinit var myObject: MyObject

        init {
            // binds views
            myView.onClick {
                val adapterPosition = getAdapterPosition()
                if(adapterPosition >= 0) {
                    itemClicks.invoke(myObject, adapterPosition)
                }
            }
        }

        fun bind(myObject: MyObject) {
            this.myObject = myObject
            // bind data to views
        }
    }
}



হ্যা, তুমি পারো

public ViewHolder onCreateViewHolder(ViewGroup parent,int viewType) {

    //inflate the view 

    View view = LayoutInflator.from(parent.getContext()).inflate(R.layout.layoutID,null);

    ViewHolder holder = new ViewHolder(view);

    //here we can set onClicklistener
    view.setOnClickListener(new  View.OnClickListeener(){
        public void onClick(View v)
        {
            //action
        }
    });

return holder;



আমার মন্তব্য সংশোধন করা হয়েছে ...

public class MyViewHolder extends RecyclerView.ViewHolder {

        private Context mContext;

        public MyViewHolder(View itemView) {
            super(itemView);

            mContext = itemView.getContext();

            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {

                    int itemPosition = getLayoutPosition();
                    Toast.makeText(mContext, "" + itemPosition, Toast.LENGTH_SHORT).show();

                }
            });
        }



এটা আমার জন্য কাজ করেছে:

@Override
public void onBindViewHolder(PlacesListViewAdapter.ViewHolder holder, int position) {
    ----
    ----
    ----
    // Set setOnClickListener(holder);
}


@Override
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

    ----
    ----
    ----

    @Override
    public void onClick(View view) {
        // Use to get the item clicked getAdapterPosition()
    }
}



এটা আমার জন্য কাজ করে। এটা সাহায্য করবে আশা করি। সবচেয়ে সহজ উপায়।

ভিতরে ধারক দেখুন

class GeneralViewHolder extends RecyclerView.ViewHolder {
    View cachedView = null;

    public GeneralViewHolder(View itemView) {
        super(itemView);
        cachedView = itemView;
    }

অনবিন্দুহোল্ডারে ()

@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {
            final GeneralViewHolder generalViewHolder = (GeneralViewHolder) holder;
            generalViewHolder.cachedView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Toast.makeText(context, "item Clicked at "+position, Toast.LENGTH_SHORT).show();
                }
            });

এবং আমাকে জানাবেন, এই সমাধান সম্পর্কে আপনার কোন প্রশ্ন আছে?




ইন্টারফেস View.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();
        }
    }



আমি অ্যান্ড্রয়েড পুনর্ব্যবহারযোগ্য ভিউ আইটেম হ্যান্ডেল করার জন্য একটি লাইব্রেরি লিখেছেন ইভেন্ট ক্লিক করুন। আপনি https://github.com/ChathuraHettiarachchi/RecycleClick সম্পূর্ণ টিউটোরিয়ালটি সন্ধান করতে পারেন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
            }
        });

বা আইটেম দীর্ঘ লম্বা প্রেস হ্যান্ডেল ব্যবহার করতে পারেন

RecycleClick.addTo(YOUR_RECYCLEVIEW).setOnItemLongClickListener(new RecycleClick.OnItemLongClickListener() {
            @Override
            public boolean onItemLongClicked(RecyclerView recyclerView, int position, View v) {
                // YOUR CODE
                return true;
            }
        });



আমি এই ভাবে পছন্দ করি এবং আমি এটি ব্যবহার করছি

ভিতরে

public Adapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType)

রাখুন

View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.view_image_and_text, parent, false);
v.setOnClickListener(new MyOnClickListener());

এবং আপনি চান যেখানে এই বর্গ তৈরি

class MyOnClickListener implements View.OnClickListener {
    @Override
    public void onClick(View v) {
       int itemPosition = recyclerView.indexOfChild(v);
       Log.e("Clicked and Position is ",String.valueOf(itemPosition));
    }
}

আমি আগে একটি ভাল উপায় আছে যে পড়া আছে কিন্তু আমি এই ভাবে সহজ এবং জটিল নয় পছন্দ। আমি আশা করি এটা আপনাকে সাহায্য করবে ..!






Related