tutorial studio recyclerview que libreria example espaƱol ejemplo conexion cardview android sqlite cursor android-contentprovider android-recyclerview

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


Hay varios proyectos / gists de Github como this y this que muestran tal caso de uso.

Mientras usaría un Adaptador que se adapta a medida a un adaptador de cursor, usaría un GridLayoutManager / LinearLayoutManager como de costumbre para el mismo.