リストビューが完全に機能していたので、コンテキストメニューを追加することにしました。通常、リストビューでアイテムをクリックするたびに、リスト全体が最初のクリックで反転されます。後続のクリックはオーダーに何も行われませんが、最初のアイテムが再び選択解除されると、リストは正常に戻ります。私が追加したコンテキストメニューのロジックを取り除くと、リストビューの問題は解決されません。 選択時にリストビューのリストが逆になる
私は、デバッガと私のリストアダプタの要素を添付しました
は、並べ替えされることはありませんし、ListViewコントロール自体は、私のonClickリスナーがリストのクリックイベントを処理するために登録されている。ここ.setStackFromBottom()
で逆転するように設定されることはありませんビューアイテム:
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);
}
}
}
ビューホルダークラスは、リストビューで最適化を行うオブジェクトへの参照を保持しています。なぜ私のリストが表示されたときにリストが反転する原因になっているのかわかりません。レイアウト内の別のビューにリスナーを移動しようとしました。リスナーを書き直そうとしましたが、何も動作しません。アドバイスをいただければ幸いです。
編集:[OK]を
、私は視界にそれを絞り込むました:UPDATE
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;
}
}
:ここに表示ホルダー
/** 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;
}
だけでなく、アダプターのコードですアクティビティのレイアウトの下部にあるListViewの下のボタンの線形レイアウトであるbuttonLayoutビューで変更します。そのビューの可視性をView.VISIBLE
に変更すると(最初のアイテムがチェックされたときに発生します)、リストの順序が逆になります。ビューの可視性がView.GONE
私は:(
おそらくアダプタに何かがあります。コード – Blundell
はい、このような症状の問題は、ほとんどの場合、アダプタのバグを示しています。 – adamp
アダプタコード – Gallal