android 嵌套的listview示例(可参考实现朋友圈评论)

来源:互联网 发布:print is python 编辑:程序博客网 时间:2024/05/22 08:09

最近在项目中用到listview中再嵌套一个listview,两层也有监听,都没有问题。其实,主要解决里面那一层的listview的高度计算就可以,外面那一层listview自动计算。加上里面那层展开的,就是高度。这种解决方案经常应用于朋友圈的评论。每一条说说,然后下面有评论。

项目下载地址:http://download.csdn.net/detail/qq_16064871/9334993

1、项目结构图



2、实现效果图


这上面效果图的监听两层都有,以及外面的button都可以。够多样化吧。

3、ChildListView

package com.nest.view;import android.content.Context;import android.util.AttributeSet;import android.widget.ListView;public class ChildListView extends ListView {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}public ChildListView(Context context) {super(context);// TODO Auto-generated constructor stub}@Overridepublic void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);super.onMeasure(widthMeasureSpec, expandSpec);}}

里面listview的高度的计算。

4、外面那层listview的适配器ParentAdapt

package com.nest.adapt;import java.util.ArrayList;import java.util.List;import android.content.Context;import android.view.View;import android.view.ViewGroup;import android.view.View.OnClickListener;import android.widget.AdapterView;import android.widget.AdapterView.OnItemClickListener;import android.widget.Button;import android.widget.ListView;import android.widget.TextView;import android.widget.Toast;import com.nest.activity.R;import com.nest.base.BaseObjectListAdapter;import com.nest.entity.Entity;import com.nest.entity.ShowEntity;/** * 父listview适配器 * @author mmsx * */public class ParentAdapt extends BaseObjectListAdapter{private ArrayList<ShowEntity> mChildList;public static int mParentItem = -1;public static boolean mbShowChild = false;public ParentAdapt(Context context, List<? extends Entity> datas) {super(context, datas);initData();}private void initData() {mChildList = new ArrayList<ShowEntity>();mChildList.clear();for (int i = 0; i < 5; i++) {ShowEntity tempEntity = new ShowEntity("字标题" + String.valueOf(i), "内容");mChildList.add(tempEntity);}}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder vHolder = null;if (convertView == null) {vHolder = new ViewHolder();convertView = mInflater.inflate(R.layout.activity_main_list_item, null);vHolder.textViewTitle = (TextView)convertView.findViewById(R.id.textView_1);vHolder.textViewContent= (TextView)convertView.findViewById(R.id.textView_2);vHolder.listViewItem = (ListView)convertView.findViewById(R.id.listView_child);vHolder.buttonStake = (Button)convertView.findViewById(R.id.button_1);convertView.setTag(vHolder);}else {vHolder = (ViewHolder) convertView.getTag();}ShowEntity tempEntity = (ShowEntity) mDatas.get(position);vHolder.textViewTitle.setText(tempEntity.getTitle());vHolder.textViewContent.setText(tempEntity.getContent());//点击那个弹出那个,如果已经弹出就收回子listviewif (mParentItem == position && mbShowChild) {//子listview实在这里加载数据的ChildAdapt tempAdapt = new ChildAdapt(mContext, mChildList);vHolder.listViewItem.setAdapter(tempAdapt);vHolder.listViewItem.setVisibility(View.VISIBLE);//子listview的点击监听vHolder.listViewItem.setOnItemClickListener(new OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view,int position, long id) {Toast.makeText(mContext, "Child Listview" + String.valueOf(position), Toast.LENGTH_SHORT).show();}});}else {vHolder.listViewItem.setVisibility(View.GONE);}vHolder.buttonStake.setOnClickListener(new ParentButtonLisener());//记住是那个button事件vHolder.buttonStake.setTag(position);    return convertView;}class ViewHolder{TextView textViewTitle;TextView textViewContent;ListView listViewItem;Button buttonStake;}//父listview的button的监听private class ParentButtonLisener implements OnClickListener{@Overridepublic void onClick(View v) {Integer nPosition = (Integer) (v.getTag());Toast.makeText(mContext, "提示" + String.valueOf(nPosition.intValue()), Toast.LENGTH_SHORT).show();}}}

5、里面那层listview的适配器ChildAdapt

package com.nest.adapt;import java.util.List;import android.content.Context;import android.view.View;import android.view.ViewGroup;import android.widget.TextView;import com.nest.activity.R;import com.nest.base.BaseObjectListAdapter;import com.nest.entity.Entity;import com.nest.entity.ShowEntity;/** * 子listview适配器 * @author mmsx * */public class ChildAdapt extends BaseObjectListAdapter{public ChildAdapt(Context context, List<? extends Entity> datas) {super(context, datas);}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder vHolder = null;if (convertView == null) {vHolder = new ViewHolder();convertView = mInflater.inflate(R.layout.activity_main_list_item_1, null);vHolder.textViewTitle = (TextView)convertView.findViewById(R.id.textView_1);vHolder.textViewContent= (TextView)convertView.findViewById(R.id.textView_2);convertView.setTag(vHolder);}else {vHolder = (ViewHolder) convertView.getTag();}ShowEntity tempEntity = (ShowEntity) mDatas.get(position);vHolder.textViewTitle.setText(tempEntity.getTitle());vHolder.textViewContent.setText(tempEntity.getContent());return convertView;}class ViewHolder{TextView textViewTitle;TextView textViewContent;}}

6、实现调用MainActivity

package com.nest.activity;import java.util.ArrayList;import com.nest.adapt.ParentAdapt;import com.nest.entity.ShowEntity;import android.os.Bundle;import android.view.View;import android.widget.AdapterView;import android.widget.AdapterView.OnItemClickListener;import android.widget.ListView;import android.app.Activity;/** * listview嵌套listview实现效果 * @author mmsx * */public class MainActivity extends Activity {private ParentAdapt mParentAdapt;private ArrayList<ShowEntity> mParentList;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initData();initView();}private void initData() {mParentList = new ArrayList<ShowEntity>();mParentList.clear();for (int i = 0; i < 20; i++) {ShowEntity tempEntity = new ShowEntity("标题" + String.valueOf(i), "内容");mParentList.add(tempEntity);}}private void initView() {ListView listView = (ListView)findViewById(R.id.listView1);mParentAdapt = new ParentAdapt(this, mParentList);listView.setAdapter(mParentAdapt);listView.setOnItemClickListener(new AdaptItemClick());//长按listview就不写示范了//listView.setOnItemLongClickListener(listener);}//父listview的单击事件的监听private class AdaptItemClick implements OnItemClickListener{@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position,long id) {if (ParentAdapt.mParentItem == position && ParentAdapt.mbShowChild) {ParentAdapt.mbShowChild = false;}else {ParentAdapt.mbShowChild = true;}ParentAdapt.mParentItem = position;mParentAdapt.notifyDataSetChanged();}}}

布局就不贴,有好几个。有需要下载项目源码。

项目下载地址:http://download.csdn.net/detail/qq_16064871/9334993

2 0