请问ListView里面含有CheckBox,为什么滚动时会错乱

在我的ListView里面
设置了一个复选框CheckBox
而且这个复选框的不可以被聚焦、不可以被点击的

我是在ListView的ItemClickListner里面
设置了点一下ListView的一个Item,那么这个Item的复选框会被选中
其他Item的复选框不被选中

但为什么ListVIew一滚动,有些复选框就莫名其妙的被选中了?

这是Adapter里面的部分代码,东西有点多,但只有复选框是错的,其他内容都没错

@Override
public View getView(int position, View convertView, ViewGroup parent) {
final int index = position;
final ViewHolder holder;
OrderData data = datalist.get(position);
String imageUrl = data.getAvatat() + "";

if (convertView == null) {
convertView = mInflater.inflate(R.layout.item_order, null);
holder = new ViewHolder();

holder.cb = (CheckBox) convertView.findViewById(R.id.cb_item_order);
holder.iv_avatar = (ImageView) convertView
.findViewById(R.id.iv_item_order_avatar);
holder.iv_arrowDown = (ImageView) convertView
.findViewById(R.id.iv_item_order_ishide);
holder.tv_orderCode = (TextView) convertView
.findViewById(R.id.tv_item_order_code);
holder.tv_price = (TextView) convertView
.findViewById(R.id.tv_item_order_price);
holder.tv_status = (TextView) convertView
.findViewById(R.id.tv_item_order_status);
holder.tv_time = (TextView) convertView
.findViewById(R.id.tv_item_order_time);
holder.tv_username = (TextView) convertView
.findViewById(R.id.tv_item_order_username);
holder.layout_food = (LinearLayout) convertView
.findViewById(R.id.layout_order_food);
holder.tv_date = (TextView) convertView
.findViewById(R.id.tv_item_order_data);

convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}

// // 设置加载中的View
// mAbImageLoader.setLoadingView(convertView
// .findViewById(R.id.progressBar));
// 图片的下载
// mAbImageLoader.display(holder.iv_avatar, imageUrl);

setData(index, holder);
return convertView;
}

private void setData(int position, ViewHolder view) {

OrderData data = datalist.get(position);
Log.d("setData", "被调用");
view.tv_orderCode.setText(data.getOrdCode() + "");
view.tv_price.setText("¥" + data.getOrdYinFuMoney() + "");
view.tv_username.setText(data.getUserName());
view.iv_arrowDown.setOnClickListener(new Iv_onclick(position));

if (data.getStatus() == 1) {
view.tv_status.setText("正在用餐");
view.tv_status.setTextColor(context.getResources().getColor(
R.color.main));
} else {
view.tv_status.setText("可以收款");
view.tv_status.setTextColor(context.getResources().getColor(
R.color.red));
}

if (data.getIsSelected() == 1) {
view.cb.setChecked(true);
} else {
view.cb.setClickable(false);
}

String time = data.getOrdCreateTime(); // 裁剪时间长度
String time1 = time.substring(0, 11);
String time2 = time.substring(11, 19);
view.tv_date.setText(time1);
view.tv_time.setText(time2);

int count = view.layout_food.getChildCount();
if (count == 0) {
// 添加具体的菜品消费信息
LayoutInflater inflater = LayoutInflater.from(context);
List<CaiData> fooddatas = data.getProdList();
Log.d("看看一个订单的菜数", "" + fooddatas.size());
for (CaiData c : fooddatas) {
View foodview = inflater
.inflate(R.layout.item_order_food, null);
TextView tv_name = (TextView) foodview
.findViewById(R.id.tv_item_orderfood_name);
TextView tv_count = (TextView) foodview
.findViewById(R.id.tv_item_orderfood_count);
TextView tv_price = (TextView) foodview
.findViewById(R.id.tv_item_orderfood_price);
String caiming = c.getCaiming();
caiming = toLength10(caiming);
tv_count.setText("x" + c.getCount());
tv_name.setText(caiming);
tv_price.setText("¥" + (c.getPrice() * c.getCount()));

view.layout_food.addView(foodview);

// mAbImageLoader.display(view.iv_avatar, data.getAvatat()+"");
}
}

// 设置下拉的详细菜品是否可见
if (data.isVisable()) {
view.iv_arrowDown.setImageResource(R.drawable.arrow_up);
view.layout_food.setVisibility(View.VISIBLE);
} else {
view.iv_arrowDown.setImageResource(R.drawable.arrow_down);
view.layout_food.setVisibility(View.GONE);
}
}

public void setSelected(int selected) {

int isSelected = datalist.get(selected).getIsSelected();
if (isSelected == 1) {
Toast.makeText(context, "至少需要勾选一项订单!!", 2000).show();
return;
}
for(int i=0;i<datalist.size();i++){
datalist.get(i).setIsSelected(0);
if(i== selected){
datalist.get(i).setIsSelected(1);
}
}
this.selected = selected;
notifyDataSetChanged();
}


这个是ListView的Item监听器

listView.setOnItemClickListener(new OnItemClickListener() {

@Override
public void onItemClick(AdapterView<?> arg0, View arg1,
int position, long arg3) {
// TODO Auto-generated method stub
adapter.setSelected(position);

}
});



请问各位,这问题出在哪????
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
是的,当 ListView 滚动时,会导致 CheckBox 的选状态消失。这是因为 ListView 会对其子项进行复用,从而导致 CheckBox 的状态丢失。 为了解决这个问题,可以在 Adapter 使用 ViewHolder 模式来缓存 ListView 的子项,从而避免 CheckBox 状态的丢失。具体来说,ViewHolder 模式可以通过以下步骤来实现: 1. 在 Adapter 定义一个 ViewHolder 类,用于缓存 ListView 的子项: ```java private static class ViewHolder { TextView nameTextView; CheckBox checkBox; } ``` 2. 在 getView 方法使用 ViewHolder 对象来缓存 ListView 的子项: ```java @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder viewHolder; if (convertView == null) { convertView = LayoutInflater.from(context).inflate(R.layout.list_item, parent, false); viewHolder = new ViewHolder(); viewHolder.nameTextView = convertView.findViewById(R.id.name_text_view); viewHolder.checkBox = convertView.findViewById(R.id.checkbox); convertView.setTag(viewHolder); } else { viewHolder = (ViewHolder) convertView.getTag(); } // 设置子项的文本和 CheckBox 状态 MyItem item = getItem(position); viewHolder.nameTextView.setText(item.getName()); viewHolder.checkBox.setChecked(item.isChecked()); // 返回子项视图 return convertView; } ``` 在这个例子,我们首先通过 convertView 参数来获取 ListView 的子项视图。如果 convertView 为 null,说明当前子项没有被缓存,我们就需要创建一个新的 ViewHolder 对象,并使用 setTag 方法将其绑定到 convertView 上。如果 convertView 不为 null,说明当前子项已经被缓存了,我们就可以直接从 convertView 获取 ViewHolder 对象。 在 getView 方法,我们通过 ViewHolder 对象来设置子项的文本和 CheckBox 状态。由于 CheckBox 的状态已经被缓存到 ViewHolder ,因此即使 ListView 滚动CheckBox 的状态也不会丢失。 最后,我们返回子项视图 convertView。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值