android expandlistview三級動態列表使用及各級點擊事件

功能(以模擬音樂播放器各級文件夾目錄爲例):
1、首先通過按鍵點擊事件生成首級列表目錄
2、通過點擊首級列表進行動態數據更新生成二級目錄
3、生成三級目錄後,最終在第三級目錄上進行條目的點擊事件
在這裏插入圖片描述



在這裏插入圖片描述

activity.xml 內容
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">

<ExpandableListView
android:layout_width="200dp"
android:layout_height="350dp"
android:layout_weight="1"
android:id = "@+id/expand_ListView"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_weight="1">


<Button
android:id="@+id/button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="onClick"
android:text="Button" />

<Button
android:id="@+id/button2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="onClick"
android:text="Button" />

<Button
android:id="@+id/button3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="onClick"
android:text="Button" />
</LinearLayout>


</LinearLayout>


組選項視圖(組列表的每一行的顯示格式)
groupitem_expend.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">

<ImageView
android:id="@+id/iv_tip"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
/>
<TextView
android:id="@+id/groupmedia_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="25sp"
android:layout_marginLeft="20dp"
android:text="TextView" />

</LinearLayout>


子選項的視圖(和組的差不多,少了一個指示箭頭的圖片)
childitem_expend.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">


<TextView
android:id="@+id/childmedia_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="25sp"
android:text="TextView" />

</LinearLayout>


mainActivity.java


package com.thirdexpand;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ExpandableListView;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class MainActivity extends AppCompatActivity {
   
   


String mFolderName = "我的音樂";

static String mMusicName = "喜刷刷";
String mSubFolderName = "青春";
static byte[] mFolderUid = {
   
   1,2,3,4,5,6,7,8};
static byte[] mMediaUid = {
   
   1,2,3,4,5,6,7,8};

static expandableAdapter expandableadapter;
static ExpandableListView expandableLv;
public static List<mediaGroup> mediagroupList = new ArrayList<>();

final static String TAG = "MainActivity---------";

static Handler handler = new Handler(){
   
   
@Override
public void handleMessage(@NonNull Message msg) {
   
   
switch (msg.what){
   
   
case 1:
expandableadapter.notifyDataSetChanged();
//expandableLv.setAdapter(expandableadapter);
break;
case 2:
expandableLv.setAdapter(expandableadapter);
break;
}
super.handleMessage(msg);
}
};


@Override
protected void onCreate(Bundle savedInstanceState) {
   
   
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

expandableadapter = new expandableAdapter(MainActivity.this,mediagroupList);
expandableLv = findViewById(R.id.expand_ListView);
expandableLv.setAdapter(expandableadapter);
expandableLv.setGroupIndicator(null);

expandableLv.setOnTouchListener(new View.OnTouchListener() {
   
   
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
   
   

return false;
}
});

expandableLv.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() {
   
   
@Override
public boolean onGroupClick(ExpandableListView expandableListView, View view, int i, long l) {
   
   
if(expandableListView.isGroupExpanded(i)){
   
   
Log.i(TAG,"GroupExpanded-----"+expandableListView.isGroupExpanded(i));
expandableListView.collapseGroup(i);
}else{
   
   
expandableListView.expandGroup(i);
Log.i(TAG,"collapseGroup-----"+expandableListView.isGroupExpanded(i)+"----i: "+i);
for(int ii = 1; ii < 5; ii++) {
   
   
mediaChild mediachild = new mediaChild(mSubFolderName + i+"-"+ii, mFolderUid);
updateMediaChildItem(mediachild,i);
}
new Handler().postDelayed(new Runnable() {
   
   
@Override
public void run() {
   
   

Message msg= new Message();
msg. what =1;
handler.sendMessage(msg);
}
},2000);
}
return true;
}
});

