实现思路:在Activity或者Fragment中先实现一个父ListView,然后在父ListView的adapter中实现子ListView。 MainActivity:
public class MainActivity extends AppCompatActivity { Parent_Adapter adapter; List<ParentData> parentDatas = new ArrayList<>(); private ListView listView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); parentDatas = Read.readParentData(this); adapter = new Parent_Adapter(this, R.layout.parent_list_item, parentDatas); listView = (ListView) findViewById(R.id.Parent_listView); listView.setAdapter(adapter); listView.setOnItemClickListener(new AdapterView.OnItemClickListener(){ @Override public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) { if(Parent_Adapter.mParentItem == position && Parent_Adapter.mShowChild){ Parent_Adapter.mShowChild = false; }else{ Parent_Adapter.mShowChild = true; } Parent_Adapter.mParentItem = position; adapter.notifyDataSetChanged(); } }); } }父Adapter:
public class Parent_Adapter extends ArrayAdapter<ParentData> { private int resourceId; public static int mParentItem = -1; public static boolean mShowChild = false; List<ChildData> childDatas = new ArrayList<>(); List<ParentData> parentDatas = new ArrayList<>(); public Parent_Adapter(Context context, int resource, List<ParentData> parentDataList) { super(context, resource, parentDataList); resourceId = resource; this.parentDatas = parentDataList; } @Override public View getView(int position, View convertView, ViewGroup parent) { ParentData parentData = getItem(position); View view; ViewHolder viewHolder; if(convertView == null){ view = LayoutInflater.from(getContext()).inflate(resourceId,parent,false); viewHolder = new ViewHolder(); viewHolder.title = (TextView) view.findViewById(R.id.displayName); viewHolder.body = (TextView) view.findViewById(R.id.number); viewHolder.list_button = (Button) view.findViewById(R.id.list_button); viewHolder.childList = (ListView) view.findViewById(R.id.childList); view.setTag(viewHolder); }else{ view = convertView; viewHolder = (ViewHolder) view.getTag(); } viewHolder.title.setText(parentData.getTitle()); viewHolder.body.setText(parentData.getBody()); //这里用于存储父listview的item的position,不知道为什么往Read类的方法中传入Context以外的参数会出错,暂时只能这么写 MyApplication.parentPosition = position; if (mParentItem == position && mShowChild) { childDatas = Read.getChildData(getContext()); //实现子listview Child_Adapter childAdapter = new Child_Adapter(getContext()); childAdapter.addAll(childDatas); viewHolder.childList.setAdapter(childAdapter); viewHolder.childList.setVisibility(View.VISIBLE); }else{ viewHolder.childList.setVisibility(View.GONE); } viewHolder.list_button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Toast.makeText(getContext(),"click",Toast.LENGTH_SHORT).show(); } }); return view; } class ViewHolder{ TextView title; TextView body; ListView childList; Button list_button; } }子Adapter:
public class Child_Adapter extends BaseAdapter { private Context context; private List<ChildData> list; public Child_Adapter(Context context){ super(); this.context = context; } public void addAll(List<ChildData> childDatas){ this.list = childDatas; notifyDataSetChanged(); } @Override public int getCount() { return list.size(); } @Override public Object getItem(int i) { return null; } @Override public long getItemId(int i) { return 0; } @Override public View getView(int position, View convertView, ViewGroup viewGroup) { ViewHolder viewHolder; if(convertView == null){ convertView = LayoutInflater.from(context).inflate(R.layout.child_list_item, null,false); viewHolder = new ViewHolder(); viewHolder.Child_title = (TextView)convertView.findViewById(R.id.title); viewHolder.Child_body = (TextView)convertView.findViewById(R.id.body); convertView.setTag(viewHolder); }else{ viewHolder = (ViewHolder) convertView.getTag(); } viewHolder.Child_title.setText(list.get(position).getTitle()); viewHolder.Child_body.setText(list.get(position).getBody()); return convertView; } class ViewHolder{ TextView Child_title; TextView Child_body; } }ChildListView:这里重写子ListView用于设置子ListView中item的高度
public class ChildListView extends ListView { public ChildListView(Context context) { super(context); } public ChildListView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); // TODO Auto-generated constructor stub } public ChildListView(Context context, AttributeSet attrs) { super(context, attrs); // TODO Auto-generated constructor stub } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec, expandSpec); } }Read类:这里的方法用实际的获取数据的方法代替
public class Read { public static List<ParentData> readParentData(Context context){ List<ParentData> parentDataList = new ArrayList<>(); parentDataList.clear(); for(int i = 0;i<10;i++){ String title = "title"; String body = "body"; parentDataList.add(new ParentData(title,body)); } return parentDataList; } public static List<ChildData> getChildData(Context context){ List<ChildData> childDataList = new ArrayList<>(); childDataList.clear(); for(int i = 0;i<3;i++){ String title = "child_title"; String body = "child_body"; childDataList.add(new ChildData(title,body)); } return childDataList; } }父listview的布局:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:http="http://schemas.android.com/apk/res-auto" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" android:descendantFocusability="blocksDescendants"> /*当item中包含button或checkbox等控件,默认情况下listitem会失去焦点,导致无法响应item的事件*/ <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1" android:orientation="vertical"> <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/displayName" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_weight="1"/> <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/number" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_weight="1"/> </LinearLayout> <Button xmlns:android="http://schemas.android.com/apk/res/android" android:focusable="false" android:id="@+id/list_button" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_weight="1" android:layout_margin="2dp" android:text="button" android:textSize="6dp"/> </LinearLayout> <com.example.nestedlistview.Class.ChildListView android:id="@+id/childList" android:layout_width="match_parent" android:layout_height="match_parent"></com.example.nestedlistview.Class.ChildListView> </LinearLayout>