Несколько ViewHolder RecycleVIew Список переставить - PullRequest
0 голосов
/ 01 июня 2018

Я пытался найти решение, но я думаю, что ни у кого не было такой проблемы.

Так что я использовал ListView в большинстве своих проектов, и я чувствую, что он более гибок с точки зрения отсутствия необходимостиBind с ViewHolder, как вам нужно сделать в RecyclerView.Но так как мне нужно было сделать горизонтальный listview, я мог бы легко сделать это с LayoutManager, используя RecyclerView.Работает отлично.

Но теперь я использую несколько ViewHolders для RecyclerView, потому что мне нужно отображать различные виды для различных элементов RecyclerView.Он снова работает отлично, используя код ниже.

public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    private List<Item> data;
    private Context context;

    // Item.Type is an enum, used to differentiate the view types.

    public MyAdapter(List<Item> list, Context context) {
        this.data = list;
        this.context = context;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        if(data.get(viewType).getType() == TYPEA) {
            View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.type_a, parent, false);
            return new ViewHolderA(itemView);
        }
        else {
            View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.type_b, parent, false);
            return new ViewHolderB(itemView);
        }
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        if ( data.get(position).getType()== TYPEA ){
            ViewHolderA viewHolder = (ViewHolderA) holder;
            ...

        }
        else if (data.get(position).getType()== TYPEB){
            ViewHolderB viewHolder = ((ViewHolderB) holder);
            ...            
        }
    }


    @Override
    public int getItemViewType(int position) {        
        return position;
    }


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

}

Таким образом, проблема возникает, когда я переставляю список, используемый для отображения элементов.Например, я начинаю с 1 элемента в списке TYPEB, он отображается правильно.Но теперь я хочу добавить новый элемент в список, но с самого начала, чтобы отодвинуть TYPEB.Поэтому я добавляю новый элемент TYPEA и список выглядит как [TYPEA,TYPEB].ViewHolderA для TYPEA и аналогично ViewHolderB для TYPEB

В этой ситуации строка внутри onBindViewHolder

ViewHolderA viewHolder = (ViewHolderA) holder;

выдает мне сообщение о том, что ViewHolderBне может быть приведено к ViewHolderA.Это показывает, что после перестановки списка адаптер вызывает onBindViewHolder с неправильным ViewHolder экземпляром против positon.Есть идеи, как к этому подойти.

1 Ответ

0 голосов
/ 01 июня 2018

Здесь вам нужно указать уникальный идентификатор, вам не нужно возвращать позицию:

@Override
public int getItemViewType(int position) {        
    return data.get(position).getType()
}

И, конечно, вы должны использовать параметр viewType как тип, а не как позицию:

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    if(viewType == TYPEA) {
        View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.type_a, parent, false);
        return new ViewHolderA(itemView);
    }
    else {
        View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.type_b, parent, false);
        return new ViewHolderB(itemView);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...