expandableLv.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
   
   
@Override
public boolean onChildClick(ExpandableListView expandableListView, View view, int i, int i1, long l) {
   
   
Log.i(TAG,"onChildClick-----**************"+"i: " + i+"i1: "+i1);
for(int iii = 1; iii < 5; iii ++){
   
   
mediaSecondChild mediasecondchild = new mediaSecondChild(mMusicName + i+"-"+i1+"-"+iii, mFolderUid);
updateMediaSecondChildItem(mediasecondchild,i,i1);
new Handler().postDelayed(new Runnable() {
   
   
@Override
public void run() {
   
   
Message msg= new Message();
msg. what =1;
handler.sendMessage(msg);
}
},2000);
}
return true;
}
});
expandableLv.setOnGroupExpandListener(new ExpandableListView.OnGroupExpandListener() {
   
   
@Override
public void onGroupExpand(int i) {
   
   
Log.i(TAG,"onGroupExpand-------"+"i: "+i);
}

});
expandableLv.setOnGroupCollapseListener(new ExpandableListView.OnGroupCollapseListener() {
   
   
@Override
public void onGroupCollapse(int i) {
   
   
Log.i(TAG,"onGroupCollapse--------"+"i: "+i);
}
});
}

public static void updateMediaGroupItem(mediaGroup item){
   
   
List<mediaChild> tmpList = new ArrayList<mediaChild>();
item.childList = tmpList;
mediagroupList.add(item);
return;
}

public static void updateMediaChildItem(mediaChild item,int i ){
   
   
item.secondChildList = new ArrayList<mediaSecondChild>();
mediagroupList.get(i).childList.add(item);
}

public static void updateMediaSecondChildItem(mediaSecondChild secondChildItem, int i, int ii){
   
   
mediagroupList.get(i).childList.get(ii).secondChildList.add(secondChildItem);

}

public void onClick(View view) {
   
   
switch(view.getId()){
   
   
case R.id.button:
for(int i = 1; i < 5; i++) {
   
   
mediaGroup mediagroup = new mediaGroup(mFolderName+i, mFolderUid);
updateMediaGroupItem(mediagroup);
}
new Handler().postDelayed(new Runnable() {
   
   
@Override
public void run() {
   
   
Message msg = new Message();
msg.what = 1;
handler.sendMessage(msg);
}
},2000);
break;
case R.id.button2:
break;
case R.id.button3:
break;
}
}
}


expandableAdapter.java

package com.thirdexpand;

import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Color;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.BaseExpandableListAdapter;
import android.widget.ExpandableListView;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import java.util.List;


public class expandableAdapter extends BaseExpandableListAdapter {
   
   
Context context;
List<mediaGroup> group;
final String TAG = "MainActivity--------expandableAdapter";
int groupId;

public expandableAdapter(Context context, List<mediaGroup> group){
   
   
this.context = context;
this.group = group;
}

@Override
public int getGroupCount() {
   
   
//return group.size();
return group!=null:group.size():0; // 此處加入判斷不爲空時返回
}

@Override
public int getChildrenCount(int groupPosition) {
   
   
return 1;
}

@Override
public Object getGroup(int groupPosition) {
   
   
return group.get(groupPosition);
}

@Override
public Object getChild(int groupPosition, int childPosition) {
   
   
return group.get(groupPosition).childList.get(childPosition);
}

@Override
public long getGroupId(int groupPosition) {
   
   
return groupPosition;
}

@Override
public long getChildId(int groupPosition, int childPosition) {
   
   
return childPosition;
}

@Override
public boolean hasStableIds() {
   
   
return false;
}

@Override
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
   
   
mediaGroup mediagroup = (mediaGroup) getGroup(groupPosition);
View view = LayoutInflater.from(context).inflate(R.layout.groupitem_expend,null);
ImageView iv_tip = view.findViewById(R.id.iv_tip);
if(isExpanded){
   
   
iv_tip.setImageResource(R.drawable.down);
}else{
   
   
iv_tip.setImageResource(R.drawable.right);
}
TextView name = view.findViewById(R.id.groupmedia_name);
name.setText(mediagroup.getName());
return view;
}

