gpt4 book ai didi

java - 进行选择时,ListView 列表会反转

转载 作者:行者123 更新时间:2023-11-29 09:20:33 28 4
gpt4 key购买 nike

所以我的 ListView 工作得很好,然后我决定添加一个上下文菜单。每当我正常单击 ListView 中的项目时,一旦我这样做,整个列表就会在第一次单击时反转。随后的点击对顺序没有任何影响,但当再次取消选择第一项时,列表恢复正常。当我取出我添加的上下文菜单逻辑时, ListView 问题并没有消失。

我附加了一个调试器,我的列表适配器中的元素永远不会重新排序,ListView 本身也永远不会设置为使用 .setStackFromBottom() 反转

这是我注册的 onClick 监听器,用于处理 ListView 项的点击事件:

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 中用于优化的对象的引用。我无法弄清楚为什么这会导致我的列表在显示时反转,我尝试将监听器移动到布局中的不同 View ,我尝试重新编写监听器,但似乎没有任何效果!任何建议将不胜感激。

编辑:这里是 View 持有者的代码

/** 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 View 的可见性变化,它是 Activity 布局底部的线性按钮布局,位于 ListView 下方。每当我将该 View 的可见性更改为 View.VISIBLE(这发生在选中第一项时)时,列表的顺序就会反转。当 View 的可见性设置为 View.GONE

时,顺序将恢复

虽然我不知道是什么原因造成的 :(

最佳答案

在进一步缩小范围后,我发现问题不是按钮栏可见性的变化,而是 FillUp 的传递holder.fu 中的对象我的ViewHolder类(class)。通过将其更改为引用适配器的 getItem(position)方法,一切似乎都奏效了。这是一个非常奇怪的错误,因为适配器本身并没有改变元素的顺序,但是传递对对象的引用让它非常不高兴。

关于java - 进行选择时,ListView 列表会反转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6725892/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com