29
Фев
2020

Как организовать работу Loader + Cursor + RecycleView c разными ItemView

Как организовать работу связки Loader + Cursor + RecycleView c разными ItemView

Представим ситуацию есть основная активность с loader'ом который берет данные из БД и кидает Cursor в Adapter как реализовать логику набивки данных в адаптере? использовать верный ViewHolder? Есть метод getItemViewType(int position) который я так понимаю создан для подобных случаев , но не могу понять как его использовать в случае с Cursor? брать данные из 2-3 таблиц и выводить в одном RecycleView ? Какой подход будет правильный ? Пример кода ↓

                              ##CODE MainActivity ↓
 @Override
public Loader<Cursor> onCreateLoader(int id, @Nullable Bundle args) {
            switch (id) {
                case NAME_UNIQUE_LOADER:
                    String[] projection = {
                            UtilContract.KEY_ID,
                            Magic.COLUMN_HEAD_NAME,
                            Magic.COLUMN_TITLE_NAME,
                            Magic.COLUMN_DATA_FILTER
                    };
                    String selection = Magic.COLUMN_DATA_FILTER + " LIKE  \"%-" + filterMonth + "-%\"";
                    String[] selectionArgs = {""};
                    CursorLoader cursorLoader = new CursorLoader(this,
                            Magic.CONTENT_URI,
                            projection,
                            selection,
                            null,
                            Magic.COLUMN_DATA_FILTER + " DESC"
                    );
                    return cursorLoader;
                case EMPTY_UNIQUE_LOADER:
                        String[] projectionEmpty = {
                                UtilContract.KEY_ID,
                                EmptyTable.EMPTY_HEAD_NAME,
                                EmptyTable.EMPTY_TITLE_NAME,
                        };
                        CursorLoader cursorLoaderEmpty = new CursorLoader(this,
                                EmptyTable.CONTENT_URI,
                                projectionEmpty,
                                null,null,null);
                        return cursorLoaderEmpty;
            default:
                return new Loader<>(this);
            }
}
@Override
public void onLoadFinished(@NonNull Loader<Cursor> loader, Cursor data) {
    adapter.setCursor(data);
}
@Override
public void onLoaderReset(@NonNull Loader<Cursor> loader) {
    adapter.setCursor(null);

}
                              ##CODE AdapterActivity ↓<code>
private Cursor mCursor;
private onClickItem mListener;

public RecycleCursorAdapter(onClickItem listener) {
    mListener = listener;
}

@Override
public VH onCreateViewHolder(ViewGroup parent, int viewType) {
    View v = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.item, parent, false);

    final VH vh = new VH(v);
    v.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            int position = vh.getAdapterPosition();
            mCursor.moveToPosition(position);
            if (mListener != null) mListener.itemForClick(mCursor);
        }
    });

    return vh;
}

@Override
public void onBindViewHolder(VH holder, int position) {
    mCursor.moveToPosition(position);
    ## набивка в зависимости от типа
    if(getItemViewType(position) == ITEM_VIEW_TYPE_0){

        String HeadText = mCursor.getString(mCursor.getColumnIndex(EmptyTable.EMPTY_HEAD_NAME));
        String TitleText = mCursor.getString(mCursor.getColumnIndex(EmptyTable.TABLE_NAME));
        String DataFilter = mCursor.getString(mCursor.getColumnIndex(EmptyTable.EMPTY_TITLE_NAME));

        holder.HeadStat.setText(HeadText);
        holder.TitleStat.setText(TitleText);
        holder.DataFilterTxt.setText(DataFilter);
    }else if(getItemViewType(position) == ITEM_VIEW_TYPE_1) {

        String HeadText = mCursor.getString(mCursor.getColumnIndex(Magic.COLUMN_HEAD_NAME));
        String TitleText = mCursor.getString(mCursor.getColumnIndex(Magic.COLUMN_TITLE_NAME));
        String DataFilter = mCursor.getString(mCursor.getColumnIndex(Magic.COLUMN_DATA_FILTER));

        holder.HeadStat.setText(HeadText);
        holder.TitleStat.setText(TitleText);
        holder.DataFilterTxt.setText(DataFilter);
    }
}

@Override
public int getItemCount() {
    return (mCursor != null) ? mCursor.getCount() : 0;
}

@Override
public int getItemViewType(int position) {
   ##TODO Как-то определить тип View 
}

@Override
public long getItemId(int position) {
    if (mCursor != null) {
        if (mCursor.moveToPosition(position)) {
            int idx_id = mCursor.getColumnIndex(Magic._ID);
            return mCursor.getLong(idx_id);
        } else {
            return 0;
        }
    } else {
        return 0;
    }
}

public Cursor getCursor() {
    return mCursor;
}

public void setCursor(Cursor newCursor) {
    mCursor = newCursor;
    notifyDataSetChanged();
}

public interface onClickItem {
    void itemForClick(Cursor cursor);
}
 // карточка для примера одна  но понимаю что нужно 2 ViewHolder для разных ItemView
public static class VH extends RecyclerView.ViewHolder {
    public TextView HeadStat;
    public TextView TitleStat;
    public TextView DataFilterTxt;

    public VH(View v) {
        super(v);
        HeadStat = v.findViewById(R.id.HeadStat);
        TitleStat = v.findViewById(R.id.TitleStat);
        DataFilterTxt = v.findViewById(R.id.show_data_filter);
    }

}

Источник: https://ru.stackoverflow.com/questions/1088825/%D0%9A%D0%B0%D0%BA-%D0%BE%D1%80%D0%B3%D0%B0%D0%BD%D0%B8%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D1%8C-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%83-loader-cursor-recycleview-c-%D1%80%D0%B0%D0%B7%D0%BD%D1%8B%D0%BC%D0%B8-itemview
Share

Тебе может это понравится...