Android ListView分组显示

ListView的实现方法也是普通的实现方法。只不过在list列表中加入groupkey信息。在渲染的时候要判断是否是分组的标题。

就是在使用不同的两个View的时候存在这种情况,convertView不为空但是由于它渲染到别的layout的关系。它里面内容的view是为空的经常会出现空指针的错误。

我这里使用了一个非常低效的方法,下次应该会改进一下。

先贴上自己实现的adapter

  1 import java.util.ArrayList;
  2 import java.util.HashMap;
  3 import java.util.Iterator;
  4 import java.util.List;
  5 import java.util.Map;
  6 import java.util.Set;
  7
  8 import android.graphics.Bitmap;
  9 import android.os.AsyncTask;
 10 import android.view.View;
 11 import android.view.ViewGroup;
 12 import android.widget.BaseAdapter;
 13 import android.widget.ImageView;
 14 import android.widget.TextView;
 15 import com.enick.project.base.BaseActivity;
 16 import com.enick.project.doman.OrderAll;
 17 import com.enick.project.doman.OrderAll.list;
 18 import com.enick.project.ui.CH_RackingListDetailActivity;
 19 import com.enick.project.utils.ViewUtil;
 20 import com.enick.zdproject.R;
 21
 22 public class ClothesGroupAdapter extends BaseAdapter {
 23
 24     private Map<String, List<OrderAll.list>> map = new HashMap<String, List<list>>();
 25     private List<OrderAll.list> list = new ArrayList<OrderAll.list>();
 26     private List<OrderAll.list> temp = null;
 27     private final static String TAG = "RZ";
 28
 29     public ClothesGroupAdapter(List<OrderAll.list> temp) {
 30         this.temp = temp;
 31     }
 32
 33     @Override
 34     public void notifyDataSetChanged() {
 35         map.clear();
 36         list.clear();
 37         //先把数据装到map里
 38         for (int i = 0; i < temp.size(); i++) {
 39             if(temp.get(i) instanceof list){
 40                 List<list> tempList =  map.get(temp.get(i).getItemname());
 41                 if(tempList == null){
 42                     tempList = new ArrayList<OrderAll.list>();
 43                     tempList.add(temp.get(i));
 44                     map.put(temp.get(i).getItemname(),tempList);
 45                 }else{
 46                     tempList.add(temp.get(i));
 47                 }
 48             }
 49
 50         }
 51         //依据map的特性,键就是groupkey。值就是list
 52         Set<Map.Entry<String, List<OrderAll.list>>> set = map.entrySet();
 53         for (Iterator<Map.Entry<String, List<OrderAll.list>>> it = set
 54                 .iterator(); it.hasNext();) {
 55             Map.Entry<String, List<OrderAll.list>> entry = (Map.Entry<String, List<OrderAll.list>>) it
 56                     .next();
 57             OrderAll order = new OrderAll();
 58             OrderAll.list root = order.getNewList();
 59             root.setItemname(entry.getKey());
 60             root.setGroupkey(true);
 61             list.add(root);
 62             for (int i = 0; i < entry.getValue().size(); i++) {
 63                 entry.getValue().get(i).setGroupkey(false);
 64                 list.add(entry.getValue().get(i));
 65             }
 66         }
 67         super.notifyDataSetChanged();
 68     }
 69
 70     @Override
 71     public int getCount() {
 72         return list.size();
 73     }
 74
 75     @Override
 76     public Object getItem(int pos) {
 77         return list.get(pos);
 78     }
 79
 80     @Override
 81     public long getItemId(int pos) {
 82         return pos;
 83     }
 84
 85     @Override
 86     public View getView(final int position, View convertView, ViewGroup parent) {
 87         ClothesHolder clothesHolder = null;
 88         //非常低性能的做法,每次都重新初始化
 89         if (list.get(position).isGroupkey()) {
 90             convertView = ViewUtil.buildView(R.layout.ch_racking_list_tag_row);
 91             clothesHolder = new ClothesHolder();
 92             clothesHolder.tvTagName = (TextView) convertView.findViewById(R.id.tvTagName);
 93             String itemName = list.get(position).getItemname();
 94             if(!ViewUtil.isStrEmpty(itemName)){
 95                 clothesHolder.tvTagName.setText(itemName);
 96             }
 97         }else{
 98             convertView = ViewUtil.buildView(R.layout.ch_racking_list_row);
 99             clothesHolder = new ClothesHolder();
100             clothesHolder.ivImage = (ImageView) convertView.findViewById(R.id.ivImage);
101             clothesHolder.tvName = (TextView) convertView.findViewById(R.id.tvName);
102             clothesHolder.tvWenti = (TextView) convertView.findViewById(R.id.tvWenti);
103             clothesHolder.tvPrice = (TextView) convertView.findViewById(R.id.tvPrice);
104             String subitemName = list.get(position).getSubitemname();
105             if (!ViewUtil.isStrEmpty(subitemName)) {
106                 clothesHolder.tvName.setText(subitemName);
107             }
108
109             String price = list.get(position).getPrice();
110             if (!ViewUtil.isStrEmpty(price)) {
111                 clothesHolder.tvPrice.setText(price);
112             }
113
114             String wenti = list.get(position).getWenti();
115             if (!ViewUtil.isStrEmpty(wenti)) {
116                 clothesHolder.tvWenti.setText("问题!");
117             }
118             //网络加载图片,从别的服务器加载
119             final String  url = list.get(position).getUrl();
120             if (!ViewUtil.isStrEmpty(url)) {
121                 if(ViewUtil.isuploadedphoto(url)){//网络图片
122                     final ImageView temp=clothesHolder.ivImage;
123                     new AsyncTask<Void, Void, Bitmap>() {
124                         protected Bitmap doInBackground(Void... p) {
125                             return ViewUtil.getHttpBitmap(url,60,60);
126                         }
127                         @Override
128                         public void onPostExecute(Bitmap result) {
129                             super.onPostExecute(result);
130                             temp.setImageBitmap(result);
131                         }
132
133                     }.execute();
134                 }else{
135                     clothesHolder.ivImage.setImageBitmap(ViewUtil.extractMiniThumb(
136                             ViewUtil.getFilePathBitmap(url), 60, 60));
137                 }
138                 clothesHolder.ivImage.setImageBitmap(ViewUtil.extractMiniThumb(ViewUtil
139                         .getFilePathBitmap(url), 60, 60));
140             }
141             //添加事件
142             convertView.setOnClickListener(new View.OnClickListener() {
143                 @Override
144                 public void onClick(View v) {
145                     BaseActivity.currentActivity.startCOActivity(CH_RackingListDetailActivity.class,
146                                     OrderAll.CLOTHES_ID,list.get(position).getId());
147                 }
148             });
149         }
150         return convertView;
151     }
152
153     private class ClothesHolder {
154         ImageView ivImage;
155         TextView tvName;
156         TextView tvTagName;
157         TextView tvWenti;
158         TextView tvPrice;
159
160     }
161
162 }

