个人认为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可能也会方便一些。记录下来,告诫自己有一些东西本质上应该是可以一样的,而且涉及方法也说不定是一样的。不要被外表的不同掩盖住它的本质。