listview prints repeated values

2

I have a listview that should print 13 fields, the problem I have, is that 7 are different and the other 6 are repeated, then I leave the code I use:

Class Laws:

public class Leyes extends Activity implements AdapterView.OnItemClickListener {

    String[] member_names;
    TypedArray profile_pics;
    String[] statues;

    List<RowItem> rowItems;
    ListView mylistview;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_leyes);

        rowItems = new ArrayList<RowItem>();

        member_names = getResources().getStringArray(R.array.titulosley);

        profile_pics = getResources().obtainTypedArray(R.array.fotosley);

        statues = getResources().getStringArray(R.array.descripcionley);


        for (int i = 0; i < member_names.length; i++) {
            RowItem item = new RowItem(member_names[i],
                    profile_pics.getResourceId(i, -1), statues[i]);
            rowItems.add(item);
        }

        mylistview = (ListView) findViewById(R.id.listviewLeyes);
        CustomAdapter adapter = new CustomAdapter(this, rowItems);
        mylistview.setAdapter(adapter);

        Log.d("tamaño",String.valueOf(rowItems.size()));

        mylistview.setOnItemClickListener(this);

    }

    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position,
                            long id) {

        String member_name = rowItems.get(position).getMember_name();
        Toast.makeText(getApplicationContext(), "" + member_name,
                Toast.LENGTH_SHORT).show();
    }


    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                onBackPressed();
                return true;
        }

        return super.onOptionsItemSelected(item);
    }

}

RowItem class:

    public class RowItem {

    private String member_name;
    private int profile_pic_id;
    private String status;


    public RowItem(String member_name, int profile_pic_id, String status) {

        this.member_name = member_name;
        this.profile_pic_id = profile_pic_id;
        this.status = status;
    }

    public String getMember_name() {
        return member_name;
    }

    public void setMember_name(String member_name) {
        this.member_name = member_name;
    }

    public int getProfile_pic_id() {
        return profile_pic_id;
    }

    public void setProfile_pic_id(int profile_pic_id) {
        this.profile_pic_id = profile_pic_id;
    }

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }
}

CustomAdapter class ():

public class CustomAdapter extends BaseAdapter {

    Context context;
    List<RowItem> rowItems;

    CustomAdapter(Context context, List<RowItem> rowItems) {
        this.context = context;
        this.rowItems = rowItems;
    }

    @Override
    public int getCount() {
        return rowItems.size();
    }

    @Override
    public Object getItem(int position) {
        return rowItems.get(position);
    }

    @Override
    public long getItemId(int position) {
        return rowItems.indexOf(getItem(position));
    }

    /* private view holder class */
    private class ViewHolder {
        ImageView profile_pic;
        TextView member_name;
        TextView status;
    }

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

        ViewHolder holder = null;

        LayoutInflater mInflater = (LayoutInflater) context
                .getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
        if (convertView == null) {
            convertView = mInflater.inflate(R.layout.listviewformato, null);
            holder = new ViewHolder();

            holder.member_name = (TextView) convertView
                    .findViewById(R.id.tituloley);
            holder.profile_pic = (ImageView) convertView
                    .findViewById(R.id.fotoley);
            holder.status = (TextView) convertView.findViewById(R.id.descripcionley);


            RowItem row_pos = rowItems.get(position);

            holder.profile_pic.setImageResource(row_pos.getProfile_pic_id());
            holder.member_name.setText(row_pos.getMember_name());
            holder.status.setText(row_pos.getStatus());


            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        return convertView;
    }

}

in the class for laws, I think this is the problem because if I change the -1 to 1 it shows me the missing ones, but the previous ones disappear

edit:

xml activity laws:

<ListView
    android:id="@+id/listviewLeyes"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
    android:
</ListView>

xml activity list view format

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:padding="2dp">

    <ImageView
        android:id="@+id/fotoley"
        android:layout_width="70dp"
        android:layout_height="70dp"
        android:contentDescription="desc"
        android:paddingLeft="10dp"
        android:paddingRight="10dp"/>
    <TextView
        android:id="@+id/tituloley"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:layout_toRightOf="@+id/fotoley"
        android:paddingBottom="10dp"
        android:text="txt"
        android:textSize="20dp"/>
    <TextView
        android:id="@+id/descripcionley"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:paddingBottom="10dp"
        android:text="txt"
        android:textSize="16dp"
        android:layout_below="@+id/tituloley"
        android:layout_toEndOf="@+id/fotoley" />



</RelativeLayout>

I leave the arrays here:

