How to fill recyclerview with cursor

0

Hello everyone I have implemented a sqlite, I returned the complete list in a course, before I filled it in a listview, but now I want to fill it in a recycler view.

I do not know where to start, to know if the cursor that I have serves me to fill the recycler.

ACTULIZATION

This is my class that extends from a CursorAdapter

public class ClientesCursorAdapter extends CursorAdapter {
public ClientesCursorAdapter(Context context, Cursor c) {
    super(context, c, 0);
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup viewGroup) {
    LayoutInflater inflater = LayoutInflater.from(context);
    return inflater.inflate(R.layout.item_cliente, viewGroup, false);
}
@Override
public void bindView(View view, final Context context, Cursor cursor) {
    TextView nombrecliente = (TextView) view.findViewById(R.id.text_cliente_nombre);
    TextView nombrelocal = (TextView) view.findViewById(R.id.text_nombre_negocio);
    ImageView btn_next= (ImageView) view.findViewById(R.id.img_btn_next_cliente);
    View mView =(View) view.findViewById(R.id.indicator_status);
    String nombre = cursor.getString(cursor.getColumnIndex(contracts.clienterEntry.Cnombre));
    String negocio = cursor.getString(cursor.getColumnIndex(contracts.clienterEntry.Ccodigo));
    String id = cursor.getString(cursor.getColumnIndex(contracts.clienterEntry.Cid));
    nombrecliente.setText(nombre + "id:"+id);
    nombrelocal.setText(negocio);
    mView.setBackgroundColor(Color.RED);

    btn_next.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Log.i("in view", "onClick");
        }
    });
}

}

It works very well with listview, but I do not know why the OnSetItemClickListerner does not work and I want to do it with recyclerview. I understand that I must create another adapter for the recycler, but I do not know how to do it. This is my client class

public class cliente {
private String cMAId;
private String cMACODIGO;
private String cMANOMBRE;
private String cMADIRECCION;
private String cMACIUDAD;
private String cMATIPO;
private String cMACANAL;
private String cMALATITUD;
private String cMALONGITUD;

public cliente(String cMACODIGO, String cMANOMBRE, String cMADIRECCION, String cMACIUDAD, String cMATIPO, String cMACANAL, String cMALATITUD, String cMALONGITUD) {
    this.cMAId= null;
    this.cMACODIGO = cMACODIGO;
    this.cMANOMBRE = cMANOMBRE;
    this.cMADIRECCION = cMADIRECCION;
    this.cMACIUDAD = cMACIUDAD;
    this.cMATIPO = cMATIPO;
    this.cMACANAL = cMACANAL;
    this.cMALATITUD = cMALATITUD;
    this.cMALONGITUD = cMALONGITUD;
}
public ContentValues toContentValues(){
    ContentValues values= new ContentValues();
    values.put(contracts.clienterEntry.Cid,cMAId);
    values.put(contracts.clienterEntry.Ccodigo,cMACODIGO);
    values.put(contracts.clienterEntry.Cnombre,cMANOMBRE);
    values.put(contracts.clienterEntry.Cdireccion,cMADIRECCION);
    values.put(contracts.clienterEntry.Cciudad,cMACIUDAD);
    values.put(contracts.clienterEntry.Ctipo,cMATIPO);
    values.put(contracts.clienterEntry.Ccanal,cMACANAL);
    values.put(contracts.clienterEntry.Clatitud,cMALATITUD);
    values.put(contracts.clienterEntry.Clongitud,cMALONGITUD);
    return  values;
}
public cliente(Cursor cursor){
    cMAId=cursor.getString(cursor.getColumnIndex(contracts.clienterEntry.Cid));
    cMACODIGO = cursor.getString(cursor.getColumnIndex(contracts.clienterEntry.Ccodigo));
    cMANOMBRE = cursor.getString(cursor.getColumnIndex(contracts.clienterEntry.Cnombre));
    cMADIRECCION= cursor.getString(cursor.getColumnIndex(contracts.clienterEntry.Cdireccion));
    cMACIUDAD= cursor.getString(cursor.getColumnIndex(contracts.clienterEntry.Cciudad));
    cMACANAL= cursor.getString(cursor.getColumnIndex(contracts.clienterEntry.Ccanal));
    cMALONGITUD=cursor.getString(cursor.getColumnIndex(contracts.clienterEntry.Clongitud));
    cMALATITUD = cursor.getString(cursor.getColumnIndex(contracts.clienterEntry.Clatitud));
}
public String getcMAId() {
    return cMAId;
}

public String getcMACODIGO() {
    return cMACODIGO;
}

public String getcMANOMBRE() {
    return cMANOMBRE;
}

public String getcMADIRECCION() {
    return cMADIRECCION;
}

public String getcMACIUDAD() {
    return cMACIUDAD;
}

public String getcMATIPO() {
    return cMATIPO;
}

public String getcMACANAL() {
    return cMACANAL;
}

public String getcMALATITUD() {
    return cMALATITUD;
}

public String getcMALONGITUD() {
    return cMALONGITUD;
}

}

