(转载) listview实现微信朋友圈嵌套

 

listview实现微信朋友圈嵌套 

标签: androidlistview
 分类:
android(8) 
 

目录(?)[+]

 

项目下载:https://github.com/Victoria0316/NestListview/tree/master

在项目中用到listview中再嵌套一个listview,两层也有监听,都没有问题。其实,主要解决里面那一层的listview的高度计算就可以,外面那一层listview自动计算。

 

实现效果图

 

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

3、ChildListView

 

[java]  view plain copy
 
  1. package com.nest.view;  
  2.   
  3. import android.content.Context;  
  4. import android.util.AttributeSet;  
  5. import android.widget.ListView;  
  6.   
  7. public class ChildListView extends ListView {  
  8.   
  9.     public ChildListView(Context context, AttributeSet attrs, int defStyle) {  
  10.         super(context, attrs, defStyle);  
  11.         // TODO Auto-generated constructor stub  
  12.     }  
  13.   
  14.     public ChildListView(Context context, AttributeSet attrs) {  
  15.         super(context, attrs);  
  16.         // TODO Auto-generated constructor stub  
  17.     }  
  18.   
  19.     public ChildListView(Context context) {  
  20.         super(context);  
  21.         // TODO Auto-generated constructor stub  
  22.     }  
  23.   
  24.     @Override  
  25.     public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {  
  26.   
  27.         int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);  
  28.         super.onMeasure(widthMeasureSpec, expandSpec);  
  29.     }  
  30. }  

里面listview的高度的计算。

 

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

 

[java]  view plain copy
 
  1. package com.nest.adapt;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5. import android.content.Context;  
  6. import android.view.View;  
  7. import android.view.ViewGroup;  
  8. import android.view.View.OnClickListener;  
  9. import android.widget.AdapterView;  
  10. import android.widget.AdapterView.OnItemClickListener;  
  11. import android.widget.Button;  
  12. import android.widget.ListView;  
  13. import android.widget.TextView;  
  14. import android.widget.Toast;  
  15. import com.nest.activity.R;  
  16. import com.nest.base.BaseObjectListAdapter;  
  17. import com.nest.entity.Entity;  
  18. import com.nest.entity.ShowEntity;  
  19.   
  20. /** 
  21.  * 父listview适配器 
  22.  * @author mmsx 
  23.  * 
  24.  */  
  25. public class ParentAdapt extends BaseObjectListAdapter{  
  26.       
  27.     private ArrayList<ShowEntity> mChildList;  
  28.     public static int mParentItem = -1;  
  29.     public static boolean mbShowChild = false;  
  30.       
  31.     public ParentAdapt(Context context, List<? extends Entity> datas) {  
  32.         super(context, datas);  
  33.         initData();  
  34.     }  
  35.       
  36.     private void initData() {  
  37.         mChildList = new ArrayList<ShowEntity>();  
  38.         mChildList.clear();  
  39.         for (int i = 0; i < 5; i++) {  
  40.             ShowEntity tempEntity = new ShowEntity("字标题" + String.valueOf(i), "内容");  
  41.             mChildList.add(tempEntity);  
  42.         }  
  43.     }  
  44.   
  45.     @Override  
  46.     public View getView(int position, View convertView, ViewGroup parent) {  
  47.         ViewHolder vHolder = null;  
  48.         if (convertView == null) {  
  49.             vHolder = new ViewHolder();  
  50.             convertView = mInflater.inflate(R.layout.activity_main_list_item, null);  
  51.             vHolder.textViewTitle = (TextView)convertView.findViewById(R.id.textView_1);  
  52.             vHolder.textViewContent= (TextView)convertView.findViewById(R.id.textView_2);  
  53.             vHolder.listViewItem = (ListView)convertView.findViewById(R.id.listView_child);  
  54.             vHolder.buttonStake = (Button)convertView.findViewById(R.id.button_1);  
  55.             convertView.setTag(vHolder);  
  56.         }else {  
  57.             vHolder = (ViewHolder) convertView.getTag();  
  58.         }  
  59.           
  60.         ShowEntity tempEntity = (ShowEntity) mDatas.get(position);  
  61.         vHolder.textViewTitle.setText(tempEntity.getTitle());  
  62.         vHolder.textViewContent.setText(tempEntity.getContent());  
  63.           
  64.         //点击那个弹出那个,如果已经弹出就收回子listview  
  65.         if (mParentItem == position && mbShowChild) {  
  66.             //子listview实在这里加载数据的  
  67.             ChildAdapt tempAdapt = new ChildAdapt(mContext, mChildList);  
  68.             vHolder.listViewItem.setAdapter(tempAdapt);  
  69.             vHolder.listViewItem.setVisibility(View.VISIBLE);  
  70.               
  71.             //子listview的点击监听  
  72.             vHolder.listViewItem.setOnItemClickListener(new OnItemClickListener() {  
  73.   
  74.                 @Override  
  75.                 public void onItemClick(AdapterView<?> parent, View view,  
  76.                         int position, long id) {  
  77.                     Toast.makeText(mContext, "Child Listview" + String.valueOf(position), Toast.LENGTH_SHORT).show();  
  78.                       
  79.                 }  
  80.             });  
  81.         }else {  
  82.             vHolder.listViewItem.setVisibility(View.GONE);  
  83.         }  
  84.           
  85.         vHolder.buttonStake.setOnClickListener(new ParentButtonLisener());  
  86.         //记住是那个button事件  
  87.         vHolder.buttonStake.setTag(position);  
  88.           
  89.         return convertView;  
  90.     }  
  91.       
  92.     class ViewHolder{  
  93.         TextView textViewTitle;  
  94.         TextView textViewContent;  
  95.         ListView listViewItem;  
  96.         Button buttonStake;  
  97.     }  
  98.       
  99.     //父listview的button的监听  
  100.     private class ParentButtonLisener implements OnClickListener{  
  101.         @Override  
  102.         public void onClick(View v) {  
  103.             Integer nPosition = (Integer) (v.getTag());  
  104.             Toast.makeText(mContext, "提示" + String.valueOf(nPosition.intValue()), Toast.LENGTH_SHORT).show();  
  105.         }  
  106.     }  
  107. }  

 

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

 

 

