android notifydatasetchanged 刷新错误,ListView中使用notifyDataSetChanged()刷新,item显示混乱。...

RT,目标是在一个ListView中实现文件夹展开,收起的功能。

基本构想是通过修改list数据,然后刷新画面的方式实现。

展开前:

item0(文件夹,内有子item1,item2)

item3

展开后预想结果:

item0

item1

item2

item3

展开后实际显示效果:(mList的数据已确认是正确的1,2,3,4排列)

item0

item3

item3

item3

补充:点击下边任意一个item3,都会触发最后一个item3的点击事件。似乎是position错位了。

也有可能是convertView缓存更新的问题。

小弟对此不太了解,请各位大师指点。谢谢。

代码如下:

public class ListAdapter extends ArrayAdapter {

private LayoutInflater layoutInflater;

private Context mContext;

ListAdapter mAdapter = this;

ArrayList mList;

@Override

public View getView(int position, View convertView, ViewGroup parent) {

ViewHolder holder;

final int fPosition = position;

if (convertView == null) {

convertView = layoutInflater.inflate(R.layout.list_item, null);

holder = new ViewHolder(convertView);

convertView.setTag(holder);

} else {

holder = (ViewHolder) convertView.getTag();

}

……

holder.btnForder.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

// 展开/收起文件夹

if (mList.get(fPosition).getShowItemFlg() == 0){

mList.get(fPosition).setShowItemFlg(1);

// 展开

showForder(fPosition, item);

}else {

mList.get(fPosition).setShowItemFlg(0);

// 收起

unshowForder(fPosition, item);

}

for (int i=0;i

Log.d(“$$$$$$$$$$$$”, “mList.get(“+i+”).getName()” + mList.get(i).getName());

}

mAdapter.notifyDataSetChanged();

}

});

……

}

// 展开文件夹

private void showForder(int positon, ListData list) {

ArrayList cList = list.getForderItem();

ArrayList fList = new ArrayList();

int size = mList.size();

// 保存待展开文件夹之后的item

if (positon + 1 

for (int i = positon + 1; i 

fList.add(mList.get(i));

}

// 移除待展开文件夹之后的item

for (int i = size – 1; i > positon; i–) {

Log.d(“%%%%%%%%%%”, “mList.remove(i)=” + mList.get(i).getName());

mList.remove(i);

}

}

// 追加待展开文件夹之后的子item

for (int i = 0; i 

mList.add(cList.get(i));

Log.d(“%%%%%%%%%%”, “cList.get(i).getName()=” + cList.get(i).getName());

}

if (positon + 1 

// 追加保存的待展开文件夹之后的item

for (int i = 0; i 

mList.add(fList.get(i));

}

}

}

// 收起文件夹

private void unshowForder(int positon, ListData list) {

ArrayList cList = list.getForderItem();

ArrayList fList = new ArrayList();

int size = mList.size();

// 保存待收起文件夹之后的非子item

for (int i=positon+cList.size()+1;i

fList.add(mList.get(i));

}

// 移除保存待收起文件夹之后的item

for (int i=size-1;i>positon;i–){

mList.remove(i);

}

// 追加待收起文件夹之后的非子item

for (int i=0;i

mList.add(fList.get(i));

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android 开发ListView 是一个常用的控件,用于展示列表数据。当数据源发生改变时,我们可以通过调用 adapter 的 notifyDataSetChanged 方法来通知 ListView 刷新数据。不过有时候,调用该方法后 ListView 并没有刷新成功,这是为什么呢? 通常情况下,adapter 调用 notifyDataSetChanged 方法后 ListView 会自动刷新,但有一些情况下会出现刷新失败的情况,主要原因如下: 1. 数据源未更新 notifyDataSetChanged 方法只能刷新 adapter 的数据源,如果数据源没有更新,那么 ListView 就无法刷新。因此,在调用该方法之前,必须要确保 adapter 的数据源已经更新。 2. ListView 高度计算错误ListView 的高度计算错误时,可能会导致刷新失败。当 ListView 的高度设置为 wrap_content 时,它的高度会根据内容自适应,这时如果数据源发生变化,ListView 的高度也会发生变化,但是 ListView 并不会自动刷新,需要手动调用 requestLayout 方法来重新计算布局。 3. ListView 处于滚动状态 当 ListView 处于滚动状态时,调用 notifyDataSetChanged 方法可能会失效。因为在滚动过程ListView 的布局已经被固定,此时调用 notifyDataSetChanged 方法并不会改变布局,只有当滚动停止后才会刷新数据。如果需要在滚动状态下刷新数据,可以尝试使用 notifyDataSetInvalidated 方法。 综上所述,ListView adapter 调用 notifyDataSetChanged 方法无效的原因可能是数据源未更新、ListView 高度计算错误或者 ListView 处于滚动状态。需要根据具体情况进行分析和解决。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值