I store and get sqlite information.

    
asked by Alldesign Web 02.05.2017 в 19:58
source

2 answers

0

First you must empty your cursor data to an ArrayList < > of objects that you need to handle.

Then implement an adapater for the recyclerview, in this case I pass an adapter that I implement with CardView.

In this adapter I am passing a Listener to the CardView to add the functionality of Click and LongClick to each CardView.

public class FichasAdapter extends RecyclerView.Adapter<FichasAdapter.ViewHolder> {
private ArrayList<Ficha> fichas;
private int layout;
private OnItemClickListener itemClickListener;
private OnItemLongClickListener longClickListener;

public FichasAdapter(ArrayList<Ficha> fichas, int layout, OnItemClickListener listener, OnItemLongClickListener longClickListener) {
    this.fichas = fichas;
    this.layout = layout;
    this.itemClickListener = listener;
    this.longClickListener = longClickListener;
}

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    //Inflamos el layout y lo pasamos al constructor del ViewHolder
    View v = LayoutInflater.from(parent.getContext()).inflate(layout,parent,false);
    ViewHolder vh = new ViewHolder(v);
    return vh;
}

@Override
public void onBindViewHolder(FichasAdapter.ViewHolder holder, int position) {
    //Se llama al metodo Bind del ViewHolder donde pasamos el obejeto a procesar y el Listener
    holder.bind(fichas.get(position),itemClickListener,longClickListener);
}

@Override
public int getItemCount() {
    return fichas.size();
}

public static class ViewHolder extends RecyclerView.ViewHolder{
    //Elementos de la UI CardView a llenar
    private TextView tvFicha,tvFichaPorcentaje;

    public ViewHolder(View itemView){
        super(itemView);
        tvFicha = (TextView) itemView.findViewById(R.id.ficha);
        tvFichaPorcentaje = (TextView) itemView.findViewById(R.id.fichaPorcentaje);;
    }

    public void bind(final Ficha ficha,
                     final OnItemClickListener listener,
                     final OnItemLongClickListener longClickListener){
        //Procesamos los datos a renderizar
        tvFicha.setText(ficha.getFicha());
        tvFichaPorcentaje.setText(ficha.getPorcentaje().toString());
        itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                listener.onItemClick(ficha, getAdapterPosition());
            }
        });
        itemView.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                longClickListener.onItemLongClick(ficha,getAdapterPosition());
                return false;
            }
        });
    }
}

public  interface OnItemClickListener{
    void onItemClick(Ficha ficha, int position);
}
public  interface OnItemLongClickListener{
    void onItemLongClick(Ficha ficha, int position);
}

}

Then in your Activity or fragment you must Assign your adapter to your recyclerview in this way:

public class FichasFragment extends Fragment {
private ArrayList<Ficha> fichas= new ArrayList<Ficha>();
private FichasAdapter mAdapterFichas;
private LayoutManager layout;  
public FichasFragment() {
    // Required empty public constructor
}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View v = inflater.inflate(R.layout.fragment_fichas, container, false);       

    RecyclerView mRecyclerView = (RecyclerView) v.findViewById(R.id.rcv_fichas);        

    layout = new LinearLayoutManager(getContext());

    //Con este metedo Inicializar estoy lo unico que hago es cargar
    //mi ArrayList<Ficha> con objetos de tipo Ficha

        inicializarDatos();       

    mAdapterFichas = new FichasAdapter(fichas, R.layout.cardview_ficha, new FichasAdapter.OnItemClickListener() {
        @Override
        public void onItemClick(Ficha etiqueta, int position) {
          //Accion que quieres que se ejecute al hacer click en cada elemento
        }
    }, new FichasAdapter.OnItemLongClickListener() {
        @Override
        public void onItemLongClick(Ficha etiqueta, int position) {//accion al hacer LongClick en el elemento
            deleteFicha(position);
        }
    });
    //mAdapterFichas = new FichaAdapter_OLD(fichas);
    mRecyclerView.setLayoutManager(layout);
    mRecyclerView.setAdapter(mAdapterFichas);        

    return v;
}

I hope it will serve as a guide to implement your adapter, you just have to modify it to your needs.

    
answered by 02.05.2017 в 23:27
0

You can create a custom list that is very similar to the ListView but you can add more details. you must first create an xml with the fields you want to be displayed on your list.

