Список просмотра с проверенным текстом, повторяющий отмеченные элементы

Я реализовал ListView с пользовательским ArrayAdapter, где каждая строка состоит из виджета CheckedTextView. Когда я проверяю первый элемент ListView и прокручиваю вниз, я обнаруживаю, что другие элементы ListView также проверяются, и, когда я прокручиваю вниз, я нахожу проверенные элементы. Похоже, что первый дочерний элемент я проверяю несколько раз, как реплицируется на другой дочерний элемент списка, которые не видны

Я знаю, что у нас есть возможность использовать choiceMode, но это не работает с пользовательским ArrayAdapter, и я должен использовать пользовательский ArrayAdapter. Тип объекта String для ArrayAdapter. Я нашел в Интернете примеры пользовательских моделей для поддержки тега флажка, но, поскольку я использую String, я не могу этого сделать.

Я вставляю свой код адаптера:

@Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub

        final ViewHolderClass viewHolder;

        if(convertView==null)
        {
            LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = layoutInflater.inflate(R.layout.disruption_routes_list_child, parent, false);

            viewHolder = new ViewHolderClass();
            initUI(convertView, viewHolder);

            convertView.setTag(viewHolder);
        }
        else
        {
            viewHolder = (ViewHolderClass) convertView.getTag();
        }


        viewHolder.ctvRoutes.setText(alRoutes.get(position));



        viewHolder.ctvRoutes.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                if(viewHolder.ctvRoutes.isChecked())
                {
                    viewHolder.ctvRoutes.setChecked(false);
                }
                else
                {
                    viewHolder.ctvRoutes.setChecked(true);
                }
            }
        });



        return convertView;
    }


        private void initUI(View convertView, ViewHolderClass viewHolder) {
        // TODO Auto-generated method stub
        viewHolder.ctvRoutes = (CheckedTextView) convertView.findViewById(R.id.ctvRoutes);
    }



    static class ViewHolderClass
    {
        CheckedTextView ctvRoutes;


    }

2 ответа

Вы должны сохранить состояние ViewHolder, Затем установите tag когда convertView == null и получить его в else состояние.

Проверьте, как я это сделал:

public class Conference_listViewAdapter extends ArrayAdapter<Model> {
    Activity context;
    LayoutInflater inflater;
    public static List<Model> data = null;
    ArrayList<String> id_list = new ArrayList<String>();

    int pos;


    public Conference_listViewAdapter(Activity context, List<Model> list, ArrayList<String> id_list) {
        super(context, R.layout.people_list_item1, list);
        this.context = context;
        this.data = list;
        this.id_list = id_list; 
    }



    public View getView(final int position, View convertView, ViewGroup parent) {
        View view = null;       
        if (convertView == null) {
            LayoutInflater inflator = context.getLayoutInflater();
            view = inflator.inflate(R.layout.people_list_item1, null);
            final ViewHolder holder = new ViewHolder();
            holder.title = (TextView) view.findViewById(R.id.tv_name);
            holder.image = (ImageView) view.findViewById(R.id.avtaar);
            holder.favorite = (CheckBox) view.findViewById(R.id.fav);

            view.setTag(holder);

            holder.favorite.setTag(data.get(position));

            holder.favorite.setOnCheckedChangeListener(new OnCheckedChangeListener() {

                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {                    
                    Model element = (Model) holder.favorite.getTag();
                    element.setSelected(buttonView.isChecked());     
                }
            });


        } else {
            view = convertView;
            ((ViewHolder) view.getTag()).favorite.setTag(data.get(position));
        }





        ViewHolder holder = (ViewHolder) view.getTag();     
        holder.favorite.setChecked(data.get(position).isSelected());
        holder.title.setText(data.get(position).getName());

        try {
            holder.image.setImageBitmap(openPhoto(Long.valueOf(id_list.get(position))));
        } catch (Exception e) {
            e.printStackTrace();
        }

        return view;
    }




    static class ViewHolder {
        protected TextView title;
        protected CheckBox favorite;
        ImageView image;
    }

Это дуэт к тому, что список Android переработан

чтобы преодолеть это, либо у вас будет собственный объект для заполнения списка, в котором вы предоставите поле с именем, например, ischecked и внутри вашего getview()

вы делаете следующее

if(yourlist.get(Position).isChecked())
    viewHolder.ctvRoutes.setChecked(true);
else
    viewHolder.ctvRoutes.setChecked(false);

или вы бы предоставили arrayList из int

в котором ваш магазин проверил позиции и внутри вашего getview()

проверьте, существует ли позиция в вашем массиве, сделайте это проверенным, иначе не проверено

Мне нравится первый подход, так как вы хотите искать свой массив в основном потоке, особенно если ваш массив массив огромен, это приведет к задержке прокрутки

Другие вопросы по тегам