ExtendableListView选中其中二级列表下的一个元素

个人认为ExtendableListView其实就是RecycleView的一个扩展,能用在RecycleView方法上的。这个也可以用。所以用的方式就和Recycle点击选中变色/提示用户选中一样。

个人不喜欢使用checkbox的方式。而采取变色/多显示一个选中图标的形式
基本思想为:点击某元素了,我ExtendableList会回调我所点击的具体位置,而作为二维数组的数据。我自建的Item_check数组也是二维。则可以根据我的数组去指明哪一个子元素要显示这个选中的图标。

//**********************活动类************************************
public class MainActivity extends AppCompatActivity {
  private ExpandableListView expandableListView;
   final String Fatherlist[]={"1","2","3"};
    String Childlist[][]={{"11","111","1111"},{"22","222","2222"},{"33","333","3333"}};
 @Override
    protected void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
          InitExpendableListView();
}
//初始化我的ExpendableListView
  private void InitExpendableListView(){
 final BLEActivityExtendableListViewAdapter mBLEActivityExtendableListViewAdapter=new BLEActivityExtendableListViewAdapter(this,Fatherlist,Childlist);
        expandableListView=findViewById(R.id.expend_list);
        expandableListView.setAdapter(mBLEActivityExtendableListViewAdapter);
        expandableListView.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() {
            @Override
            public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) {
                Toast.makeText(getApplicationContext(), Fatherlist[groupPosition], Toast.LENGTH_SHORT).show();
                return false;
            }
        });

//子元素的点击事件监听
        expandableListView.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
            @Override
            public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {
                Toast.makeText(getApplicationContext(), Childlist[groupPosition][childPosition], Toast.LENGTH_SHORT).show();
                Characteristic_UUID.setText(Childlist[groupPosition][childPosition]);
                //此函数用来改变选中数组中的值
           mBLEActivityExtendableListViewAdapter.Click_Child_Item(groupPosition,childPosition);
                return false;
            }
        });
        expandableListView.setOnGroupExpandListener(new ExpandableListView.OnGroupExpandListener() {
            @Override
            public void onGroupExpand(int groupPosition) {
                int count=mBLEActivityExtendableListViewAdapter.getGroupCount();
                for(int i = 0;i < count;i++) {
                    if (i != groupPosition) {
                        expandableListView.collapseGroup(i);
                    }
                }
            }
        });

}}

适配器类,在修改了适配器的数据之后,要即时记得 notifyDataSetChanged();否则是不会有改变的,而我为了只选择一个,所以,Item_check需要每次都重新重新赋值,且在初始化时,需要根据数据的大小去动态的赋值二维数据的大小。

//********************************适配器类**************************
public class BLEActivityExtendableListViewAdapter extends BaseExpandableListAdapter {
  public String[] groupString;
    public String[][] childString;
    public boolean[][] Item_check;
    //构造函数来初始化我的数据
     public BLEActivityExtendableListViewAdapter(Context context,String[] FatherData,String[][] ChildData){
        //this.mcontext=context;
        groupString=FatherData;
        childString=ChildData;
        InitItem_check();
    }
//.........其它重写函数就不重复了,只记录核心的代码。
  @Override
    public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
        ChildViewHolder childViewHolder;
        if(convertView ==null){
          convertView=LayoutInflater.from(parent.getContext()).inflate(R.layout.ablecon_expandablelistview_child_item,parent,false);
            childViewHolder=new ChildViewHolder();
            childViewHolder.tvTitle=convertView.findViewById(R.id.expand_child);
            childViewHolder.WriteImage=convertView.findViewById(R.id.child_write);

            convertView.setTag(childViewHolder);
        }else{
            childViewHolder=(ChildViewHolder)convertView.getTag();
        }
        childViewHolder.tvTitle.setText(childString[groupPosition][childPosition]);
		//就是这里,每次去获得子元素时都会去判断这个选中的图标是否需要去显示
        if(Item_check[groupPosition][childPosition]) {
            childViewHolder.WriteImage.setVisibility(View.VISIBLE);
        }else{
            childViewHolder.WriteImage.setVisibility(View.GONE);
        }

        return convertView;
    }
    //*******************初始化Item_check*********************************
        private void InitItem_check(){
        Item_check=new boolean[childString.length ][];
        boolean[] tempo_Item_check=null;
        //二维数组动态赋值。
        for (int i=0;i<Item_check.length;i++){
            for(int j=0;j<childString[i].length;j++){
                if(j==0){tempo_Item_check=new boolean[childString[i].length];}
                tempo_Item_check[j]=false;//先全部都先赋值flase
            }
            Item_check[i]=tempo_Item_check;
        }
    }
    //**********************点击选中的函数,将指定位置的数组赋值true*********
       public void Click_Child_Item(int groupPosition, int childPosition){
		//若要多选or点击取消的话,可以进行一个判断以及把数组的值不清除即可。
        for (int i=0;i<Item_check.length;i++){
            for(int j=0;j<Item_check[i].length;j++){
                Item_check[i][j]=false;
            }
        }
        Item_check[groupPosition][childPosition]=true;
        notifyDataSetChanged();//记得即时notify
    }
}

因为个人还不会用node节点这个东西,虽然能理解。但是代码还是不会用,之后如果有更多的列表的话,感觉用node可能也会方便一些。记录下来,告诫自己有一些东西本质上应该是可以一样的,而且涉及方法也说不定是一样的。不要被外表的不同掩盖住它的本质。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值