android listview实现树形菜单及进行选择操作
2015-07-16 11:37
525 查看
最近某人给我布置了一个作业,由于是新手,中间折腾了好长的时间进行制作,制作的效果如下
![](http://img.blog.csdn.net/20150716113832729?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
关于listview实现多级树形菜单的代码我就不贴出来了,有兴趣的朋友可以去慕课网自己看,上面有老师教你如何制作,你只需要跟着一步一步制作就行了,下面主要是适配器的问题。
但是问题来了,如何进行item项目的选择(即点击右边圆圈实现勾选的操作),首先你要自己改变item的布局,并且判断是不是叶子节点是否是一个人员信息,如下
![](http://img.blog.csdn.net/20150716114215648?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
由于数据是模拟的,我直接在数据上加入了boolean得判断值之间获取是否是叶子节点,然后再adapter中的getView方法中判断item时候是人员信息,代码如下
注意:我这里并没有使用viewholder进行缓存机制的运用,原因如下:因为进行缓存机制的应用会导致在保存两个布局文件的时候使viewholder产生错乱的效果,最终导致程序无法运行,所以我直接使用最原始的方法,当然,有待改进,毕竟这种写法是很消耗资源的,我只是把功能实现出来给大家 参考,顺便自己记录一下。
接下来就是点击事件了,因为不能通过position去直接获得item的具体选择操作,所以,我自己重新写了一个监听器来监听是否选择的操作,代码如下:
因为item的positon错乱的问题,我通过获得点击事件的对应的item的来进行获取正确的position,然后后进行选择操作,然后就能获取到正确的相关信息了,而且在listview通过刷新操作拓展或者收缩listview菜单的时候,不会使勾选状态发生变化。
最终结果如图:
关于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菜单的时候,不会使勾选状态发生变化。
最终结果如图:
相关文章推荐
- Android控件属性大全
- 自定义AttributeSet属性
- Android软键盘属性android:windowSoftInputMode
- Android listview 异步加载图片并防止错位
- android permission详细
- Android拍照,上传,预览综合
- Activity生命周期的回调,你应该知道得更多!--Android源码剖析(上)
- Android学习之一 -----4.4.2内核源码编译
- Android studio模拟器 Intel HAXM Intel virtualization technology(VT-x) is not turned on解决办法
- android数字签名(一)
- Android 开源库
- Android记录15--关于ListView中adapter调用notifyDataSetChanged无效的原因
- Android中Shape的使用
- Android中Menu的基本用法
- Android Material Design support library
- Android基于cordova3.3插件开发
- 手机抓包Android
- In android studio,cannot load 2 facets-unknown facet type:android and android-gradle
- java.lang.NoClassDefFoundError: com.android.volley.toolbox.Volley
- Android 操作系统的内存回收机制