private TextView getGenericView(String string) {
   
   
AbsListView.LayoutParams layoutParams = new AbsListView.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT);

TextView textView = new TextView(context);
textView.setLayoutParams(layoutParams);

textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT);

textView.setPadding(40, 20, 0, 20);
textView.setText(string);
textView.setTextColor(Color.RED);
return textView;
}
@SuppressLint("LongLogTag")
@Override
public View getChildView(final int groupPosition, final int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
   
   

final CustomExpandableListView view = new CustomExpandableListView(context);

final SecondexpandableAdapter adapter = new SecondexpandableAdapter(context,group.get(groupPosition).childList);
Log.i(TAG,"getChildView---"+"groupPosition--"+groupPosition+", childPosition: "+childPosition);
//groupId = groupPosition;
view.setAdapter(adapter);
view.setGroupIndicator(null);
view.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() {
   
   
@SuppressLint("LongLogTag")
@Override
public boolean onGroupClick(ExpandableListView parent, View v, int i, long id) {
   
   
if(parent.isGroupExpanded(i)){
   
   
Log.i(TAG,"GroupExpanded-----"+parent.isGroupExpanded(i));
parent.collapseGroup(i);
}else{
   
   
parent.expandGroup(i);

Log.i(TAG,"collapseGroup-----"+parent.isGroupExpanded(i)+"----i: "+i);
for(int iii = 1; iii < 5; iii ++){
   
   
mediaSecondChild mediasecondchild = new mediaSecondChild(MainActivity.mMusicName + i+"-"+"-"+iii, MainActivity.mFolderUid);
//MainActivity.updateMediaSecondChildItem(mediasecondchild,groupId,groupPosition);
MainActivity.updateMediaSecondChildItem(mediasecondchild,groupPosition,i);

}
new Handler().postDelayed(new Runnable() {
   
   
@Override
public void run() {
   
   
adapter.notifyDataSetChanged();
}
},2000);

}
return true;
}
});

view.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
   
   
@SuppressLint("LongLogTag")
@Override
public boolean onChildClick(ExpandableListView expandableListView, View view, int i, int i1, long l) {
   
   
Log.i(TAG,"setOnChildClickListener--------"+"i: "+i+"--i1: "+i1+"-----"+MainActivity.mediagroupList.get(groupPosition).childList.get(i).secondChildList.get(i1));
return true;
}
});

view.setOnGroupExpandListener(new ExpandableListView.OnGroupExpandListener() {
   
   
@SuppressLint("LongLogTag")
@Override
public void onGroupExpand(int i) {
   
   
Log.i(TAG,"onGroupExpand--------"+"i: "+i+"childposition: "+childPosition);
AbsListView.LayoutParams lp = new AbsListView.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
(group.get(groupPosition).childList.get(i).secondChildList.size() + 1)* (int) 20);
view.setLayoutParams(lp);
// adapter.notifyDataSetChanged();

}
});
view.setOnGroupCollapseListener(new ExpandableListView.OnGroupCollapseListener() {
   
   
@SuppressLint("LongLogTag")
@Override
public void onGroupCollapse(int i) {
   
   
Log.i(TAG,"onGroupCollapse-------"+"i: "+groupPosition);
AbsListView.LayoutParams lp = new AbsListView.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
(int) 20);
view.setLayoutParams(lp);
//adapter.notifyDataSetChanged();
}
});

view.setPadding(20,0,0,0);
return view;
}

@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
   
   
return true;
}
}


SecondexpandableAdapter.java


package com.thirdexpand;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import java.util.List;

