Пользовательский множественный выбор списка в Android, возникают проблемы при прокрутке - PullRequest
0 голосов
/ 02 ноября 2011

открытый класс ArrayAdapter расширяет ArrayAdapter {

    private final List<String> list;
    private final Activity context;

    public ArrayAdapter_DiscountList(Activity context, List<Class_Model> list) {
        super(context, R.layout.list, list);
        this.context = context;
        this.list = list;
    }

    static class ViewHolder {
        protected TextView text;
        protected ToggleButton toggle;
    }

    @Override
    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.list, null);
        final ViewHolder viewHolder = new ViewHolder();
        viewHolder.text = (TextView) view.findViewById(R.id.list_item_name);            
        viewHolder.toggle = (ToggleButton) view.findViewById(R.id.checkbox_toggle);
        viewHolder.toggle.setVisibility(View.VISIBLE);

        // TODO Auto-generated method stub
                viewHolder.toggle.setOnCheckedChangeListener(
                new CompoundButton.OnCheckedChangeListener() 
                {
                    @Override
                    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) 
                    {
                            String element = (String) viewHolder.toggle.getTag();
                            element.setSelected(buttonView.isChecked());

                            if(isChecked)
                            {
                                ArrFDItem.add(list.get(position).getName());    
                            }else
                            {
                                ArrFDItem.remove(list.get(position).getName());

                            }
                    }
                });


        view.setTag(viewHolder);
        viewHolder.toggle.setTag(list.get(position));
        } else {
        view = convertView;
        ((ViewHolder) view.getTag()).toggle.setTag(list.get(position));
        }
        ViewHolder holder = (ViewHolder) view.getTag();
        holder.text.setText(list.get(position).getName());
        holder.toggle.setChecked(list.get(position).isSelected());

        return view;
    }

}

работает нормально, но при просмотре списка он удаляет также элемент из списка и положение list.get (position) .getName (); получает только 0-5 (только 6 элементов списка видны в списке). Я должен выбрать больше элементов в списке и должен добавить / удалить в соответствии с выбором переключателя в списке. Пожалуйста помоги. Благодарю вас ...

1 Ответ

0 голосов
/ 02 ноября 2011

Не имея возможности протестировать ваш код в данный момент (на моем ноутбуке), я бы сказал, что ваша проблема связана с тем, как вы перерабатываете свой вид.Подумайте о том, как переработка работает в ArrayAdapter#getView().Может быть, вам нужно переместить часть кода внутри условия convertView == null за пределы блока if / else?Чтобы подтвердить, что это проблема, вы можете просто ничего не перерабатывать и просто каждый раз предоставлять новое представление (конечно, это может быть неэффективно, если ваш список может стать очень большим, но это должно подойти для тестирования со списком, достаточно большим, чтобыпридется немного прокрутить).

Надеюсь, что на данный момент это поможет, завтра у нас будет больше взгляда.

Правка: еще раз взглянул на код и, похоже, с ним возникли некоторые проблемы,Какой именно тип вашей модели?Потому что у вас есть List<Class_Model> (вы должны избегать подчеркивания в именах классов, imho) в вашем конструкторе, но List<String> в вашей переменной экземпляра list.Мне трудно сказать, что вы пытаетесь сделать, не зная, какой вам нужен для вашего списка - просто отображать какой-то текст (в этом случае подойдет String) или это требует более сложного поведения (вв этом случае вам нужен объект модели).

Вот некоторый код, основанный на предположении, что вам нужно определить какой-то ClassModel, а ваш ArrFDItem (что бы это ни было) является локальной переменной.Оба предположения могут быть неверными, но я бы посоветовал вам подумать о том, почему я сделал эти предположения ... и сравнить ваш код с кодом ниже, чтобы увидеть, что изменилось.

public class ArrayAdapterDiscountList extends ArrayAdapter<ClassModel> {
    protected final List<ClassModel> list;
    private final Activity context;
    protected List<String> arrFdItems;

    public ArrayAdapterDiscountList(Activity context, List<ClassModel> list) {
        super(context, R.layout.list, list);
        this.context = context;
        this.list = list;
    }

    static class ViewHolder {
        protected TextView text;
        protected ToggleButton toggle;
    }

    @Override
    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.list, null);
            final ViewHolder viewHolder = new ViewHolder();
            viewHolder.text = (TextView) view.findViewById(R.id.list_item_name);
            viewHolder.toggle = (ToggleButton) view.findViewById(R.id.checkbox_toggle);
            viewHolder.toggle.setVisibility(View.VISIBLE);

            viewHolder.toggle.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                    ClassModel element = (ClassModel) viewHolder.toggle.getTag();
                    element.setSelected(buttonView.isChecked());

                    if (isChecked) {
                        arrFdItems.add(list.get(position).getName());
                    } else {
                        arrFdItems.remove(list.get(position).getName());
                    }
                }
            });

            view.setTag(viewHolder);
            viewHolder.toggle.setTag(list.get(position));
        } else {
            view = convertView;
            ((ViewHolder) view.getTag()).toggle.setTag(list.get(position));
        }
        ViewHolder holder = (ViewHolder) view.getTag();
        holder.text.setText(list.get(position).getName());
        holder.toggle.setChecked(list.get(position).isSelected());

        return view;
    }

    public class ClassModel {
        private String name;
        private boolean isSelected;

        public String getName() {
            return name;
        }

        public boolean isSelected() {
            return isSelected;
        }

        public void setSelected(boolean aBoolean) {
            isSelected = aBoolean;
        }
    }
}

Если этоне помогает, вам нужно вернуться к основам, прочитать некоторые учебные пособия и попытаться следовать им шаг за шагом, пока вы не освоите его.Я могу порекомендовать их на сайте vogella.de, например, http://www.vogella.de/articles/AndroidListView/article.html.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...