Определение RecyclerView onCLickListener в действии

RecyclerView отличается от ListView, потому что он не предлагает класс onItemCLickListener для обработки событий щелчка.

Это можно решить, если не много происходит за кулисами при щелчке элемента, путем определения onClickListener в ViewHolder.

Что делать, если текст или что-то еще, что должно быть передано следующему действию, действительно не существует в представлениях, к которым имеет доступ ViewHolder, но скорее является частью Activity, которая имеет RecyclerView?

В этом случае, onClickListener должен быть реализован внутри действия, чтобы текст мог быть перенаправлен. Возможно.

  1. Один из способов - добавить невидимый взгляд, удерживающий этот текст, а затем делать то, что было сделано раньше; реализация onClickListener в адаптере.

  2. Передайте этот текст, как-то, адаптеру.

Как может "2." быть реализованы?

Ответ 1

Напишите публичную функцию в своей деятельности, например:

public void onClickCalled(String anyValue) {
    // Call another acitivty here and pass some arguments to it.
}

Теперь в вашем адаптере onClick funciton

@Override
public void onClick(View view) {
    ((YouActivityClass) context).onClickCalled("your argument here");
}

Ответ 2

См. Пример ниже, чтобы создать RecyclerView OnClick.

Пример кода:

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);
        Picasso.with(itemView.getContext()).load(item.imageUrl).into(image);
        itemView.setOnClickListener(new View.OnClickListener() {
            @Override public void onClick(View v) {
                listener.onItemClick(item);
            }
        });
    }
}
}

И используйте адаптер RecyclerView используя следующий код:

recycler.setAdapter(new ContentAdapter(items, new ContentAdapter.OnItemClickListener() {
@Override public void onItemClick(ContentItem item) {
    Toast.makeText(getContext(), "Item Clicked", Toast.LENGTH_LONG).show();
}
}));

См. Раздел Установка прослушивателя кликов в RecyclerView

Надеюсь, это тебе помогло.

Ответ 3

Это можно решить, создав собственный слушатель и передав его адаптеру.

public interface PositionClickListener
{
    void itemClicked(int position);
}

Активность может реализовать этот интерфейс или создать экземпляр анонимного внутреннего класса. Таким образом, ваш адаптер может выглядеть так:

public class MyRecyclerAdapter extends RecyclerView.Adapter
{
    public final PositionClickListener listener;

    public MyRecyclerAdapter(PositionClickListener listener)
    {
         this.listener = listener;
    }

    private void createView(int position)
    {
        View v = new View();
        v.setOnClickListener(new OnClickListener(){
            listener.itemClicked(position);
        });
    }
}

Ответ 4

Где ListView имеет onItemClickListener, RecyclerView имеет addOnItemTouchListener.

Вы можете предоставить слушателю представление recycler изнутри действия, таким образом, область охвата будет такова, что слушатель должен иметь возможность ссылаться на текст.

Вы можете использовать что-то вроде следующей реализации OnItemTouchListener, которая также работает для захвата левого и правого штрихов.

public class RecyclerTouchListener implements RecyclerView.OnItemTouchListener {

    private static final String TAG = "RecyclerTouchListener";

    private static final int SWIPE_MIN_DISTANCE = 120;
    private static final int SWIPE_THRESHOLD_VELOCITY = 200;
    private static final int SWIPE_MAX_OFF_PATH = 250;

    private OnTouchActionListener mOnTouchActionListener;
    private GestureDetectorCompat mGestureDetector;

    public static interface OnTouchActionListener {
        public void onLeftSwipe(View view, int position);
        public void onRightSwipe(View view, int position);
        public void onClick(View view, int position);
    }

    public RecyclerTouchListener(Context context, final RecyclerView recyclerView,
                             OnTouchActionListener onTouchActionListener){

        mOnTouchActionListener = onTouchActionListener;
        mGestureDetector = new GestureDetectorCompat(context,new GestureDetector.SimpleOnGestureListener(){

        @Override
        public boolean onSingleTapConfirmed(MotionEvent e) {
            Log.d(TAG, "On Single Tap Confirmed");
            // Find the item view that was swiped based on the coordinates
            View child = recyclerView.findChildViewUnder(e.getX(), e.getY());
            int childPosition = recyclerView.getChildPosition(child);
            mOnTouchActionListener.onClick(child, childPosition);
            return false;
        }

        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2,
                               float velocityX, float velocityY) {
            Log.d(TAG, "onFling: " + e1.toString() + e2.toString());

            try {
                if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH) {
                    return false;
                }

                // Find the item view that was swiped based on the coordinates
                View child = recyclerView.findChildViewUnder(e1.getX(), e1.getY());
                int childPosition = recyclerView.getChildPosition(child);

                // right to left swipe
                if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {

                    Log.d(TAG, "Left Swipe");
                    if (mOnTouchActionListener != null && child != null) {
                        mOnTouchActionListener.onLeftSwipe(child, childPosition);
                    }

                } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
                    Log.d(TAG, "Right Swipe");
                    if (mOnTouchActionListener != null && child != null) {
                        mOnTouchActionListener.onRightSwipe(child, childPosition);
                    }
                }
            } catch (Exception e) {
                // nothing
            }

            return false;
        }
    });
}

    @Override
    public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
        mGestureDetector.onTouchEvent(e);
        return false;
    }

    @Override
    public void onTouchEvent(RecyclerView rv, MotionEvent e) {
    }

    @Override
    public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
        // do nothing
    }

}

Затем в вашей деятельности добавьте слушателя по строкам

 mRecyclerView.addOnItemTouchListener(
        new RecyclerTouchListener(getActivity(), mRecyclerView,
            new RecyclerTouchListener.OnTouchActionListener() {
                @Override
                public void onClick(View view, int position) {
                }
                @Override
                public void onRightSwipe(View view, int position) {
                }
                @Override
                public void onLeftSwipe(View view, int position) {
                }
            }))

Ответ 5

его легко, у нас нет интерфейсов для разработки, посмотрите на мой код, просто поместите этот маленький код, и мы

@Override
    public void onBindViewHolder(MyViewHolder holder, final int position) {
      holder.img.setImageDrawable(img[position%img.length]);
        holder.bodyPartName.setText(bodyPart[position]);
        if(position==0) {
            holder.itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Context c = v.getContext();
                    Intent intent = new Intent(c, BodyPartExcercise.class);
                    c.startActivity(intent);
                }
            });
        }
    }