1

I'm getting items duplicate on scroll down or switch to landscape mode, I've been reading some post about this subject before posting this new one, but the most of them explain the "else" catch on "if(converView == null)" which I already have on my code, but It anyways is getting duplicating.

I'm going to give a simple example of what is my problem, I have a ListView on my "Payments" layout, as the name says, my ListView will show every payment I had register on my database.

Basically I use a customerAdapter which extends BaseAdapter, this adapter works on 2 listView completly different each other, one is for payment and the other one for sells, my customAdapter constructor have 3 parameters

(Activity activity, ArrayList<Item_Venta_Gasto>, int tipo)

Item_Venta_Gasto is a class where I previously before adapting the data to my listview I set those data into that class, and subsequenly I add each object on my ArrayList to be send to my custom Adapter.

Currently I have 8 records on my ListView which 6 of those are being show perfectly, but when I scroll down the list view, the others 2 remaining are being show as the duplicate of the first 2 items, I'm not sure if you understand what I'm explaning, I'll upload some screenshot to make it clear. The same thing happen when I turn my phone to landscape mode

CustomAdapter code:

public class VentaGastoListAdapter extends BaseAdapter{

private Activity activity;
ArrayList<Item_Venta_Gasto> arrayitms;
int tipo;

public VentaGastoListAdapter(Activity activity, ArrayList<Item_Venta_Gasto> arrayitms, int tipo) {
    this.activity = activity;
    this.arrayitms = arrayitms;
    this.tipo = tipo;
}

public View getView(int position, View convertView, ViewGroup parent) {
    Fila1 view = null;
    LayoutInflater inflator = activity.getLayoutInflater();
    Item_Venta_Gasto itm;
    if(convertView==null)
    {
        switch (tipo){
            case 0:
                view = new Fila1();
                //Creo objeto item y lo obtengo del array
                itm = arrayitms.get(position);
                convertView = inflator.inflate(R.layout.gasto_item, null);
                //Fecha
                view.fecha = (TextView) convertView.findViewById(R.id.rowDate);
                //Seteo en el campo titulo el nombre correspondiente obtenido del objeto
                view.fecha.setText(itm.getFecha());
                //descipcion
                view.descripcion = (TextView) convertView.findViewById(R.id.rowDescription);
                //Seteo la descripcion
                view.descripcion.setText(itm.getConcepto()+" - "+itm.getDescripcion());
                //saldo
                view.saldo = (TextView)convertView.findViewById(R.id.rowPrice);
                //seteo el saldo
                view.saldo.setText(itm.getSaldo()+"BsF");
                convertView.setTag(view);
                break;
            case 1:
                view = new Fila1();
                //Creo objeto item y lo obtengo del array
                itm = arrayitms.get(position);
                convertView = inflator.inflate(R.layout.gasto_item, null);
                //Fecha
                view.fecha = (TextView) convertView.findViewById(R.id.rowDate);
                //Seteo en el campo titulo el nombre correspondiente obtenido del objeto
                view.fecha.setText(itm.getFecha());
                //descipcion
                view.descripcion = (TextView) convertView.findViewById(R.id.rowDescription);
                //Seteo la descripcion
                view.descripcion.setText(itm.getCliente()+" "+itm.getCantidad()+" "+itm.getProducto());
                //saldo
                view.saldo = (TextView)convertView.findViewById(R.id.rowPrice);
                //seteo el saldo
                view.saldo.setText(itm.getSaldo()+"BsF");
                convertView.setTag(view);
                break;
        }

    }
    else
    {
        view = (Fila1) convertView.getTag();
    }
    return convertView;
}

Item_Venta_Gasto Structure:

public class Item_Venta_Gasto {
int id;
String fecha;
String concepto;
String descripcion;
String saldo;
String producto;
String cliente;
String cantidad;
Context context;

public Item_Venta_Gasto(int id, String fecha, String producto, String cliente, String cantidad, String saldo, Context context) {
    this.context = context;
    this.id = id;
    this.fecha = fecha;
    this.producto = producto;
    this.cliente = cliente;
    this.cantidad = cantidad;
    this.saldo = saldo;
    this.concepto = null;
    this.descripcion = null;


}

public Item_Venta_Gasto(int id, String fecha, String concepto, String descripcion, String saldo) {

    this.id = id;
    this.fecha = fecha;
    this.concepto = concepto;
    this.descripcion = descripcion;
    this.saldo = saldo;
    this.producto = null;
    this.cliente = null;
    this.cantidad = null;
}

Getter and Setter methods....

Fragment where is set the ListView:

public class GastoFragment extends Fragment {

public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

ListView lista = (ListView)  view.findViewById(R.id.gastoListView);

Cursor cursor = db.cargarCursorOrderBy("gasto",new String[]{"*"},"fecha");
    ArrayList<Item_Venta_Gasto> listaGasto = new ArrayList<Item_Venta_Gasto>();
    if(cursor.moveToFirst()){
        for(int i = 0; i < cursor.getCount(); i++){
            listaGasto.add(new Item_Venta_Gasto(cursor.getInt(0),cursor.getString(1),cursor.getString(2),cursor.getString(3),cursor.getString(4)));
            cursor.moveToNext();
        }
    }
    VentaGastoListAdapter adapter = new VentaGastoListAdapter(getActivity(),listaGasto,0);
    lista.setAdapter(adapter);
    return view;

}

Here's a couple of screenshots to show you the problem.

This is the First view of ListView

enter image description here

This is When I scroll down the ListView

enter image description here

and This is the Table Database where the data is being collected

enter image description here

MaToXz
  • 61
  • 3
  • 15

1 Answers1

3

Try this code in your adaptor getView

public View getView(int position, View convertView, ViewGroup parent) {
    Fila1 view = null;
    Item_Venta_Gasto itm;
    if(convertView==null) {
                view = new Fila1();
                LayoutInflater inflator = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                convertView = inflator.inflate(R.layout.gasto_item, null);
                view.fecha = (TextView) convertView.findViewById(R.id.rowDate);
                view.descripcion = (TextView) convertView.findViewById(R.id.rowDescription);
                view.saldo = (TextView)convertView.findViewById(R.id.rowPrice);
                convertView.setTag(view);
    }else{
        view = (Fila1) convertView.getTag();
    }
    itm = arrayitms.get(position);
    view.fecha.setText(itm.getFecha());
    view.saldo.setText(itm.getSaldo()+"BsF");
    switch (tipo){
        case 0:
            view.descripcion.setText(itm.getConcepto()+" - "+itm.getDescripcion());
            break;
        case 1:
            view.descripcion.setText(itm.getCliente()+" "+itm.getCantidad()+" "+itm.getProducto());
            break;
    }
    return convertView;
}

Hope this helps!

AabidMulani
  • 2,325
  • 1
  • 28
  • 47
  • Thanks by answering username_AB, I'm trying your code on my getView customadapter but I'm getting an error on this line "LayoutInflater inflator = activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);" It's says "Incompatible Types: Required android.view.LayoutInflater, Found: java.lang.Object" maybe should I make a cast (LayoutInflater) before calling activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE)? – MaToXz Nov 22 '14 at 19:01
  • Yes, my mistake! Casting is necessary there. – AabidMulani Nov 22 '14 at 19:04
  • Thank you so much mate, it works perfectly, could you help me explaning what exactly was happening on my previous code? Why It wasn't working as expected? – MaToXz Nov 22 '14 at 19:21
  • Your convertView was getting initialized only once as it was null only for the first time. After that it was returning the previous object that was tagged. My experience says, things work weird in case of getView class. So keep it clean and simple. Also avoid multiple initialization inside the getView. If my answer helped you, so accept it would be very kind if you accept my answer. – AabidMulani Nov 22 '14 at 19:29
  • Yeah of course, I already chose it as the answer, and thanks for the advice about the getView method. – MaToXz Nov 22 '14 at 19:36