Итак, мой просмотр списка работал отлично, и я решил добавить контекстное меню.Как только я это сделал, всякий раз, когда я обычно щелкал элемент в моем списке, весь список инвертировался при первом щелчке.Последующие щелчки не влияют на порядок, но когда снова отменяется выбор первого элемента, список возвращается в нормальное состояние.Когда я вынимаю добавленную логику контекстного меню, проблема представления списка не исчезает.
Я подключил отладчик, и элементы в моем адаптере списка никогда не переупорядочиваются, а само 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
Я понятия не имею, что могло бы вызвать это, хотя: (