<?xml version="1.0" encoding="utf-8"?>

android:orientation="horizontal"
android:padding="5dip" >

<!--  listrow  -->
<LinearLayout android:id="@+id/thumbnail"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:padding="3dip"
    android:layout_alignParentLeft="true"

    android:layout_marginRight="5dip">

    <ImageView
        android:id="@+id/list_row_image"
        android:layout_width="64dip"
        android:layout_height="64dip"
        android:src="@drawable/ic_launcher_background"/>

</LinearLayout>

<!-- titulo de la categoria -->
<TextView
    android:id="@+id/list_row_title"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="title"
    android:textColor="#040404"
    android:typeface="sans"
    android:textSize="25dp"
    android:layout_centerVertical="true"
    android:layout_toRightOf="@+id/thumbnail" />

Second you must create a custom adapter that extends from BaseAdapter, it will tell you about your methods, and in your constructor you must pass the context and the list of data you want to show.

package com.example.desarrollo.pruebalist;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

public class ListViewAdapter extends BaseAdapter {
// Declare Variables
Context context;
String[] productos;
int[] imagenes;
LayoutInflater inflater;

public ListViewAdapter(Context context, String[] productos, int[] imagenes) {
    this.context = context;
    this.productos = productos;
    this.imagenes = imagenes;
}

@Override
public int getCount() {
    return productos.length;
}

@Override
public Object getItem(int position) {
    return null;
}

@Override
public long getItemId(int position) {
    return 0;
}

public View getView(int position, View convertView, ViewGroup parent) {

    // Declare Variables
    TextView txtTitle;
    ImageView imgImg;

    //http://developer.android.com/intl/es/reference/android/view/LayoutInflater.html
    inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    View itemView = inflater.inflate(R.layout.list_row, parent, false);

    // Locate the TextViews in listview_item.xml
    txtTitle = (TextView) itemView.findViewById(R.id.list_row_title);
    imgImg = (ImageView) itemView.findViewById(R.id.list_row_image);

    // Capture position and set to the TextViews
    txtTitle.setText(productos[position]);
    imgImg.setImageResource(imagenes[position]);
    return itemView;
}
public static String detalle(Context context, String[] productos, int pos){
    String detallep="";
    for (int i = 0; i <productos.length ; i++) {
         detallep = productos[pos];
    }
    return  detallep;

  }
} 

Then in your main class you should set the lsitview your adptador

 package com.example.desarrollo.pruebalist;

 import android.app.Activity;
 import android.content.DialogInterface;
 import android.content.Intent;
 import android.support.v7.app.AlertDialog;
 import android.support.v7.app.AppCompatActivity;
 import android.os.Bundle;
 import android.view.View;
 import android.widget.AdapterView;
 import android.widget.Button;
 import android.widget.ListView;
 import android.widget.Toast;

 public class MainActivity extends Activity {

ListViewAdapter adapter;
Button btnsalir, btnPerfil;
String[] producto;


int[] imagenes = {
        R.drawable.iphone,
        R.drawable.ipad,
        R.drawable.celular,
        R.drawable.laptop,
        R.drawable.desktop,
        R.drawable.chomecast,
        R.drawable.dvd,
        R.drawable.software,
        R.drawable.hardware,
        R.drawable.monitor,
        R.drawable.mouse,
        R.drawable.teclado,
        R.drawable.bluetooh,
        R.drawable.disco,
        R.drawable.ddr
};

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    producto = getResources().getStringArray(R.array.producto);
    btnPerfil = (Button)findViewById(R.id.btnPefil);
    btnsalir= (Button)findViewById(R.id.btnSalir);
    final ListView lista = (ListView) findViewById(R.id.listView1);
    adapter = new ListViewAdapter(this, producto, imagenes);
    lista.setAdapter(adapter);


    lista.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView adapterView, View view, int i, long l) {
            Intent d = new Intent(getApplicationContext(), DetalleActivity.class);
            //Toast.makeText(getApplicationContext(),"posicion"+i,Toast.LENGTH_SHORT).show();
            d.putExtra("posicion",i);
            startActivity(d);
            finish();
        }
    });

    lista.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
        @Override
        public boolean onItemLongClick(AdapterView adapterView, View view, int i, long l) {
           Intent d = new Intent(getApplicationContext(), DetalleActivity.class);
           startActivity(d);
           return true;
        }
    });

    btnsalir.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent i = new Intent(Intent.ACTION_MAIN);
            finish();
        }
    });

    btnPerfil.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent i = new Intent(getApplicationContext(), PerfilActivity.class);
            startActivity(i);
            finish();

        }
    });

 }

}

Here is the full project on github link

    
answered by 01.09.2018 в 07:02