Как использовать строки в RecyclerView? - PullRequest
0 голосов
/ 29 апреля 2018

Я пытаюсь использовать разные String для каждого элемента в RecyclerView, но моя программа всегда берет первый String, который я вставил в ArrayList, независимо от того, на какой элемент я нажимаю на:

   @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, final int viewType) {
       final View v = LayoutInflater.from(mContext).inflate(R.layout.cardview, null);
        final ContentMain contentMain = mData.get(viewType);

              v.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {

                        Toast.makeText(v.getContext(), contentMain.getMyContent(),
                                Toast.LENGTH_LONG).show();
                    }
             }    

        ViewHolder vHolder = new ViewHolder(v);
        return vHolder;
    }

    @Override
    public void onBindViewHolder(final ViewHolder holder, final int position) {
        final ContentMain contentMain = mData.get(position);
        holder.myContent= mData.get(position).getMyContent();
}

Ответы [ 2 ]

0 голосов
/ 29 апреля 2018

Получить данные внутри onClick().

Вы получаете данные, используя position при создании ViewHolder. Это даст неправильное значение position, так как recyclerview должно вычислять размеры компоновки

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int position) {

    final View v = LayoutInflater.from(mContext).inflate(R.layout.cardview, parent, false); //Avoid inflate layout with null parent


    v.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            final ContentMain contentMain = mData.get(getAdapterPosition());
            Toast.makeText(v.getContext(), contentMain.getMyContent(), Toast.LENGTH_LONG).show();
        }
    }    

    ViewHolder vHolder = new ViewHolder(v);
    return vHolder;
}

EDIT:

Возможно, вы должны определить прослушиватели кликов внутри ViewHolder -

public static ViewHolder extends RecyclerView.ViewHolder {
    public ViewHolder(View v) {
        v.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                // Do you stuffs here...
            }
        }
    }
}
0 голосов
/ 29 апреля 2018

Вы не должны связывать onClickListener в onCreateViewHolder. Цель onCreateViewHolder - создать ViewHolder и не привязывать к нему информацию.

следующий код в onCreateViewHolder:

final ContentMain contentMain = mData.get(viewType);

Всегда будет возвращать первый элемент, потому что ваш viewType равен 0. Это не описывает позицию.

Переместите этот код в onBindViewHolder следующим образом:

  @Override
  public void onBindViewHolder(final ViewHolder holder, final int position) {
        final ContentMain contentMain = mData.get(position);
        holder.myContent= mData.get(position).getMyContent();

        holder.itemView.setOnClickListener(new View.OnClickListener() {
             public void onClick(View v) {
                Toast.makeText(v.getContext(), contentMain.getMyContent(),Toast.LENGTH_LONG).show();
             }
        });    
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...