1

Есть RecyclerView, находящийся во фрагменте. Он имеет количество лайков и кнопки нажатия лайков.

Проблема - при скролле вниз, цвета начинают прыгать по рандомным пальцам всех итемов списка, при повороте экрана все цвета вовсе сбрасываются.Сохранение информации при повороте экрана происходит за счет setRetainInstance()

Если нажать на палец вверх - он должен засветиться зеленым, противоположный палец вниз обязан стать серым, то же самое работает и в обратном порядке, нажимаешь дизлайк, палец вниз краснеет, палец вверх становится серым.

Я понимаю, что это далеко не самое лучшее решение, но опыта в таких вещах пока не очень много, было бы замечательно, если примерно приведете best practice к подобной ситуации, что-бы в будущем не писал такой зависимый код.

По идее хотел реализовать колбек, но по факту получилось нечто другое, но работающее.

public class LikesBtnClick implements View.OnClickListener, ThumbsListener {

private Word word;
private TextView likesView;
private ImageButton like;
private ThumbsListener subscriber;

private ThumbsListener getSubscriber() {
    return subscriber;
}

public void setSubscriber(ThumbsListener value) {
    subscriber = value;
}

public LikesBtnClick(Word word, TextView likesView, ImageButton like) {
    setWord(word);
    setLikesView(likesView);
    setLike(like);
    setSubscriber(subscriber);
}

public void setLikesView(TextView likesView) {
    this.likesView = likesView;
}

public void setWord(Word word) {
    this.word = word;
}

public void setLike(ImageButton like) {
    this.like = like;
}
public TextView getLikesView() {
    return likesView;
}

@Override
public void onClick(View v) {
    Log.d("Test", "сабскрайбер сработал");
    word.setLikes(word.getLikes() + 1);

    getLikesView().setText(Integer.toString(word.getLikes()));
    getSubscriber().callback(like);
}


@Override
public void callback(ImageButton dislike) {
    Log.d("Test","callback сработал");
    dislike.setImageResource(R.drawable.thumb_red_down);
    like.setImageResource(R.drawable.thumbupgrey);
}

Класс обрабатывающий дизлайк

class DislikesBtnClick implements View.OnClickListener, ThumbsListener {
private ImageButton dislike;
private Word word;
private TextView likesView;
private ThumbsListener subscriber;
private LikesBtnClick likesBtnClick;
private ThumbsListener getSubscriber() {
    return subscriber;
}

public void setSubscriber(ThumbsListener value) {
    subscriber = value;
}


public TextView getLikesView() {
    return likesView;
}

public void setDislikesView(TextView likesView) {
    this.likesView = likesView;
}

public Word getWord() {
    return word;
}

public void setDislike(ImageButton like){
    this.dislike = like;
}

public void setWord(Word word) {
    this.word = word;
}

public DislikesBtnClick(Word word, TextView likesView, ImageButton like) {
    setWord(word);
    setDislikesView(likesView);
    setDislike(like);
    setSubscriber(subscriber);

}

@Override
public void onClick(View v) {
    word.setLikes(word.getLikes() - 1);
    getLikesView().setText(Integer.toString(word.getLikes()));
    getSubscriber().callback(dislike);
}


@Override
public void callback(ImageButton like) {
    like.setImageResource(R.drawable.thumb_up_green);
    dislike.setImageResource(R.drawable.thumbdowngrey);

}

Класс фрагмента:

public class RecycleFragment extends Fragment {
private static final int LAYOUT = R.layout.fragment_recycle;
private View view;
private RecyclerView rvContacts;
private RvWordsAdapter adapter;
private List<Word> words;
private BottomSheetBehavior behavior;
private Context context;
private FrameLayout frameLayout;

public void setContext(Context context) {
    this.context = context;
}


@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    initRecyclerView(view, context, this.behavior);



public static RecycleFragment getInstance() {

    Bundle args = new Bundle();

    RecycleFragment recycleFragment = new RecycleFragment();
    recycleFragment.setArguments(args);

    return recycleFragment;
}

public void setBehaviorSheet(BottomSheetBehavior behavior, FrameLayout frameLayout) {
    this.behavior = behavior;
    Log.d("Sheet", "behavior setBehaviorSheet" + behavior.getState());
}

private List<Word> getWords() {
    if (words == null) {
        return createMock();
    }
    return words;
}


@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    view = inflater.inflate(LAYOUT, container, false);
    setRetainInstance(true);
    behavior = ((MainActivity) getActivity()).getBehavior();
    frameLayout = ((MainActivity) getActivity()).getFrameSheet();



    view.postDelayed(new Runnable() {
        @Override
        public void run() {

            subheader.setVisibility(View.GONE);

        }
    },5);

    Log.d("Sheet", "behavior onCreateView" + this.behavior);
    return view;
}

private void initRecyclerView(View view, Context context, BottomSheetBehavior behavior) {
    rvContacts = (RecyclerView) view.findViewById(R.id.rvWords);
    if (adapter == null) {
        adapter = new RvWordsAdapter(getWords(), getActivity(), behavior, frameLayout);
    }
    rvContacts.setLayoutManager(new LinearLayoutManager(getActivity()));
    rvContacts.setAdapter(adapter);


    frameLayout.setVisibility(View.VISIBLE);

}

private List<Word> createMock() {
    List<Word> content = new ArrayList<>();
    content.add(new Word("Force", 0));
    content.add(new Word("Strength", 0));
    content.add(new Word("Energy", 0));
    content.add(new Word("Influence", 0));
    content.add(new Word("Might", 0));
    content.add(new Word("Capacity", 0));
    content.add(new Word("Potency", 0));
    content.add(new Word("Force", 0));
    content.add(new Word("Strength", 0));
    content.add(new Word("Energy", 0));
    content.add(new Word("Force", 0));
    content.add(new Word("Strength", 0));
    content.add(new Word("Energy", 0));
    content.add(new Word("Influence", 0));
    content.add(new Word("Might", 0));
    content.add(new Word("Capacity", 0));
    content.add(new Word("Potency", 0));
    content.add(new Word("Force", 0));
    content.add(new Word("Strength", 0));
    content.add(new Word("Energy", 0));
    content.add(new Word("Force", 0));
    content.add(new Word("Strength", 0));
    content.add(new Word("Energy", 0));
    content.add(new Word("Influence", 0));
    content.add(new Word("Might", 0));
    content.add(new Word("Capacity", 0));
    content.add(new Word("Potency", 0));
    content.add(new Word("Force", 0));
    content.add(new Word("Strength", 0));
    content.add(new Word("Energy", 0));
    return content;

}
pavlofff
  • 36,765
Silento
  • 2,853
  • В адаптере вам нужно сохранять состояния ваших айтемов (данных, которые в них находятся) для каждого айтема, в какое то отдельное хранилище, а при отображении по данной позиции - востанавливать, так как при создании списка их View-представления постоянно переиспользуются для экономии ресурсов и памяти, соответственно их содержимое и "скачет". По этому вопросу уже много ответов, в частности смотрите про RecyclerView с Checkbox - смысл точно тот же. – pavlofff May 11 '16 at 10:40
  • Смотрите, например этот ответ – pavlofff May 11 '16 at 10:51
  • Спасибо большое, я даже близко не представлял, в чем проблема и поэтому гуглить то, не знаю что получалось. Теперь буду искать свое решение в этом направлении. – Silento May 11 '16 at 11:01

0 Answers0