Как организовать работу связки 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);
}
}
.
– Vyacheslav Doroshenko
Feb 29 '20 at 13:33