public class SecondexpandableAdapter extends BaseExpandableListAdapter {
   
   
Context context;
List<mediaChild> child;

public SecondexpandableAdapter(Context context, List<mediaChild> child){
   
   
this.context = context;
this.child = child;
}

@Override
public int getGroupCount() {
   
   
//return child.size();
return child!=null?child.size():0;//避免出現數據空 導致奔潰的問題
}

@Override
public int getChildrenCount(int groupPosition) {
   
   
//return child.get(groupPosition).secondChildList.size();
return (child!=null && child.get(groupPosition).secondChildList!=null)?child.get(groupPosition).secondChildList.size():0;
}

@Override
public Object getGroup(int groupPosition) {
   
   
return child.get(groupPosition);
}

@Override
public Object getChild(int groupPosition, int childPosition) {
   
   
return child.get(groupPosition).secondChildList.get(childPosition);
}

@Override
public long getGroupId(int groupPosition) {
   
   
return groupPosition;
}

@Override
public long getChildId(int groupPosition, int childPosition) {
   
   
return childPosition;
}

@Override
public boolean hasStableIds() {
   
   
return false;
}

@Override
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
   
   
// mediaGroup mediagroup = (mediaGroup) getGroup(groupPosition);
mediaChild mediaChild = (mediaChild) getGroup(groupPosition);
View view = LayoutInflater.from(context).inflate(R.layout.groupitem_expend,null);
ImageView iv_tip = view.findViewById(R.id.iv_tip);
if(isExpanded){
   
   
iv_tip.setImageResource(R.drawable.down);
}else{
   
   
iv_tip.setImageResource(R.drawable.right);
}
TextView name = view.findViewById(R.id.groupmedia_name);
name.setText(mediaChild.getName());
return view;
}

@Override
public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
   
   
mediaSecondChild mediasecondchild = (mediaSecondChild) getChild(groupPosition,childPosition);
View view = LayoutInflater.from(context).inflate(R.layout.childitem_expend,null);
TextView name = view.findViewById(R.id.childmedia_name);
name.setText(mediasecondchild.getName());
return view;
}

@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
   
   
return true;
}
}


customExpandableListview.java

package com.thirdexpand;

import android.content.Context;
import android.util.AttributeSet;
import android.widget.ExpandableListView;

public class CustomExpandableListView extends ExpandableListView {
   
   
public CustomExpandableListView(Context context) {
   
   
super(context);
}

public CustomExpandableListView(Context context, AttributeSet attrs, int defStyleAttr) {
   
   
super(context, attrs, defStyleAttr);
}

public CustomExpandableListView(Context context, AttributeSet attrs) {
   
   
super(context, attrs);
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
   
   
// 解決顯示不全的問題
int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2
, MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);
}
}


另外三個數據類

mediaGroup.java

package com.thirdexpand;

import java.util.ArrayList;
import java.util.List;

public class mediaGroup {
   
   
private String name;
private String uid;
private byte[] Uid;
public List<mediaChild> childList;

public mediaGroup(String name, String uid, byte[] Uid){
   
   
this.name = name;
this.uid = uid;
this.Uid = Uid;
}

public mediaGroup(String name, byte[] Uid){
   
   
this.name = name;
this.Uid = Uid;
}


public String getUid() {
   
   
return uid;
}
public byte[] getUUid(){
   
   
return Uid;
}

public String getName() {
   
   
return name;
}
}


mediaChild.java
package com.thirdexpand;

import java.util.ArrayList;
import java.util.List;

public class mediaChild {
   
   
private String name;
private String uid;
private byte[] Uid;
public List<mediaSecondChild> secondChildList;

public mediaChild(String name, String uid){
   
   
this.uid = uid;
this.name = name;
}
public mediaChild(String name, byte[] Uid){
   
   
this.Uid = Uid;
this.name = name;
}

public String getUid() {
   
   
return uid;
}
public byte[] getUUid(){
   
   
return Uid;
}
public String getName() {
   
   
return name;
}

}

mediaSecondChild.java
package com.thirdexpand;

public class mediaSecondChild {
   
   
private String name;
private byte[] uid;

public mediaSecondChild(String name, byte[] uid){
   
   
this.uid = uid;
this.name = name;
}

public byte[] getUid() {
   
   
return uid;
}

public String getName() {
   
   
return name;
}

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章