Code Bye

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<ListData> {
private LayoutInflater layoutInflater;
private Context mContext;
ListAdapter mAdapter = this;
ArrayList<ListData> 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<mList.size();i++){
Log.d(“$$$$$$$$$$$$”, “mList.get(“+i+”).getName()” + mList.get(i).getName());
}

mAdapter.notifyDataSetChanged();
}
});

……
}

// 展开文件夹
private void showForder(int positon, ListData list) {
ArrayList<ListData> cList = list.getForderItem();
ArrayList<ListData> fList = new ArrayList<ListData>();
int size = mList.size();
// 保存待展开文件夹之后的item
if (positon + 1 < size) {
for (int i = positon + 1; i < size; 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 < cList.size(); i++) {
mList.add(cList.get(i));
Log.d(“%%%%%%%%%%”, “cList.get(i).getName()=” + cList.get(i).getName());
}
if (positon + 1 < size) {
// 追加保存的待展开文件夹之后的item
for (int i = 0; i < fList.size(); i++) {
mList.add(fList.get(i));
}
}
}

// 收起文件夹
private void unshowForder(int positon, ListData list) {
ArrayList<ListData> cList = list.getForderItem();
ArrayList<ListData> fList = new ArrayList<ListData>();
int size = mList.size();
// 保存待收起文件夹之后的非子item
for (int i=positon+cList.size()+1;i<size;i++){
fList.add(mList.get(i));
}
// 移除保存待收起文件夹之后的item
for (int i=size-1;i>positon;i–){
mList.remove(i);
}
// 追加待收起文件夹之后的非子item
for (int i=0;i<fList.size();i++){
mList.add(fList.get(i));
}
}
}

解决方案:100分
在getView中
holder.txt.setText(mList.get(position))即可
要记得赋值,这里是取缓存对象,复用之前的holder的控件对象

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明ListView中使用notifyDataSetChanged()刷新,item显示混乱。