android - studio - Recyclerview+proveedor de contenido+CursorLoader
sqlite android studio example (3)
Creo que puedes usar directamente el CursorAdapter
personalizado para RecyclerView
para que no tengas que convertir el cursor en ArrayList :
public class ProductListAdapter extends RecyclerView.Adapter<ProductListAdapter.ViewHolder> {
// Because RecyclerView.Adapter in its current form doesn''t natively
// support cursors, we wrap a CursorAdapter that will do all the job
// for us.
CursorAdapter mCursorAdapter;
Activity mContext;
Random rnd;
public ProductListAdapter(AppCompatActivity context, Cursor c) {
mContext = context;
rnd = new Random();
mCursorAdapter = new CursorAdapter(mContext, c, 0) {
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
// Inflate the view here
LayoutInflater inflater = (LayoutInflater) context.getSystemService( Context.LAYOUT_INFLATER_SERVICE );
return inflater.inflate(R.layout.row_product_layout_grid, parent, false);
}
@Override
public void bindView(View view, Context context, Cursor cursor) {
String productName = cursor.getString(cursor.getColumnIndex(TProduct.PRODUCT_NAME));
// Binding operations
((TextView) view.findViewById(R.id.sub_product_name_text_view)).setText(productName);
int color = Color.argb(200, rnd.nextInt(256), rnd.nextInt(256), rnd.nextInt(256));
String url = "http://dummyimage.com/300/" + color + "/ffffff&text=" + (cursor.getPosition() + 1);
Picasso
.with(context)
.load(url)
.placeholder(R.mipmap.ic_launcher) // can also be a drawable
.into((ImageView) view.findViewById(R.id.sub_product_image_view));
}
};
}
public void reQuery(Cursor c) {
if (mCursorAdapter != null) {
mCursorAdapter.changeCursor(c);
mCursorAdapter.notifyDataSetChanged();
}
}
@Override
public int getItemCount() {
return mCursorAdapter.getCount();
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
// Passing the binding operation to cursor loader
mCursorAdapter.getCursor().moveToPosition(position); //EDITED: added this line as suggested in the comments below, thanks :)
mCursorAdapter.bindView(holder.view, mContext, mCursorAdapter.getCursor());
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
// Passing the inflater job to the cursor-adapter
View v = mCursorAdapter.newView(mContext, mCursorAdapter.getCursor(), parent);
return new ViewHolder(v);
}
public static class ViewHolder extends RecyclerView.ViewHolder {
View view;
public ViewHolder(View itemView) {
super(itemView);
view = itemView.findViewById(R.id.product_row_card_view);
}
}
}
Que te sea de utilidad. :)
Tengo algunos datos en la base de datos SQLite. Tengo un proveedor de contenido que obtendrá los datos de la base de datos. Ahora el problema es ¿cómo implemento el cursorLoader para trabajar en mano con recyclerview?
Además, cualquier persona puede explicar por qué necesitamos transferir los datos del cursor a un objeto para mostrarlos en una vista de lista / reciclaje y no directamente desde un cursor.
Por ejemplo, en la clase personalizada cursorAdapter,
Person person = new Person(cursor.getString(cursor.getColumnIndexOrThrow(PERSON_NAME)));
textview.setText = person.getName();
O
textview.setText = cursor.getString(cursor.getColumnIndexOrThrow(PERSON_NAME));
¿Cuál de los métodos anteriores es mejor?
En el pasado, solíamos tener listview y gridview y parece que ahora se combinan para convertirse en recyclerview. Entonces, ¿cómo implemento un recyclerview basado en grid?
En general, debe intentar separar las responsabilidades de vista y datos. Entonces, lo que necesita es obtener todos sus objetos de la base de datos por adelantado y luego configurar un Adaptador que se parece a lo siguiente:
public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.ViewHolder> {
private final List<Person> objectList = new ArrayList<>();
@Override
public CustomAdapter.ViewHolder onCreateViewHolder(final ViewGroup parent, final int viewType) {
final LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
return new ViewHolder(layoutInflater.inflate(R.layout.adapter_item, parent, false));
}
@Override
public void onBindViewHolder(final CustomAdapter.ViewHolder holder, final int position) {
holder.bindItem(objectList.get(position));
}
// Set the persons for your adapter
public void setItems(final List<Person> persons) {
objectList.addAll(persons);
notifyDataSetChanged();
}
@Override
public int getItemCount() {
return objectList.size();
}
public static class ViewHolder extends RecyclerView.ViewHolder {
private final TextView mTextViewTitle;
private Object mObject;
public ViewHolder(final View itemView) {
super(itemView);
mTextViewTitle = (TextView) itemView.findViewById(R.id.view_item_textViewTitle);
mTextViewTitle.setText(mObject.getText());
}
private void bindItem(@NonNull final Person object) {
mObject = object;
}
}
}
Luego puede enlazar el adaptador al RecyclerView mediante:
final CustomAdapter adapter = new CustomAdapter();
adapter.setItems(mPersons);
mRecyclerView.setAdapter();
Para responder a su segunda pregunta ("En el pasado, solíamos tener listview y gridview y parece que ahora se combinan para convertirse en recyclerview. Entonces, ¿cómo implemento una recyclerview basada en cuadrícula?"):
Al vincular un LayoutManager a RecyclerView, puedes decidir cuál tomas:
final LinearLayoutManager layoutManager = new LinearLayoutManager(this);
mRecyclerView.setLayoutManager(layoutManager);
o
final GridLayoutManager layoutManager = new GridLayoutManager(this, COLUMN_SPAN_COUNT);
mRecyclerView.setLayoutManager(layoutManager);
Hay varios LayoutManagers. Descubre más here .
ACTUALIZACIÓN: no tiene que cargar todos los elementos por adelantado, simplemente cambie el nombre de setItems a addItems y estará listo para comenzar