Java 进行选择时,列表视图列表会反转
所以我的listview工作得很好,然后我决定添加一个上下文菜单。每当我在listview中单击一个项目时,只要我这样做,整个列表就会在第一次单击时反转。随后的单击对顺序没有任何影响,但当第一个项目再次取消选中时,列表将恢复正常。当我取出我添加的上下文菜单逻辑时,列表视图问题并没有消失 我附加了一个调试器,我的列表适配器中的元素永远不会重新排序,ListView本身也永远不会设置为与.setStackFromBottom相反 下面是我注册的onClick侦听器,用于处理列表视图项的单击事件:Java 进行选择时,列表视图列表会反转,java,android,listview,reverse,Java,Android,Listview,Reverse,所以我的listview工作得很好,然后我决定添加一个上下文菜单。每当我在listview中单击一个项目时,只要我这样做,整个列表就会在第一次单击时反转。随后的单击对顺序没有任何影响,但当第一个项目再次取消选中时,列表将恢复正常。当我取出我添加的上下文菜单逻辑时,列表视图问题并没有消失 我附加了一个调试器,我的列表适配器中的元素永远不会重新排序,ListView本身也永远不会设置为与.setStackFromBottom相反 下面是我注册的onClick侦听器,用于处理列表视图项的单击事件: p
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);
}
}
}
viewholder类只保存对listview中用于优化的对象的引用。我不明白为什么这会导致我的列表在显示时反转,我尝试将侦听器移动到布局中的其他视图,我尝试重新编写侦听器,但似乎没有任何效果!如有任何建议,将不胜感激
编辑:这是视图保持架的代码
/** 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视图上的可见性变化,这是活动布局底部的按钮的线性布局,在ListView下面。每当我将该视图的可见性更改为view.VISIBLE时(选中第一项时发生),列表的顺序将颠倒。当视图的可见性设置为view.GONE时,将恢复顺序
我不知道是什么原因导致了这种情况:如果单击listview时背景颜色发生变化,我认为这与主题有关。只需使用listview的缓存颜色参数,以下是一个示例:
<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>
如果您单击listview时背景颜色发生变化,我认为这与您的主题有关。只需使用listview的缓存颜色参数,以下是一个示例:
<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>
在进一步缩小范围后,我发现问题不在于更改按钮栏的可见性,而在于传递ViewHolder类的holder.fu中的FillUp对象。通过将其更改为引用适配器的getItemposition方法,一切似乎都正常。这是一个相当奇怪的错误,因为适配器本身没有改变元素的顺序,但是传递对对象的引用使它非常不高兴。在进一步缩小范围后,我发现问题不是我的按钮栏的可见性的改变,但实际上,在我的ViewHolder类的holder.fu中传递FillUp对象。通过将其更改为引用适配器的getItemposition方法,一切似乎都正常。这是一个很奇怪的错误,因为适配器本身没有更改元素的顺序,但是传递对对象的引用会使它非常不高兴。可能是适配器中有什么东西,请检查代码是,类似症状的问题几乎总是表示适配器错误。向我们显示适配器的代码可能是适配器中的某些东西,请检查代码是的,类似症状的问题几乎总是表示适配器错误。向我们显示适配器的代码颜色不变,仅列表的顺序。颜色不变,仅列表的顺序不变。