Список ListView переворачивается при выборе - PullRequest
2 голосов
/ 17 июля 2011

Итак, мой просмотр списка работал отлично, и я решил добавить контекстное меню.Как только я это сделал, всякий раз, когда я обычно щелкал элемент в моем списке, весь список инвертировался при первом щелчке.Последующие щелчки не влияют на порядок, но когда снова отменяется выбор первого элемента, список возвращается в нормальное состояние.Когда я вынимаю добавленную логику контекстного меню, проблема представления списка не исчезает.

Я подключил отладчик, и элементы в моем адаптере списка никогда не переупорядочиваются, а само ListView никогда не устанавливается в обратном порядке с .setStackFromBottom()

Вот мой слушатель onClick, зарегистрированный для обработкисобытия щелчка элементов представления списка:

public void onClick(View v) {  
    ViewHolder holder = (ViewHolder) v.getTag();  
    CheckBox b = holder.box;  
    Boolean check = b.isChecked();  
    b.setChecked(!check);  
    if (!check) {  
       mChecked.add(holder.fu);  
       if (mChecked.size() == 1) {  
         buttonLayout.setVisibility(View.VISIBLE);  
       }  
    } else {  
       mChecked.remove(holder.fu);  
       if (mChecked.size() == 0) {  
         buttonLayout.setVisibility(View.GONE);  
       }  
   }  
}

Класс виджета просто содержит ссылки на объекты, которые я использую в просмотре списка для оптимизации.Я не могу понять, почему это приводит к инверсии моего списка при отображении, я попытался переместить слушателя в другое представление в макете, я попытался переписать слушателя, кажется, ничего не работает!Любой совет будет оценен.

Редактировать: вот код для держателя вида

/** Class to provide a holder for ListViews. Used for optimization */  
private class ViewHolder {  
    TextView date;  
    TextView gallons;  
    TextView cost;  
    TextView cpg;  
    TextView mpg;  
    CheckBox box;  
    FillUp fu;  
}  

, а также для адаптера:

 public class FillUpAdapter extends BaseAdapter {

        ArrayList<FillUp> mElements;
        ArrayList<FillUp> mChecked;
        Context mContext;

        public FillUpAdapter(Context c, ArrayList<FillUp> data) {
            mContext = c;
            mElements = data;
            mChecked = new ArrayList<FillUp>();
        }

        public void clearChecked() {
            mChecked.clear();
        }

        public ArrayList<FillUp> getChecked() {
            return mChecked;
        }

        public boolean remove(FillUp f) {
            mChecked.remove(f);
            return mElements.remove(f);
        }

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

        @Override
        public Object getItem(int arg0) {
            return mElements.get(arg0);
        }

        @Override
        public long getItemId(int arg0) {

            return mElements.get(arg0).getId();
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            LinearLayout layout;
            ViewHolder holder;
            if (convertView != null) {
                layout = (LinearLayout) convertView;
                holder = (ViewHolder) layout.getTag();
            } else {
                layout = (LinearLayout) LayoutInflater.from(mContext).inflate(
                        R.layout.fillup_list_item, parent, false);
                holder = new ViewHolder();
                holder.cost = (TextView) layout
                        .findViewById(R.id.fillUpListTotalValue);
                holder.cpg = (TextView) layout
                        .findViewById(R.id.fillUpListCostPerGal);
                holder.gallons = (TextView) layout
                        .findViewById(R.id.fillUpListGalValue);
                holder.mpg = (TextView) layout
                        .findViewById(R.id.fillUpMPGText);
                holder.date = (TextView) layout
                        .findViewById(R.id.fillUpListDate);
                holder.box = (CheckBox) layout
                        .findViewById(R.id.fillUpListCheckBox);
                holder.fu = (FillUp) getItem(position);
                layout.setTag(holder);

            }

            holder.date.setText(holder.fu.getDate());
            holder.gallons.setText(holder.fu.getGallonsText());
            holder.cpg.setText(holder.fu.getCostText());
            holder.cost.setText(holder.fu.getTotalText());
            holder.mpg.setText(String.format("%03.1f MPG",holder.fu.getMPG()));
            if (convertView != null) {
                holder.box.setChecked(mChecked.contains(holder.fu));
            }

            layout.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    ViewHolder holder = (ViewHolder) v.getTag();
                    CheckBox b = holder.box;
                    Boolean check = b.isChecked();
                    b.setChecked(!check);
                    if (!check) {
                        mChecked.add(holder.fu);
                        if (mChecked.size() == 1) {
                            buttonLayout.setVisibility(View.VISIBLE);
                        }
                    } else {
                        mChecked.remove(holder.fu);
                        if (mChecked.size() == 0) {
                            buttonLayout.setVisibility(View.GONE);
                        }
                    }
                }
            });
            return layout;
        }
}

ОБНОВЛЕНИЕ:
Хорошо, поэтому я сузил это до изменения видимости в представлении buttonLayout, которое представляет собой линейный макет кнопок в нижней части макета Activity под ListView.Всякий раз, когда я изменяю видимость этого представления на View.VISIBLE (что происходит, когда проверяется первый элемент), порядок в списке меняется на противоположный.Порядок восстанавливается, когда видимость представления установлена ​​на View.GONE

Я понятия не имею, что могло бы вызвать это, хотя: (

Ответы [ 2 ]

1 голос
/ 19 июля 2011

После еще большего сужения области действия я обнаружил, что проблема заключается не в изменении видимости моей панели кнопок, а на самом деле в обход FillUp объектов в holder.fu моего ViewHolder класса. Если вместо этого ссылаться на метод getItem(position) адаптера, все, похоже, сработало. Довольно странная ошибка, так как сам адаптер не изменял порядок элементов, но передача ссылки на объект делала его очень несчастным.

0 голосов
/ 18 июля 2011

Если цвет фона вашего списка меняется при нажатии на него, я думаю, что это касается вашей темы. Просто поиграйте с параметрами цвета кэша вашего списка, вот пример:

<ListView
            android:layout_width="fill_parent"
            android:id="@android:id/list"
            android:scrollingCache="true"
            android:persistentDrawingCache="all"
            android:cacheColorHint="#0000"
            android:layout_height="wrap_content"
            android:fastScrollEnabled="true"
            android:stackFromBottom="true"
            android:smoothScrollbar="true"
            android:paddingTop="115dip">
</ListView>
...