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

博主想在ListView中实现文件夹展开、收起功能,通过修改list数据并刷新画面。但展开后显示效果与预想不符,mList数据正确却显示异常,点击item还触发错位点击事件,怀疑是position错位或convertView缓存更新问题,还给出了相关代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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));

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值