Search code examples
androidlistviewtextviewandroid-adapterbaseadapter

Using holder for textview in listview


I'm implementing a ListView with 2 TextViews in it. The first TextView is the name of the product that I'm populating from a query. When I touch any item in the ListView a Dialog appears. When I confirm the Dialog I would like to change the second TextView text to string but whenever I do so every second Textview text changes. For example, if I have 3 items in list view and I click the first one only that item's text view should change instead of all three.

This is my base adapter code:

public class StrengthAdapter extends BaseAdapter {
    private ArrayList<Strengths> list;
    private LayoutInflater layoutInflater;
    private static HashMap<Integer, String> selectedStrengthsMap = new HashMap<Integer, String>();
    private String testing;

    public StrengthAdapter(Context context, ArrayList<Strengths> list, String test) {
        this.list = list;
        layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        this.testing = test;
        //HashMap<Integer, String> issuesStrengthsbrandNameIDMap = context
    }

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

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

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

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        final ViewHolder viewHolder;
        if (convertView == null){
            viewHolder = new ViewHolder();
            //viewHolder.position = position;
            convertView = layoutInflater.inflate(R.layout.strengthslistview, null);
            viewHolder.strengthCheckBox = (TextView) convertView.findViewById(R.id.strengthsCheckBox);
            viewHolder.chip = convertView.findViewById(R.id.chip);

            convertView.setTag(viewHolder);
        }else {
            viewHolder = (ViewHolder) convertView.getTag();
        }
        viewHolder.strengthCheckBox.setText(((Strengths) list.get(position)).getStrength_title());
        viewHolder.chip.setText(testing);
        //viewHolder.position = position;
        return convertView;
    }

    public static HashMap<Integer, String> sendSelectedStrengthMap(){
        return selectedStrengthsMap;
    }

    static class ViewHolder {
        TextView strengthCheckBox;
        TextView chip;
        //int position;
    }
}

This is how my I set my adapter initially:

strengthListView.setAdapter(new StrengthAdapter(StrengthOfDemandsView.this, strengthsList, "TEST"));

and this is how I set my adapter after closing the dialog:

builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int id) {
                strengthListView.setAdapter(new StrengthAdapter(StrengthOfDemandsView.this, strengthsList, "TEST123"));

            }
        });

Solution

  • You need to handle clicks inside of your adapter and not setting adapter every time click happens. It have to look like this:

    @Override
        public View getView(final int position, View convertView, ViewGroup parent) {
            final ViewHolder viewHolder;
            if (convertView == null){
                viewHolder = new ViewHolder();
                //viewHolder.position = position;
                convertView = layoutInflater.inflate(R.layout.strengthslistview, null);
                viewHolder.strengthCheckBox = (TextView) convertView.findViewById(R.id.strengthsCheckBox);
                viewHolder.chip = convertView.findViewById(R.id.chip);
    
                convertView.setTag(viewHolder);
            }else {
                viewHolder = (ViewHolder) convertView.getTag();
            }
            viewHolder.strengthCheckBox.setText(((Strengths) list.get(position)).getStrength_title());
            convertView.setOnClickListener(
                 // show dialog here and then in positiveButton callback call
                 //viewHolder.chip.setText(testing);
            );
            return convertView;
        }