В моем адаптере я не могу изменить определенное значение в моем onClickListener - PullRequest
2 голосов
/ 28 марта 2019

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

Я хочу, чтобы, если пользователь нажимает на изображение, второе изображение заменяло первое, но я не могу также изменить изображение вimageview, я полагаю, что это та же проблема, что и со строкой, которую я не могу изменить.

Спасибо за любую помощь!


    private List<cards> listItems;
    private Context context;


    public arrayAdapter(List<cards> listItems, Context context) {
        this.listItems = listItems;
        this.context = context;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item, viewGroup, false);
        return new ViewHolder(v);
    }

    @SuppressLint("SetTextI18n")
    @Override
    public void onBindViewHolder(@NonNull final ViewHolder viewHolder, int i) {
        final cards currentItem = listItems.get(i);

        viewHolder.name.setText(currentItem.getName());
        viewHolder.comment.setText(currentItem.getComment());


        Picasso.get().load(currentItem.getProfileImageUrl()).into(viewHolder.image);

        viewHolder.name.setText("this work"); // here it works

        viewHolder.image.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

               //Try this
                 currentItem.setName("New text");
                  notifyDataSetChanged();


               //viewHolder.name.setText("New text"); // this does not work
               // viewHolder.name.setVisibility(View.INVISIBLE); this does work
                Picasso.get().load(currentItem.getProfileImageUrl2()).into(viewHolder.image); // does not work
            }
        });

    }

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

    public class ViewHolder extends RecyclerView.ViewHolder {

        TextView name, comment, howMany;
        public ImageView image;


        /**
         * @param itemView
         */
        ViewHolder(@NonNull View itemView) {
            super(itemView);
            name = (TextView) itemView.findViewById(R.id.name);
            image = (ImageView) itemView.findViewById(R.id.image);
            comment = (TextView) itemView.findViewById(R.id.commentText);
        }
    }


}

Ответы [ 4 ]

3 голосов
/ 28 марта 2019

Вам следует позвонить notifyItemChanged с соответствующей позиции.

   @Override
   public void onBindViewHolder(final ViewHolder viewHolder, int position) {
    final cards currentItem = listItems.get(i);

    viewHolder.name.setText(currentItem.getName());
    viewHolder.comment.setText(currentItem.getComment());


    Picasso.get().load(currentItem.getProfileImageUrl()).into(viewHolder.image);

    viewHolder.name.setText("this work"); // here it works

    viewHolder.image.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
           viewHolder.name.setText("New text"); // this does not work
           // viewHolder.name.setVisibility(View.INVISIBLE); this does work
            Picasso.get().load(currentItem.getProfileImageUrl2()).into(viewHolder.image); // does not work

   notifyItemChanged(position);
        }
    });

}
1 голос
/ 28 марта 2019

изменить значение в вашем списке в определенной позиции, а затем notifyItemChanged (position);в вашем событии клика напишите это:

currentItem.setName("abc");
notifyItemChanged(position) 
0 голосов
/ 28 марта 2019

Привет, вы также можете использовать этот подход.

@ Переопределить public void onBindViewHolder (final ViewHolder viewHolder, int position) {final cards currentItem = listItems.get (i);

viewHolder.name.setText(currentItem.getName());
viewHolder.comment.setText(currentItem.getComment());


Picasso.get().load(currentItem.getProfileImageUrl()).into(viewHolder.image);

viewHolder.name.setText("this work"); // here it works

viewHolder.image.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
       ViewHolder viewNewHolder=viewHolder
       viewNewHolder.name.setText("New text"); 

Picasso.get () нагрузка (currentItem.getProfileImageUrl2 ()) в (viewNewHolder.image)..;}});

}

Я использовал его в работе.

******* All The Best *********

0 голосов
/ 28 марта 2019

В модели данных у вас есть переменная, которая указывает текущее изображение профиля.

для примера

 class cards {
      String name;
      String comment;
      ....
      boolean profileImageChanged;
    }

, затем внутри onBindViewHolder

    @SuppressLint("SetTextI18n")
        @Override
        public void onBindViewHolder(@NonNull final ViewHolder viewHolder, int i) {
           ....

           if(currentItem.profileImageChanged){
             Picasso.get()
             .load(currentItem.getProfileImageUrl()).into(viewHolder.image);
           } else {
             Picasso.get()
             .load(currentItem.getProfileImageUrl2()).into(viewHolder.image);
           }

            viewHolder.name.setText("this work"); // here it works

            viewHolder.image.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                   viewHolder.name.setText("New text"); // this does not work
                   // viewHolder.name.setVisibility(View.INVISIBLE); this does work
                   notifyItemChanged(position);
                }
            });

        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...