Создание обобщенного c PagedListAdapter с использованием библиотеки подкачки android - PullRequest
0 голосов
/ 13 января 2020

В моем приложении более 4 списков различных моделей данных.
Я хочу создать более обобщенный c CommonAdapter, расширяющий PagedListAdapter
Вот мой текущий код

public abstract class CommonPagedListAdapter<T, VH extends RecyclerView.ViewHolder>
        extends PagedListAdapter<T, VH> {

    private Context mContext;
    private ArrayList<T> mArrayList;

    public abstract void onItemClick(T model, int position);
    public abstract int getLayoutResId();

    protected CommonPagedListAdapter(Context context, ArrayList<T> arrayList,
                                     @NonNull DiffUtil.ItemCallback<T> diffCallback) {
        super(diffCallback);
        this.mContext  = context;
        this.mArrayList = arrayList;
    }

    @NonNull
    @Override
    public VH onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        //what should i return here?
        View view = LayoutInflater.from(mContext).inflate(getLayoutResId(),parent,false);
        return (VH) new ItemViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull VH holder, int position) {
        //what should i do here?
//        holder
    }

    class ItemViewHolder extends RecyclerView.ViewHolder {

        public ItemViewHolder(@NonNull View itemView) {
            super(itemView);
        }
    }
}

Я использую PagelListAdapter из Android Библиотеки пейджинга
Я хотел бы знать несколько вещей:
- Что должно быть установлено в onCreateViewHolder, поскольку у меня будут разные ViewHolders?
- Что следует установить в onBindViewHolder?
- Действительно ли это правильный путь, который делает CommonPagedListAdapter расширяемым и обслуживаемым?

1 Ответ

0 голосов
/ 17 февраля 2020

У меня была похожая проблема, когда я пытался создать один адаптер для нескольких типов списков. В конечном итоге я пришел к выводу, что лучше использовать отдельный адаптер для каждого типа списка исключительно потому, что в нем не нужно создавать очень большой «общий» класс адаптера, который идет вразрез с принципом «единой ответственности». Таким образом, каждый адаптер намного меньше, удобнее в обслуживании и гибкости.

Однако, если вы действительно хотите использовать один адаптер для похожих элементов, я обычно делаю это, создавая уникальные ViewHolders для каждого элемента. тип элемента и затем связывание их соответственно в onBindViewHolder с помощью оператора switch или чего-то подобного. Чтобы сделать это, вам нужно переопределить дополнительный метод с именем * 1003. * в вашем адаптере.

Существует очень хорошее руководство, в котором рассказывается, как создать адаптер, который может обрабатывать различные типы представлений в Codepath: https://guides.codepath.com/android/Heterogenous-Layouts-inside-RecyclerView

...