[java]  view plain copy
 
  1. package com.nest.adapt;  
  2.   
  3. import java.util.List;  
  4. import android.content.Context;  
  5. import android.view.View;  
  6. import android.view.ViewGroup;  
  7. import android.widget.TextView;  
  8. import com.nest.activity.R;  
  9. import com.nest.base.BaseObjectListAdapter;  
  10. import com.nest.entity.Entity;  
  11. import com.nest.entity.ShowEntity;  
  12. /** 
  13.  * 子listview适配器 
  14.  * @author mmsx 
  15.  * 
  16.  */  
  17. public class ChildAdapt extends BaseObjectListAdapter{  
  18.   
  19.     public ChildAdapt(Context context, List<? extends Entity> datas) {  
  20.         super(context, datas);  
  21.     }  
  22.   
  23.     @Override  
  24.     public View getView(int position, View convertView, ViewGroup parent) {  
  25.         ViewHolder vHolder = null;  
  26.         if (convertView == null) {  
  27.             vHolder = new ViewHolder();  
  28.             convertView = mInflater.inflate(R.layout.activity_main_list_item_1, null);  
  29.             vHolder.textViewTitle = (TextView)convertView.findViewById(R.id.textView_1);  
  30.             vHolder.textViewContent= (TextView)convertView.findViewById(R.id.textView_2);  
  31.             convertView.setTag(vHolder);  
  32.         }else {  
  33.             vHolder = (ViewHolder) convertView.getTag();  
  34.         }  
  35.         ShowEntity tempEntity = (ShowEntity) mDatas.get(position);  
  36.         vHolder.textViewTitle.setText(tempEntity.getTitle());  
  37.         vHolder.textViewContent.setText(tempEntity.getContent());  
  38.         return convertView;  
  39.     }  
  40.       
  41.     class ViewHolder{  
  42.         TextView textViewTitle;  
  43.         TextView textViewContent;  
  44.     }  
  45. }  

 

6、实现调用MainActivity

 

 

