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();
界面效果图