先补充:Android ListView之动态修改
MyAdapter 类:
package com.android.test;
import java.util.ArrayList;
import java.util.Map;
import android.graphics.Color;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
public class MyAdapter extends BaseAdapter {
private ListMain main;
private ArrayList<Map<String, Object>> list;
public MyAdapter(ListMain main, ArrayList<Map<String, Object>> list) {
this.main = main;
this.list = list;
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
//如果未选择或list列表为空时直接跳出,避免NullPointException
if (position < 0 || list.size() <= 0) {
return null;
}
//如果为空重新导入ListView的布局文件,布局文件自定义
if (convertView == null) {
convertView = LayoutInflater.from(main).inflate(R.layout.list1, null);
}
//实例化
ImageView img = (ImageView)convertView.findViewById(R.id.list1_img_icon);
TextView tv1 = (TextView)convertView.findViewById(R.id.list1_tv1);
TextView tv2 = (TextView)convertView.findViewById(R.id.list1_tv2);
//获取参数
Map<String, Object> map = list.get(position);
tv1.setText((String)map.get("TITLE"));
tv2.setText((String)map.get("CONTENT"));
//修改样式
if (main.getStatus(position) == ListMain.LIST_SELECT) {
convertView.setBackgroundColor(Color.parseColor("#003D79"));
img.setBackgroundResource(R.drawable.ic_settings_personalize);
tv1.setTextColor(Color.BLUE);
tv1.setShadowLayer(1, 1, 0.75f, Color.WHITE);
} else {
convertView.setBackgroundColor(Color.BLACK);
img.setBackgroundResource(Integer.valueOf(map.get("IMG").toString()));
tv1.setTextColor(Color.WHITE);
tv1.setShadowLayer(1, 1, 0.75f, Color.CYAN);
}
return convertView;
}
}
在ListMain中,插入一个ArrayList<Map<String, Object>>
ArrayList<Map<String, Object>> list;
list = new ArrayList<Map<String,Object>>();
for (int i = 0; i < TITLE.length; i++) {
Map<String, Object> map = new HashMap<String, Object>();
map.put("TITLE", TITLE[i]);
map.put("CONTENT", CONTENT[i]);
map.put("IMG", IMG[i]);
map.put("STATUS", LIST_NOT);
list.add(map);}
将ListView与Adapter绑定:
adapter = new MyAdapter(this, list);
lv.setAdapter(adapter);
在onItemClick中处理选中事件:
for (int i = 0; i < TITLE.length; i++) {
list.get(i).put("STATUS", LIST_NOT);
}
list.get(arg2).put("STATUS", LIST_SELECT);
adapter.getView(arg2, null, lv);
adapter.notifyDataSetChanged();效果图如下(图片随便拉来的:-))
初始时:
选中“后来”,改变图标,改变字体颜色,改变文字阴影。
ok,这样就完成了。
言归正传。
单字段排序:
private ArrayList<Map<String, Object>> mArrayList;
private void getData() {
//add Data.....
//对ListView中数据list排序
if (!mArrayList.isEmpty()){
Collections.sort(mArrayList, new Comparator<Map<String, Object>>() {
@Override
public int compare(Map<String, Object> object1, Map<String,
Object> object2) {
//根据字段"LEVEL"排序
return object1.get("LEVEL").toString()
.compareTo(object2.get("LEVEL").toString());
}
});
}
}
效果图如下(LEVEL字段为图片样式):
如上图如果这样排你肯定不满意。因为文本没有排序。
多字段排序:
if (!mArrayList.isEmpty()) {
Collections.sort(mArrayList, new Comparator<Map<String, Object>>() {
@Override
public int compare(Map<String, Object> object1,
Map<String, Object> object2) {
//我把obejct1 和obejct2写倒了,这样写的用处就是反向排序。
int i = object2.get("LEVEL").toString()</pre>
.compareTo(object1.get("LEVEL").toString());
if (i == 0) { //如果"LEVEL"字段相同,再根据下一字段排序
object1.get("TITLE").toString()
.compareTo(object2.get("TITLE").toString());
}
return i;
}
});
}
前后效果图如下:
值得一提的是右边图片的样式:
<!-- wifi_singal_open.xml -->
<level-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:maxLevel="0" android:drawable="@drawable/ic_wifi_signal_1" />
<item android:maxLevel="1" android:drawable="@drawable/ic_wifi_signal_2" />
<item android:maxLevel="2" android:drawable="@drawable/ic_wifi_signal_3" />
<item android:maxLevel="3" android:drawable="@drawable/ic_wifi_signal_4" />
</level-list>
上面drawable是4种不带锁的图片。
在wifi_singal.xml中引用wifi_signal_open和wifi_signal_lock文件:
<!-- wifi_singal.xml -->
<selector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:settings="http://schemas.android.com/apk/res/com.zkx.demo">
<item settings:state_encrypted="true"
android:drawable="@drawable/wifi_signal_lock" />
<item settings:state_encrypted="false"
android:drawable="@drawable/wifi_signal_open" />
</selector>
settings:state_encrypted="true"为自定义属性,在attr.xml中有配置:
<resources>
<declare-styleable name="WifiEncryptionState">
<attr name="state_encrypted" format="boolean" />
</declare-styleable>
</resources>
最后在Adapter getView中配置图片文件:
public static final int[] STATE_SECURED = {R.attr.state_encrypted};
public static final int[] STATE_NONE = {};
ImageView img = (ImageView)v.findViewById(R.id.img);
img.setImageResource(R.drawable.wifi_signal);
img.setImageLevel(Integer.valueOf(map.get("LEVEL").toString()));
//可见或不可见
int[] state = Boolean.valueOf(map.get("STATE").toString())
? STATE_SECURED : STATE_NONE;
img.setImageState(state, true);