[java]  view plain copy
 
  1. package com.nest.activity;  
  2.   
  3. import java.util.ArrayList;  
  4.   
  5. import com.nest.adapt.ParentAdapt;  
  6. import com.nest.entity.ShowEntity;  
  7. import android.os.Bundle;  
  8. import android.view.View;  
  9. import android.widget.AdapterView;  
  10. import android.widget.AdapterView.OnItemClickListener;  
  11. import android.widget.ListView;  
  12. import android.app.Activity;  
  13. /** 
  14.  * listview嵌套listview实现效果 
  15.  * @author mmsx 
  16.  * 
  17.  */  
  18. public class MainActivity extends Activity {  
  19.       
  20.     private ParentAdapt mParentAdapt;  
  21.     private ArrayList<ShowEntity> mParentList;  
  22.   
  23.     @Override  
  24.     protected void onCreate(Bundle savedInstanceState) {  
  25.         super.onCreate(savedInstanceState);  
  26.         setContentView(R.layout.activity_main);  
  27.           
  28.         initData();  
  29.         initView();  
  30.     }  
  31.   
  32.     private void initData() {  
  33.         mParentList = new ArrayList<ShowEntity>();  
  34.         mParentList.clear();  
  35.         for (int i = 0; i < 20; i++) {  
  36.             ShowEntity tempEntity = new ShowEntity("标题" + String.valueOf(i), "内容");  
  37.             mParentList.add(tempEntity);  
  38.         }  
  39.     }  
  40.   
  41.     private void initView() {  
  42.         ListView listView = (ListView)findViewById(R.id.listView1);  
  43.         mParentAdapt = new ParentAdapt(this, mParentList);  
  44.         listView.setAdapter(mParentAdapt);  
  45.         listView.setOnItemClickListener(new AdaptItemClick());  
  46.           
  47.         //长按listview就不写示范了  
  48. //      listView.setOnItemLongClickListener(listener);  
  49.     }  
  50.       
  51.     //父listview的单击事件的监听  
  52.     private class AdaptItemClick implements OnItemClickListener{  
  53.         @Override  
  54.         public void onItemClick(AdapterView<?> parent, View view, int position,  
  55.                 long id) {  
  56.             if (ParentAdapt.mParentItem == position && ParentAdapt.mbShowChild) {  
  57.                 ParentAdapt.mbShowChild = false;  
  58.             }else {  
  59.                 ParentAdapt.mbShowChild = true;  
  60.             }  
  61.             ParentAdapt.mParentItem = position;  
  62.             mParentAdapt.notifyDataSetChanged();  
  63.         }  
  64.     }  
  65.   
  66. }  

 

 
0
 
0
 
 
 
 
 
 
查看评论

  暂无评论

 
 
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
 
 
 
 
 

转载于:https://www.cnblogs.com/liupengfei005257/p/7448888.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个简单的示例代码,演示如何使用 ListView 和 SimpleAdapter 实现微信朋友列表: MainActivity.java ``` public class MainActivity extends AppCompatActivity { private ListView listView; private SimpleAdapter adapter; private List<Map<String, Object>> data; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 准备数据 data = new ArrayList<>(); Map<String, Object> item1 = new HashMap<>(); item1.put("name", "小明"); item1.put("content", "你好啊"); item1.put("time", "上午 10:00"); item1.put("avatar", R.drawable.avatar1); data.add(item1); Map<String, Object> item2 = new HashMap<>(); item2.put("name", "小红"); item2.put("content", "在干嘛呢"); item2.put("time", "上午 9:30"); item2.put("avatar", R.drawable.avatar2); data.add(item2); // 创建 SimpleAdapter adapter = new SimpleAdapter( this, data, R.layout.list_item, new String[] { "name", "content", "time", "avatar" }, new int[] { R.id.name, R.id.content, R.id.time, R.id.avatar } ); // 设置 Adapter listView = findViewById(R.id.list_view); listView.setAdapter(adapter); } } ``` activity_main.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"> <ListView android:id="@+id/list_view" android:layout_width="match_parent" android:layout_height="match_parent"> </ListView> </LinearLayout> ``` list_item.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="wrap_content" android:orientation="horizontal" android:padding="16dp"> <ImageView android:id="@+id/avatar" android:layout_width="64dp" android:layout_height="64dp" android:src="@mipmap/ic_launcher" /> <LinearLayout android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:orientation="vertical" android:layout_marginStart="16dp"> <TextView android:id="@+id/name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="16sp" android:textStyle="bold" android:text="姓名" /> <TextView android:id="@+id/content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="14sp" android:textColor="@color/colorTextSecondary" android:text="内容" /> </LinearLayout> <TextView android:id="@+id/time" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="14sp" android:textColor="@color/colorTextSecondary" android:text="时间" /> </LinearLayout> ``` 这个示例代码中,我们使用了一个 ListView,将数据绑定到了一个 SimpleAdapter 上,然后将 Adapter 设置到了 ListView 上。每个列表项包含一个头像、姓名、内容和时间。你可以根据自己的需求修改布局和数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值