List Adapter duplicating positions in Listview

Asked

Viewed 124 times

0

I have a class called "Adapterlistplayers" that extends the class Basedapter and in it I inflate a layout that contains a Checkbox and an Imageview.

Class Adapterlistplayers

public class AdapterListJogadores extends BaseAdapter {
    private LayoutInflater inflater;
    private List<Jogador> jogador;

    public AdapterListJogadores(Context context, List<Jogador> jogador){
        this.jogador = jogador;
        inflater = LayoutInflater.from(context);
    }

    public List<Jogador> getJogador(){
        return jogador;
    }

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

    @Override
    public Jogador getItem(int position) {
        return jogador.get(position);
    }

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

    private class ItemSuporte{
        CheckBox txtNomeJogador;
        ImageView imgPosicao;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        Log.e("Position: ", String.valueOf(position)); //Mostra a posição recebida como parametro do getView no log 
        // Resultado do log, logo abaixo

        ItemSuporte item;

        if(convertView == null){
            convertView = inflater.inflate(R.layout.list_jogador, null);

            item = new ItemSuporte();

            item.txtNomeJogador = (CheckBox) convertView.findViewById(R.id.txtNomeJogador);
            item.imgPosicao = (ImageView) convertView.findViewById(R.id.imgPosicao);

            convertView.setTag(item);

            item.txtNomeJogador.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    CheckBox cb = (CheckBox) v;
                    Jogador jogador = getItem(position);
                    jogador.setMarcado(cb.isChecked());
                }
            });

        } else {
            item = (ItemSuporte) convertView.getTag();
        }

        Jogador jogador = getItem(position);

        item.txtNomeJogador.setText(jogador.getNomeJogador());
        item.txtNomeJogador.setChecked(jogador.isMarcado());

        int posicao = jogador.getPosicao();
        switch (posicao){
            case 0:
                item.imgPosicao.setImageResource(R.mipmap.jogador);
                break;
            case 1:
                item.imgPosicao.setImageResource(R.mipmap.goleiro);
                break;
            default:
                item.imgPosicao.setImageResource(R.mipmap.bola);
                break;
        }

        return convertView;
    }
}

Player class

public class Jogador {
    int _idJogador;
    String _nomeJogador;
    int _posicao;
    private boolean marcado;

    public Jogador(int idJogador, String nomeJogador, int posicao) {
        this._idJogador = idJogador;
        this._nomeJogador = nomeJogador;
        this._posicao = posicao;
    }

    // getting Id
    public int getIdJogador() {
        return this._idJogador;
    }

    // setting id
    public void setIdJogador(int idJogador) {
        this._idJogador = idJogador;
    }

    // getting nome
    public String getNomeJogador() {
        return this._nomeJogador;
    }

    // setting nome
    public void setNomeJogador(String nomeJogador) {
        this._nomeJogador = nomeJogador;
    }

    // getting posicao
    public int getPosicao() {
        return this._posicao;
    }

    // setting posicao
    public void setPosicao(int posicao) {
        this._posicao = posicao;
    }

    public boolean isMarcado() {
        return marcado;
    }

    public void setMarcado(boolean marcado) {
        this.marcado = marcado;
    }
}

Already in my Activity I have a Listview that receives the values of this Adapter and puts on the screen for the user.

 public void onResume(){
        super.onResume();

        final DBAdapterJogador dbJogador = new DBAdapterJogador(this);
        dbJogador.open();

        final List<Jogador> jogador = dbJogador.listar();
        final AdapterListJogadores adapter = new AdapterListJogadores(this, jogador);
        lstJogadores.setAdapter(adapter);
        dbJogador.close();
}

This is the result I have in the log when running the project with 15 items in my database.