<string-array name="titulosley">
        <item>Transitar por pista de la derecha</item>
        <item>Transitar según sentido de marcha</item>
        <item>Prohibición de circulación</item>
        <item>Obligación de circulación.</item>
        <item>Prohibida la circulación en autopistas.</item>
        <item>Elementos necesarios para circular diariamente.</item>
        <item>Requerimiento para la conducción.</item>
        <item>Respetar normas y señales de tránsito.</item>
        <item>No adherirse a otros vehículos.</item>
        <item>Tránsito en grupos</item>
        <item>Transporte de carga</item>
        <item>Señalizar hacia donde se dirige.</item>
        <item>No Utilizar.</item>
    </string-array>

    <string-array name="descripcionley">
        <item>Los ciclistas siempre deben transitar por la calle y por la pista derecha, a un metro de la cuneta.
 Solo en caso que la pista derecha sea exclusiva para buses, podrán transitar por la pista izquierda</item>
        <item>Al transitar por la calle, siempre lo deberán hacer respetando el sentido de esta, nunca ir contra el tránsito.</item>
        <item>Está prohibido circular por las veredas, a menos que los ciclistas sean niños o adultos mayores.</item>
        <item>En caso de existir ciclovías o vías exclusivas, es obligatorio transitar por ellas.</item>
        <item>Está prohibido circular por las autopistas y/o autovías, a menos que exista una vía o ciclovía donde esté permitida su circulación. Esta regla aplica también en los accesos a las autopistas, autovías y túneles.</item>
        <item>Un ciclista siempre deberá portar los siguientes elementos de seguridad:
•   Luces delanteras: un foco de luz blanca que permita proyectar luz frontal.
•   Luces traseras: una luz roja fija.
•   Utilizar un timbre o aparato sonoro que pueda emitir sonidos de intensidad moderada.
•   Casco protector, que debe cubrir la parte superior de la cabeza y permanecer fijo a ella mediante una cinta o correa que pase por debajo de la barbilla.
•   Un sistema de frenos efectivo.
•   Las bicicletas y los ciclistas deberán contar con elementos reflectantes. En el caso de los ciclistas, puede ser un chaleco, bandas o hasta tobilleras.
</item>
        <item>No se pueden llevar a más personas del número para cual fue diseñada la bicicleta.</item>
        <item>Los ciclistas deben respetar los semáforos destinados exclusivamente para ellos, al igual que los peatones. Los semáforos siguen las mismas reglas básicas que deben seguir los automovilistas.</item>
        <item>Está prohibido que los ciclistas se enganchen de otros vehículos que se encuentren en movimiento en las vías públicas.</item>
        <item>Si van a transitar en grupo, los ciclistas deberán ir de 2 en 2, ocupando solo la mitad de la calzada. De noche, deberán transitar uno tras otro.</item>
        <item>No deben transportar carga que impida mantener ambas manos sobre el manubrio y el debido control de la bicicleta.</item>
        <item>Deben señalizar con los brazos las maniobras de viraje, extendiendo los brazos de manera horizontal dependiendo de la dirección hacia donde se dirigen.</item>
        <item>No pueden hablar por celular mientras conducen.</item>
    </string-array>

    <array name="fotosley">
        <item>@drawable/uno</item>
        <item>@drawable/dos</item>
        <item>@drawable/tres</item>
        <item>@drawable/cuatro</item>
        <item>@drawable/cinco</item>
        <item>@drawable/seis</item>
        <item>@drawable/siete</item>
        <item>@drawable/ocho</item>
        <item>@drawable/nueve</item>
        <item>@drawable/diez</item>
        <item>@drawable/once</item>
        <item>@drawable/doce</item>
        <item>@drawable/trece</item>
    </array>
    
asked by zhet 17.04.2017 в 03:43
source

2 answers

1

A listView reuses the view to save memory, when convertView is null you should only instantiate the views but not assign them values, the code would be as follows:

if (convertView == null) {
       convertView = mInflater.inflate(R.layout.listviewformato, null);
       holder = new ViewHolder();
       holder.member_name = (TextView) convertView
                            .findViewById(R.id.tituloley);
       holder.profile_pic = (ImageView) convertView
                            .findViewById(R.id.fotoley);
       holder.status = (TextView) convertView.findViewById(R.id.descripcionley);

       convertView.setTag(holder);
} else {
       holder = (ViewHolder) convertView.getTag();
}

     RowItem row_pos = rowItems.get(position);
     holder.profile_pic.setImageResource(row_pos.getProfile_pic_id());
     holder.member_name.setText(row_pos.getMember_name());
     holder.status.setText(row_pos.getStatus());
    
answered by 17.04.2017 / 20:03
source
1

The layout of the ListView must not have the last "android:":

<ListView
    android:id="@+id/listviewLeyes"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
    android:
</ListView>

Regarding repeated elements, it is necessary to ensure that the list rowItems , does not contain repeated data and ensures to assign the properties after having created or reused the view:

  if (convertView == null) {
        convertView = mInflater.inflate(R.layout.listviewformato, null);
        holder = new ViewHolder();

        holder.member_name = (TextView) convertView
                .findViewById(R.id.tituloley);
        holder.profile_pic = (ImageView) convertView
                .findViewById(R.id.fotoley);
        holder.status = (TextView) convertView.findViewById(R.id.descripcionley);

       /* RowItem row_pos = rowItems.get(position);
        holder.profile_pic.setImageResource(row_pos.getProfile_pic_id());
        holder.member_name.setText(row_pos.getMember_name());
        holder.status.setText(row_pos.getStatus());*/


        convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }

        RowItem row_pos = rowItems.get(position);
        holder.profile_pic.setImageResource(row_pos.getProfile_pic_id());
        holder.member_name.setText(row_pos.getMember_name());
        holder.status.setText(row_pos.getStatus());
    
answered by 17.04.2017 в 04:40