RT,目标是在一个ListView中实现文件夹展开,收起的功能。
基本构想是通过修改list数据,然后刷新画面的方式实现。
展开前:
item0(文件夹,内有子item1,item2)
item3
展开后预想结果:
item0
item1
item2
item3
展开后实际显示效果:(mList的数据已确认是正确的1,2,3,4排列)
item0
item3
item3
item3
补充:点击下边任意一个item3,都会触发最后一个item3的点击事件。似乎是position错位了。
也有可能是convertView缓存更新的问题。
小弟对此不太了解,请各位大师指点。谢谢。
代码如下:
publicclassListAdapterextendsArrayAdapter{
privateLayoutInflaterlayoutInflater;
privateContextmContext;
ListAdaptermAdapter=this;
ArrayListmList;
@Override
publicViewgetView(intposition,ViewconvertView,ViewGroupparent){
ViewHolderholder;
finalintfPosition=position;
if(convertView==null){
convertView=layoutInflater.inflate(R.layout.list_item,null);
holder=newViewHolder(convertView);
convertView.setTag(holder);
}else{
holder=(ViewHolder)convertView.getTag();
}
……
holder.btnForder.setOnClickListener(newView.OnClickListener(){
@Override
publicvoidonClick(Viewv){
//展开/收起文件夹
if(mList.get(fPosition).getShowItemFlg()==0){
mList.get(fPosition).setShowItemFlg(1);
//展开
showForder(fPosition,item);
}else{
mList.get(fPosition).setShowItemFlg(0);
//收起
unshowForder(fPosition,item);
}
for(inti=0;i
Log.d(“$$$$$$$$$$$$”,“mList.get(“+i+”).getName()”+mList.get(i).getName());
}
mAdapter.notifyDataSetChanged();
}
});
……
}
//展开文件夹
privatevoidshowForder(intpositon,ListDatalist){
ArrayListcList=list.getForderItem();
ArrayListfList=newArrayList();
intsize=mList.size();
//保存待展开文件夹之后的item
if(positon+1
for(inti=positon+1;i
fList.add(mList.get(i));
}
//移除待展开文件夹之后的item
for(inti=size–1;i>positon;i–){
Log.d(“%%%%%%%%%%”,“mList.remove(i)=”+mList.get(i).getName());
mList.remove(i);
}
}
//追加待展开文件夹之后的子item
for(inti=0;i
mList.add(cList.get(i));
Log.d(“%%%%%%%%%%”,“cList.get(i).getName()=”+cList.get(i).getName());
}
if(positon+1
//追加保存的待展开文件夹之后的item
for(inti=0;i
mList.add(fList.get(i));
}
}
}
//收起文件夹
privatevoidunshowForder(intpositon,ListDatalist){
ArrayListcList=list.getForderItem();
ArrayListfList=newArrayList();
intsize=mList.size();
//保存待收起文件夹之后的非子item
for(inti=positon+cList.size()+1;i
fList.add(mList.get(i));
}
//移除保存待收起文件夹之后的item
for(inti=size-1;i>positon;i–){
mList.remove(i);
}
//追加待收起文件夹之后的非子item
for(inti=0;i
mList.add(fList.get(i));
}
}
}