02-11 16:20:11.386    3677-3677/favarin.com.br.pernetas E/Position:﹕ 0
02-11 16:20:11.386    3677-3677/favarin.com.br.pernetas E/Position:﹕ 1
02-11 16:20:11.386    3677-3677/favarin.com.br.pernetas E/Position:﹕ 2
02-11 16:20:11.386    3677-3677/favarin.com.br.pernetas E/Position:﹕ 3
02-11 16:20:11.386    3677-3677/favarin.com.br.pernetas E/Position:﹕ 4
02-11 16:20:11.386    3677-3677/favarin.com.br.pernetas E/Position:﹕ 5
02-11 16:20:11.386    3677-3677/favarin.com.br.pernetas E/Position:﹕ 6
02-11 16:20:11.387    3677-3677/favarin.com.br.pernetas E/Position:﹕ 7
02-11 16:20:11.387    3677-3677/favarin.com.br.pernetas E/Position:﹕ 8
02-11 16:20:11.387    3677-3677/favarin.com.br.pernetas E/Position:﹕ 9
02-11 16:20:11.387    3677-3677/favarin.com.br.pernetas E/Position:﹕ 10
02-11 16:20:11.388    3677-3677/favarin.com.br.pernetas E/Position:﹕ 11
02-11 16:20:11.388    3677-3677/favarin.com.br.pernetas E/Position:﹕ 12
02-11 16:20:11.388    3677-3677/favarin.com.br.pernetas E/Position:﹕ 0
02-11 16:20:11.389    3677-3677/favarin.com.br.pernetas E/Position:﹕ 1
02-11 16:20:11.390    3677-3677/favarin.com.br.pernetas E/Position:﹕ 2
02-11 16:20:11.394    3677-3677/favarin.com.br.pernetas E/Position:﹕ 3
02-11 16:20:11.398    3677-3677/favarin.com.br.pernetas E/Position:﹕ 4
02-11 16:20:11.400    3677-3677/favarin.com.br.pernetas E/Position:﹕ 5
02-11 16:20:11.402    3677-3677/favarin.com.br.pernetas E/Position:﹕ 6
02-11 16:20:11.403    3677-3677/favarin.com.br.pernetas E/Position:﹕ 7
02-11 16:20:11.406    3677-3677/favarin.com.br.pernetas E/Position:﹕ 8
02-11 16:20:11.408    3677-3677/favarin.com.br.pernetas E/Position:﹕ 9
02-11 16:20:11.411    3677-3677/favarin.com.br.pernetas E/Position:﹕ 10
02-11 16:20:11.414    3677-3677/favarin.com.br.pernetas E/Position:﹕ 11
02-11 16:20:11.423    3677-3677/favarin.com.br.pernetas E/Position:﹕ 12
02-11 16:20:11.451    3677-3677/favarin.com.br.pernetas E/Position:﹕ 0
02-11 16:20:11.452    3677-3677/favarin.com.br.pernetas E/Position:﹕ 1
02-11 16:20:11.453    3677-3677/favarin.com.br.pernetas E/Position:﹕ 2
02-11 16:20:11.454    3677-3677/favarin.com.br.pernetas E/Position:﹕ 3
02-11 16:20:11.454    3677-3677/favarin.com.br.pernetas E/Position:﹕ 4
02-11 16:20:11.454    3677-3677/favarin.com.br.pernetas E/Position:﹕ 5
02-11 16:20:11.455    3677-3677/favarin.com.br.pernetas E/Position:﹕ 6
02-11 16:20:11.455    3677-3677/favarin.com.br.pernetas E/Position:﹕ 7
02-11 16:20:11.455    3677-3677/favarin.com.br.pernetas E/Position:﹕ 8
02-11 16:20:11.456    3677-3677/favarin.com.br.pernetas E/Position:﹕ 9
02-11 16:20:11.456    3677-3677/favarin.com.br.pernetas E/Position:﹕ 10
02-11 16:20:11.456    3677-3677/favarin.com.br.pernetas E/Position:﹕ 11
02-11 16:20:11.456    3677-3677/favarin.com.br.pernetas E/Position:﹕ 12
02-11 16:20:11.696    3677-3677/favarin.com.br.pernetas E/Position:﹕ 0
02-11 16:20:11.696    3677-3677/favarin.com.br.pernetas E/Position:﹕ 1
02-11 16:20:11.697    3677-3677/favarin.com.br.pernetas E/Position:﹕ 2
02-11 16:20:11.697    3677-3677/favarin.com.br.pernetas E/Position:﹕ 3
02-11 16:20:11.697    3677-3677/favarin.com.br.pernetas E/Position:﹕ 4
02-11 16:20:11.697    3677-3677/favarin.com.br.pernetas E/Position:﹕ 5
02-11 16:20:11.697    3677-3677/favarin.com.br.pernetas E/Position:﹕ 6
02-11 16:20:11.697    3677-3677/favarin.com.br.pernetas E/Position:﹕ 7
02-11 16:20:11.697    3677-3677/favarin.com.br.pernetas E/Position:﹕ 8
02-11 16:20:11.697    3677-3677/favarin.com.br.pernetas E/Position:﹕ 9
02-11 16:20:11.698    3677-3677/favarin.com.br.pernetas E/Position:﹕ 10
02-11 16:20:11.698    3677-3677/favarin.com.br.pernetas E/Position:﹕ 11
02-11 16:20:11.698    3677-3677/favarin.com.br.pernetas E/Position:﹕ 12

With this I am having a problem that when selecting a Checkbox with position 15 (for example) it automatically selects the item from position 3 and takes all values from that position.

1 answer

2


You are to assign the OnClickListener() only when the convertView is void.
When the view is repurposed to another position, which was passed to the Istener, retains its initial value, the one it had when the Istener was created(note that it is declared final int position).

Pass the assignment of OnClickListener() out of the block if(convertView == null)

if(convertView == null){
    ....
    ....
} else {
    item = (ItemSuporte) convertView.getTag();
}

item.txtNomeJogador.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        CheckBox cb = (CheckBox) v;
        Jogador jogador = getItem(position);
        jogador.setMarcado(cb.isChecked());
    }
});

So when the execution goes through else, the Listener previously applied is replaced by a new one with the correct value of position.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.