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