acitivity只要传入数据集合就可以了

1 private List<OrderAll.list> listclothes = new ArrayList<OrderAll.list>();
2 private ListView lvClothes;
3 private ClothesGroupAdapter adapter;
4 adapter = new ClothesGroupAdapter(listclothes);
5 lvClothes.setAdapter(adapter);
6
7 listclothes.clear();
8 listclothes.addAll(OrderData.getTempOrderAll().getList());
9 adapter.notifyDataSetChanged();

界面效果图

时间: 2024-10-01 18:42:36

Android ListView分组显示的相关文章

android的listview分组显示的时候layout_marginTop失效的解决办法

在使用android的ListView组件做类似于通讯录这样的功能时,需要根据A.B.C这样的标题来区来分组显示通讯录中的姓名,本人在做实验过程中遇到了这样一个问题,比如,想让标题item和上边的用户名item中间有个间隙,而组(同个标题下)用户名之间不能有间隙,原本以为很简单,我认为在标题item的最外层LinearLayout中增加一个layout_marginTop属性即可,结果发现一只无效,最后请教了个高手告诉我需要在标题item的顶层LinearLayout中再嵌套一层,然后在第二层中

Android GridView 分组显示(仿京东商品分类)

Android GridView 分组显示(仿京东商品分类) Gridview分组显示, 仿京东分类效果 GridView 分组显示使用的第三方开源库: StickyGridHeadersGridView , 下载地址: https://github.com/TonicArtos/StickyGridHeaders 大致实现步骤: 1. adapter:  SPCategoryRightAdapter extends BaseAdapter implements StickyGridHeader

android listview 不显示选中效果分析

android listview有时会发现没有选中效果,解决办法 1:listview布局中设置颜色,如 android:background="@android:color/white" 2:在listview的item布局文件中背景设置为 android:background="@android:color/transparent" 原因:颜色设置在整体的listview上面,每一行布局设置透明色即可 android listview 不显示选中效果分析

android ListView无法显示内容

Adapter调用刷新接口没有效果 : 打印Adapter的getView方法, 打印Adapter的getCount()方法, 打印出数据源的toString() 字段. 对比初始创建的时候, 你要分析: 是否是没有数据: 是否是数据源引用发生了变化(getCount()或者getView()方法不执行): 2.  ListView无法显示出内容: 首先要检测的就是你的Adapter数据源是否真的有数据源(检测getCount()与getView()方法) : 其次就是检测你的ListView

ListView 分组 显示网络数据

最近项目中需要使用到 分组展示数据的形式,借鉴了网上前辈们的 精华,现写一点总结,留作个人查看. 首先 为了给ListView 中填充数据定义 List<BaseInfo> datas  = new ArrayList<BaseInfo>(); BaseInfo 中首先需要定义一个className 来区别 类别,以便进行展示 在每组 数据存放之前,先往datas 中存放一个  只有 className 不为空的 BaseInfo对象,然后再把该组数据存放到datas中 然后按照

Android ListView 指定显示最后一行

实现方式: 一. mListView.setSelection(adapter.getCount()-1); 二.在ListView的xml添加以下属性: android:stackFromBottom="true"android:transcriptMode="alwaysScroll"

仿照支付宝账单界面--listview分组显示 用来做!发!财树充值交易明细

QQ图片20150430155638.png (151.65 KB, 下载次数: 32) 下载链接: http://pan.baidu.com/s/1kVMY1SV 密码: i8ta

Android 利用ExpandableListView显示和查询仿QQ分组列表用户信息

在我们的项目开发过程中,经常会对用户的信息进行分组,即通过组来显示用户的信息,同时通过一定的查询条件来显示查询后的相关用户信息,并且通过颜色选择器来设置列表信息的背景颜色. 其中借鉴xiaanming:http://blog.csdn.net/xiaanming/article/details/12684155 下面来看看项目运行后的效果图以及代码结构图: 下面通过代码来实现整个效果. 1.主界面布局activity_main.xml <span style="font-size:18px

Android 自定义Adapter 但listview 只显示第一条数据

楼主让这个问题郁闷了一晚上.....在logcat里明明显示adapter的getview方法里的list大于一条数据 ,但posotion却一直是0.....运行后也只显示list[0]里面的数据....最后的最后原来错误出在布局文件上 我以前的是这样的; <ScrollView android:layout_width="fill_parent" android:layout_height="wrap_content" > <!-- listv