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

最近某人给我布置了一个作业,由于是新手,中间折腾了好长的时间进行制作,制作的效果如下

android listview实现树形菜单及进行选择操作_第1张图片


关于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 listview实现树形菜单及进行选择操作_第2张图片

你可能感兴趣的:(android开发之控件)