adapter.notifyDataSetChange () не работает - PullRequest
0 голосов
/ 04 мая 2018

У меня есть просмотрщик и он состоит из нескольких строк. В каждой строке есть изображение (форма сердца) для симпатий и неприязни, и мне нужно каждый раз менять изображение просмотра изображения одним кликом. Когда я запускаю это действие и мои списки устанавливаются, оно работает хорошо, и изображение изменяется при нажатии на просмотр изображений, но проблема в том, что когда я начинаю другое действие и возвращаюсь к этому действию, onclick не работает. Кажется, мой адаптер не уведомляет данные! Это мой код после нажатия на изображение:

public static void afterLikeChanged(Post post) {
    if (!post.getPostIsLikedByYou()) {
        post.setPostIsLikedByYou(true);
    } else {
        post.setPostIsLikedByYou(false);
    }
    mAdapter.notifyDataSetChanged();
}

и на другой стороне в классе адаптера:

boolean isliked = post.getPostIsLikedByYou();
if (!isliked) {
    holder.imglike.setImageResource(R.drawable.btn_like);
} else {
    holder.imglike.setImageResource(R.drawable.btn_liked);
}

Есть идеи, ребята?!

Ответы [ 5 ]

0 голосов
/ 11 мая 2018

Наконец-то я нашел решение! Проблема была в том, что у меня была эта строка в onResume:

mAdapter = new RecyclerViewAdapterQuestions(this, arrayList);

َ После удаления этой строки проблема была решена! Кажется, в этом разделе мой адаптер сбрасывался с новыми данными, а не с моим предыдущим массивом! Спасибо, что ответили мне:)

0 голосов
/ 04 мая 2018

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

Важно следить за тем, что вы сохранили.

Ваш класс адаптера. В нем отсутствует много кода, но что-то вроде этого.

List<Post> posts; // init this in constructor

public void update(List<Post> posts) {
    // do some nullchecking, maybe clone the posts. It's sent as a reference now. 
    this.posts = posts; 
    notifyDataSetChanged();
}

@Override
public void onBindViewHolder(final MyViewHolder viewHolder, int position) {
    final Post post = posts.get(position);
    if (post != null) {
        if (post.isLiked()) {
            holder.imglike.setImageResource(R.drawable.btn_liked);  
        } else {
            holder.imglike.setImageResource(R.drawable.btn_like); // change name of this
        }
    }
}

public void afterLikeChanged(Post post) {
    post.setIsLiked(!post.isLiked());
    notifyDataChanged();
}

class MyViewHolder extends RecyclerView.ViewHolder {
    // super, etc...

    // this is a lazy way to use it, not safe. 
    // You should create a listener that sends back the getAdapterPosition()
    itemView.setOnClickListener(v -> afterLikeChanged(posts.get(getAdapterPosition())));
}

Теперь убедитесь, что вы правильно подключили адаптер к ресиверу. Если это работает в первый раз, а не во второй раз, кажется, что вы подключаете вещи в неправильных местах. Вместо этого используйте onPause и onResume.

0 голосов
/ 04 мая 2018

Вы не можете просто так звонить. Пожалуйста, попробуйте следующие шаги:

  1. Предположим, ваша текущая активность - A. Вы переключитесь на активность с именем B
  2. Использование startActivityForResult (B.class, 0x0) вместо startActivity
  3. Реализуйте это в упражнении A:

логическое значение getPostIsLikedByYou = false; // Это переменная, которую вы получаете новое значение из действия B

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // Check which request we're responding to
    if (requestCode == 0x0) {
        // Make sure the request was successful
        if (resultCode == RESULT_OK) {
            getPostIsLikedByYou = data.getBoolean("getPostIsLikedByYou");      
        }
    }
}
  1. Из упражнения B, сделайте это, когда вернетесь:

    Intent resultIntent = new Intent (); введите код сюда resultIntent.putBoolean ("getPostIsLikedByYou", "your_value_here"); setResult (Activity.RESULT_OK, resultIntent);

Надеюсь, эта помощь.

0 голосов
/ 04 мая 2018

сделать интерфейс в адаптере для события «нравится» и «не нравится», как показано ниже. Примечание: возьмите логическое значение для like или like и настройте getter.

    onItemClickListner onItemClickListner;

public interface onItemClickListner {
    void onClick(User str);//pass your object types.
}
public void setOnItemClickListner(RecyclerViewAdpater.onItemClickListner onItemClickListner) {
    this.onItemClickListner = onItemClickListner;
}
    @Override
public void onBindViewHolder(ItemViewHolder holder, int position) {
    // below code handle click event on recycler view item.
    User data=userlist.get(position);
    if (!data.isliked()) {
        holder.imglike.setImageResource(R.drawable.btn_like);
    } else {
        holder.imglike.setImageResource(R.drawable.btn_liked);
    }
    holder.imageHeart.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            onItemClickListner.onClick(data);
        }
    });
}

затем после установки адаптера в вызов recylcerview ниже кода ..

   recyclerViewAdpater.setOnItemClickListner(new RecyclerViewAdpater.onItemClickListner() {
       @Override
       public void onClick(User str) {
           if (str.isLike()){
               str.setLike(false);
           }
           else{
               str.setLike(true);
           }
           recyclerViewAdpater.notifyDataSetChanged();
       }
   });
0 голосов
/ 04 мая 2018

Вам необходимо обновить список сообщений, прежде чем уведомить адаптер

Примерно так:

public static void afterLikeChanged(int position, Post post) {
    if (!post.getPostIsLikedByYou()) {
        post.setPostIsLikedByYou(true);
    } else {
        post.setPostIsLikedByYou(false);
    }
    // postList is a ArrayList that you passed to your adapter
    postList.set(position, post);
    mAdapter.notifyDataSetChanged();
}
...