android 在 ListView 的 item 中插入 GridView 仿微信朋友圈图片显示。

转载请声明出处(https://cloud.tencent.com/developer/user/1148436/activities)

先上张效果图:

1,思路简述

        这个肯定是要重写 baseAdapter的了,这里我分了两个数据适配器,一个是自定义的 listView的item 风格xml,另一个是该风格xml文件里面的嵌套的GridView数据适配。然后我们需要两个数据辅助类,类似上述,一个是专门来保存在GridView中要显示的每张图片的信息,例如它的url、name、id等等,暂称该辅助类为 UserImgs,大家可以随便增删,另一个是总的专门保存listView中的item的数据,我们称它为UserInfo,这里,说明下,因为每条 item 都有一个自己的GridView,也就是说,UserInfo中必须要有一个UserImgs类实例,用来存储图片信息。然后,就是代码实现了。

         使用例子放置最后。

2,辅助类的代码

      声明,这两个辅助类,是我根据自己项目所定义的,大家可以据己所需,自行修改,思路掌握了,修改很简单、很快!

第一个,UserImgs

 1 package cn.share.bananacloud.custom_listview_style;
 2 
 3 /**
 4  * Created by Administrator on 2015/9/6.
 5  */
 6 public class UserImgs {
 7 
 8     public int id; //图片的id
 9     public String name; //图片的名称
10     public String urls; //图片的 url
11 
12     public int getId() {
13         return id;
14     }
15     public void setId(int id) {
16         this.id = id;
17     }
18     public String getName() {
19         return name;
20     }
21     public void setName(String name) {
22         this.name = name;
23     }
24     public String getUrls() {
25         return urls;
26     }
27     public void setUrls(String urls) {
28         this.urls = urls;
29     }
30 }

第二个,UserInfo

 1 package cn.share.bananacloud.custom_listview_style;
 2 
 3 /**
 4  * Created by LinGuanHong--af913337456 on 2015/9/6.
 5  * qq:913337456
 6  * email:913337456@qq.com
 7  */
 8 import java.util.ArrayList;
 9 import java.util.List;
10 public class UserInfo {
11     private String headUrl; // 头像 url
12     private String usertext; // 帖子内容
13     private String username; // 用户名称
14     private String usertime; // 发帖时间
15     private String usertalknumber; // 评论数目
16     private List<UserImgs> ui = new ArrayList<UserImgs>(); // 这个就是我说的,UserImgs 实例
17     //--------------------------------------- headUrl
18     public String getHeadUrl() {
19         return headUrl;
20     }
21 
22     public void setHeadUrle(String headUrl) {
23         this.headUrl = headUrl;
24     }
25     //--------------------------------------- Name
26     public String getUserName() {
27         return username;
28     }
29 
30     public void setUserName(String username) {
31         this.username = username;
32     }
33     //--------------------------------------- Text
34     public String getUserText() {
35         return usertext;
36     }
37 
38     public void setUserText(String usertext) {
39         this.usertext = usertext;
40     }
41     //---------------------------------------- Time
42     public String getUserTime() {
43         return usertime;
44     }
45 
46     public void setUserTime(String usertime) {
47         this.usertime = usertime;
48     }
49     //---------------------------------------- TalkNumber
50     public String getUserTalkNumber() {
51         return usertalknumber;
52     }
53 
54     public void setUserTalkNumber(String usertalknumber) {
55         this.usertalknumber = usertalknumber;
56     }
57     //----------------------------------------  post pics and mp3 or mp4
58     public List<UserImgs> getUi() {
59         return ui;
60     }
61     public void setUi(List<UserImgs> ui) {
62         this.ui = ui;
63     }
64 }

3,ListView 的数据适配的重写类

     声明,这个例子和下面的例子的图片显示都采用了开源框架---imageLoder。这个数据适配器是 GridView的数据适配入口,GridView的数据适配在它里面调用配置,必要的代码注释我已给出,其他的都很容易理解。

  1 package cn.share.bananacloud.custom_listview_style;
  2 
  3 /**
  4  * Created by Administrator on 2015/9/6.
  5  */
  6 
  7 import android.content.Context;
  8 import android.graphics.Bitmap;
  9 import android.util.Log;
 10 import android.view.LayoutInflater;
 11 import android.view.View;
 12 import android.view.ViewGroup;
 13 import android.widget.AdapterView;
 14 import android.widget.BaseAdapter;
 15 import android.widget.ImageView;
 16 import android.widget.TextView;
 17 
 18 import com.lgh.addItemListview.mymodule.app2.SharePreferenceHelper;
 19 import com.nostra13.universalimageloader.core.ImageLoader;
 20 import com.nostra13.universalimageloader.core.assist.FailReason;
 21 import com.nostra13.universalimageloader.core.listener.ImageLoadingListener;
 22 
 23 import java.util.List;
 24 
 25 import cn.share.bananacloud.InternetHelper;
 26 import cn.share.bananacloud.R;
 27 import cn.share.bananacloud.commonDataHelper;
 28 import cn.share.bananacloud.imageLoderHelper;
 29 
 30 public class WeChatAdapter extends BaseAdapter {
 31 
 32     protected ImageLoader imageLoader = ImageLoader.getInstance();
 33     private List<UserInfo> mList;
 34     private Context mContext;
 35     SharePreferenceHelper sp;
 36     public WeChatAdapter(Context _context) {
 37         this.mContext = _context;
 38         sp = new SharePreferenceHelper(mContext,"loginrecord",null);
 39     }
 40 
 41     public void setData(List<UserInfo> _list) { //这个函数是数据主入口
 42         this.mList = _list;
 43     }
 44 
 45     @Override
 46     public int getCount() {
 47         return mList.size();
 48     }
 49 
 50     @Override
 51     public UserInfo getItem(int position) {
 52         return mList.get(position);
 53     }
 54 
 55     @Override
 56     public long getItemId(int position) {
 57         return position;
 58     }
 59 
 60     @Override
 61     public View getView(int position, View convertView, ViewGroup parent) {
 62         ViewHolder holder;
 63         if (convertView == null) {
 64             holder = new ViewHolder();
 65             convertView = LayoutInflater.from(mContext).inflate(R.layout.bbs_main_item, parent, false);
 66             holder.gridView = (NoScrollGridView) convertView.findViewById(R.id.gridView);
 67             holder.userHead = (ImageView) convertView.findViewById(R.id.bbs_main_lv_userhead);
 68             holder.username = (TextView) convertView.findViewById(R.id.bbs_main_lv_username);
 69             holder.usertext = (TextView) convertView.findViewById(R.id.bbs_main_lv_item_text);
 70             holder.usertime = (TextView) convertView.findViewById(R.id.bbs_main_lv_usertime);
 71             holder.usertalknumber = (TextView) convertView.findViewById(R.id.bbs_main_lv_item_talknumber);
 72             convertView.setTag(holder);
 73         } else {
 74             holder = (ViewHolder) convertView.getTag();
 75         }
 76         UserInfo mUserInfo = getItem(position);
 77         if (mList != null && mList.size() > 0) { // 判断是否有数据
 78             showHeadImage(holder.userHead,mList.get(position).getHeadUrl());
 79             holder.username.setText(mList.get(position).getUserName());
 80             holder.usertext.setText(mList.get(position).getUserText());
 81             holder.usertime.setText(mList.get(position).getUserTime());
 82             holder.usertalknumber.setText(mList.get(position).getUserTalkNumber());
 83 
 84             if(mUserInfo.getUi().size()>0) { //这里判断该组数据是否有 gridView 的图片url数据,有才进入 gridView的配置
 85                 holder.gridView.setVisibility(View.VISIBLE);
 86                 holder.gridView.setAdapter(new MyGridAdapter(mUserInfo.getUi(), mContext));
 87                 // 这里我把 GridView的 item 点击监听给去掉了,防止冲突,而且我项目不需要。
 88                 /*holder.gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
 89                     @Override
 90                     public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
 91                         Log.d("zzzzz","--onItem--"+position);
 92                         // imageBrower(position,bean.urls);
 93                     }
 94                 });*/
 95             }else{ // 一定要加 else 防止GridView 的数据重复显示,在不同的 item 上面
 96                 holder.gridView.setVisibility(View.GONE);
 97                 holder.gridView.setAdapter(null);
 98             }
 99         }
100         //去掉 gridView 的 item 点击
101         holder.gridView.setClickable(false);
102         holder.gridView.setPressed(false);
103         holder.gridView.setEnabled(false);
104         return convertView;
105     }
106 
107     public class ViewHolder {
108         NoScrollGridView gridView;
109         TextView username,usertext,usertime,usertalknumber;
110         ImageView userHead;
111     }
112 
113     public void showHeadImage(ImageView view,String url){
114         //Log.d("zzzzz",""+useraccount.get((int)data));
115         if (url!=null) {
116             if (InternetHelper.checkConnection(mContext)) {
117                 try {
118                     imageLoader.displayImage(
119                             url,
120                             view,
121                             imageLoderHelper.getLoderOption(145, R.drawable.user_default_head, 80),
122                             new ImageLoadingListener() {
123                                 @Override
124                                 public void onLoadingStarted(String s, View view) {
125 
126                                 }
127 
128                                 @Override
129                                 public void onLoadingFailed(String s, View view, FailReason failReason) {
130 
131                                 }
132 
133                                 @Override
134                                 public void onLoadingComplete(String s, View view, Bitmap bitmap) {
135                                     if(s.contains(InternetHelper.exchangeUserAccount(sp.getOneInfo("useraccount", "-1")))) {
136                                         imageLoader.getDiskCache().remove(s);//clear old cache
137                                     }
138                                 }
139 
140                                 @Override
141                                 public void onLoadingCancelled(String s, View view) {
142 
143                                 }
144                             }
145                     );
146                 } catch (Exception ignored){}
147             } else {
148                 // load but doesn't remove local cache
149                 imageLoader.displayImage
150                         (
151                                 commonDataHelper.rootUrl+"uploadpic/" + InternetHelper.exchangeUserAccount(url).trim() + "/head.jpg",
152                                 view,
153                                 imageLoderHelper.getLoderOption(145, R.drawable.user_default_head, 80)
154                         );
155             }
156         } else {
157             Log.d("zzzzz", "useraccount.size() is 0");
158         }
159     }
160 }

4,GridView 数据适配器的重写类

     GridView 数据适配类的作用主要是把图片都显示到 GridView上面,再返回此 View,然后显示到 ListView 的 item 上面。

 1 package cn.share.bananacloud.custom_listview_style;
 2 
 3 /**
 4  * Created by Administrator on 2015/9/6.
 5  */
 6 
 7 import android.content.Context;
 8 import android.view.LayoutInflater;
 9 import android.view.View;
10 import android.view.ViewGroup;
11 import android.widget.BaseAdapter;
12 import android.widget.ImageView;
13 
14 
15 import com.nostra13.universalimageloader.core.ImageLoader;
16 
17 import java.util.List;
18 
19 import cn.share.bananacloud.R;
20 import cn.share.bananacloud.imageLoderHelper;
21 
22 public class MyGridAdapter extends BaseAdapter {
23 
24     private List<UserImgs> mUI;
25     protected ImageLoader imageLoader = ImageLoader.getInstance();
26     private LayoutInflater mLayoutInflater;
27     
28     public MyGridAdapter(List<UserImgs> ui, Context context) {
29         mLayoutInflater = LayoutInflater.from(context);
30         this.mUI = ui;
31     }
32 
33     @Override
34     public int getCount() {
35         return mUI == null ? 0 : mUI.size();
36     }
37 
38     @Override
39     public String getItem(int position) {
40         return mUI.get(position).urls;
41     }
42 
43     @Override
44     public long getItemId(int position) {
45         return position;
46     }
47 
48     @Override
49     public View getView(int position, View convertView, ViewGroup parent) {
50         MyGridViewHolder viewHolder;
51         if (convertView == null) {
52             viewHolder = new MyGridViewHolder();
53             convertView = mLayoutInflater.inflate(R.layout.user_img_item,parent, false);
54             viewHolder.imageView = (ImageView) convertView.findViewById(R.id.iv_user_img);
55             convertView.setTag(viewHolder);
56         } else {
57             viewHolder = (MyGridViewHolder) convertView.getTag();
58         }
59         String url = getItem(position);
60         imageLoader.displayImage(url, viewHolder.imageView, imageLoderHelper.getLoderOption(180, 0, 0));
61         return convertView;
62     }
63     private static class MyGridViewHolder {
64         ImageView imageView;
65     }
66 }

代码使用例子

      ListView mListview  = new ListView();

      WeChatAdapter mWeChat = new WeChatAdapter (context);

List<UserInfo> mUserInfo = new ArrayList<>();

      mUserInfo .add(你配置好的UserInfo);

      mWeChat .setData(mUserInfo);

      mListview .setAdapter(mWeChat );

      打完收工。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏james大数据架构

Android中Fragment+ViewPager的配合使用

官方推荐 ViewPager与Fragment一起使用,可以更加方便的管理每个Page的生命周期,这里有标准的适配器实现用于ViewPager和Fragment...

19610
来自专栏james大数据架构

画廊视图Gallery

幻灯片图片浏览器 1.布局 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res...

1965
来自专栏向治洪

Android 纵向跑马灯滚动效果

像淘宝和京东都会有跑马灯的效果,今天给大家贡献下以前项目的一个demo,各位看官,且看效果图。 ? ? ? 我们先定义一个Bean文件,这个实体类文件主要包含标...

1837
来自专栏向治洪

android自定义密码键盘

先上图 ? 先看一下键盘的布局文件control_digitpasswordkeypad.xml <?xml version="1.0" encoding="u...

3125
来自专栏学海无涯

Android开发之Fragment动态使用

在 Android开发之奇怪的Fragment 一文中,讲到了Fragment的基础知识,这次来重点讨论一下Fragment的动态使用。这种情况主要针对布局文件...

2537
来自专栏吴小龙同學

Android 轮播图从 0 到 1

漏洞百出 轮播图是 Android 常用功能之一,效果大概是这样的: ? 之前我封装写了一个,基本达到了要求,是继承了 Fragment(当时脑袋肯定锈掉了...

3448
来自专栏我的博客

ArrayAdapter简单使用

Adapter是Data和View之间的桥梁,一般用在ListView中。 代码:MainActivity import android.app.Activi...

2486
来自专栏Android知识点总结

3-AVI--Activity与Fragment的数据传递

982
来自专栏用户画像

android Service

效果:点击start 按钮,开始播放音乐,点击end 按钮,暂停音乐,手机按home键,音乐依旧进行。

692
来自专栏Android机器圈

美团点餐—listview内部按钮点击事件

这里面有一个类Item,就是一个实体类,里面只有name和num,和setget方法。具体看注释

4655

扫码关注云+社区