您的位置:首页 > 移动开发 > Android开发

android listview实现树形菜单及进行选择操作

2015-07-16 11:37 525 查看
最近某人给我布置了一个作业,由于是新手,中间折腾了好长的时间进行制作,制作的效果如下



关于listview实现多级树形菜单的代码我就不贴出来了,有兴趣的朋友可以去慕课网自己看,上面有老师教你如何制作,你只需要跟着一步一步制作就行了,下面主要是适配器的问题。

但是问题来了,如何进行item项目的选择(即点击右边圆圈实现勾选的操作),首先你要自己改变item的布局,并且判断是不是叶子节点是否是一个人员信息,如下



由于数据是模拟的,我直接在数据上加入了boolean得判断值之间获取是否是叶子节点,然后再adapter中的getView方法中判断item时候是人员信息,代码如下

@Override
public View getConvertView( Node node,  int position, View convertView,
ViewGroup parent)
{
View view1,view;

int flag=getItemViewType(position);
switch (flag){
case 1:
view1 = LayoutInflater.from(mContext).inflate(R.layout.item, parent, false);
mIcon = (ImageView) view1
.findViewById(R.id.plus_or_minus);
mText = (TextView) view1.findViewById(R.id.title);
mselect = (ImageView) view1.findViewById(R.id.father_select);

if (node.getIcon() == -1) {
mIcon.setVisibility(View.INVISIBLE);

} else {
mIcon.setVisibility(View.VISIBLE);
mIcon.setImageResource(node.getIcon());
}
mText.setText(node.getName());

return  view1;

case 2:
view=LayoutInflater.from(mContext).inflate(R.layout.user_item, parent, false);
m_another_Text= (TextView) view.findViewById(R.id.id_text);
job= (TextView) view.findViewById(R.id.job);

select= (ImageView) view.findViewById(R.id.zi_select);

//判断之前是否进行过选择操作
if (mAllNodeMap.get(node))
{
select.setImageResource(R.drawable.selectperson2x);

}
user_info= (ImageView) view.findViewById(R.id.user_img);
select.setOnClickListener(this);
m_another_Text.setText(node.getName());
return  view;
}

return  null;

}


注意:我这里并没有使用viewholder进行缓存机制的运用,原因如下:因为进行缓存机制的应用会导致在保存两个布局文件的时候使viewholder产生错乱的效果,最终导致程序无法运行,所以我直接使用最原始的方法,当然,有待改进,毕竟这种写法是很消耗资源的,我只是把功能实现出来给大家 参考,顺便自己记录一下。

接下来就是点击事件了,因为不能通过position去直接获得item的具体选择操作,所以,我自己重新写了一个监听器来监听是否选择的操作,代码如下:

private Node nodeTest=null;
private ImageView imageViewtemp;
private TextView textViewtemp;
private String temp;
@Override
public void onClick(View v) {

//注意这里很重要!!!!!,需要通过子控件获得对应item的位置,不然还是解决不了错乱/   //的问题
View view= (View) v.getParent();
imageViewtemp= (ImageView) view.findViewById(R.id.zi_select);

//获取对应item的textview内容重新得到正确的item的position
textViewtemp= (TextView) view.findViewById(R.id.id_text);
temp=textViewtemp.getText().toString();
for (int i=0;i<mVisibleNodes.size();i++){
if(temp==mVisibleNodes.get(i).getName())
nodeTest=mVisibleNodes.get(i);
}

//进行类似于缓存勾选的效果
if (!mAllNodeMap.get(nodeTest)){
imageViewtemp.setImageResource(R.drawable.selectperson2x);
mAllNodeMap.put(nodeTest, true);
Log.e("click_sure",nodeTest.toString());

}
else {
imageViewtemp.setImageResource(R.drawable.unselected2x);
mAllNodeMap.put(nodeTest, false);
Log.e("click_no", nodeTest.toString());
}

}

因为item的positon错乱的问题,我通过获得点击事件的对应的item的来进行获取正确的position,然后后进行选择操作,然后就能获取到正确的相关信息了,而且在listview通过刷新操作拓展或者收缩listview菜单的时候,不会使勾选状态发生变化。

最终结果如图:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: