写一个公共的方法继承了simpleAdapter:
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.content.Context;
import android.widget.SimpleAdapter;
public class ListAdapter extends SimpleAdapter {
protected ArrayList<String> selectPositonList = new ArrayList<String>();
private int currentSelectedPosition = -1;// 选中的位置
private List<HashMap<String, String>> data = null;
public List<HashMap<String, String>> getData() {
return data;
}
public void setData(List<HashMap<String, String>> data) {
this.data = data;
}
@SuppressWarnings("unchecked")
public ListAdapter(Context context,
List<? extends Map<String, ?>> data, int resource,
String[] from, int[] to) {
super(context, data, resource, from, to);
this.data = (List<HashMap<String, String>>) data;
}
@Override
public int getCount() {
return null== data ? 0:data.size();
}
@Override
public Object getItem(int position) {
return null == data ? null:data.get(position);
}
@Override
public long getItemId(int position) {
return 0;
}
public void setSelectedPosition(int position) {
if(selectPositonList.contains(String.valueOf(position))){
currentSelectedPosition = -1;
selectPositonList.remove(String.valueOf(position));
}else{
currentSelectedPosition = position;
selectPositonList.add(String.valueOf(position));
}
}
/**
* 只有一个可选中
* @param position
*/
public void setSelectedOnePosition(int position) {
if (selectPositonList.contains(String.valueOf(position))) {
selectPositonList.remove(String.valueOf(position));
currentSelectedPosition = -1;
} else {
selectPositonList.clear();
selectPositonList.add(String.valueOf(position));
currentSelectedPosition = position;
}
}
public void resetSelectedPosition() {
currentSelectedPosition = -1;
selectPositonList.clear();
}
public int getCurrentSelectedPosition(){
return this.currentSelectedPosition;
}
public ArrayList<String> getSelectedPositionList(){
return this.selectPositonList;
}
public int getSelectedPositionCount(){
return this.selectPositonList.size();
}
public Boolean setSelectedLastPosition() {
if (this.data.size() > 0) {
currentSelectedPosition = this.data.size() - 1;
return true;
} else {
return false;
}
}
}
第一种优化方式 convertView == null:
adapterPop = new ListAdapter(this, data, R.layout.exam_pop_list_item,
new String[] { "Id" }, new int[] { R.id.tv_pop_problem_id }) {
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.exam_pop_list_item,
null);
}
TextView tv_pop_problem_id = (TextView)
convertView
.findViewById(R.id.tv_pop_problem_id);
HashMap<String, String> popInfo = data.get(position);
String Id = popInfo.get("Id").toString();
String SelectId = popInfo.get("RSelect").toString();
String rightId = popInfo.get("RightOption").toString();
setViewText(tv_pop_problem_id, Id);
if (SelectId.equals(rightId)) {
tv_pop_problem_id.setTextColor(getResources().getColor(
R.color.WHITE));
tv_pop_problem_id
.setBackgroundResource(R.drawable.list_answer_right);
} else {
if ("-1".equals(SelectId)) {
tv_pop_problem_id.setTextColor(getResources().getColor(
R.color.red));
tv_pop_problem_id
.setBackgroundResource(R.drawable.list_answer_normal);
} else {
tv_pop_problem_id.setTextColor(getResources().getColor(
R.color.WHITE));
tv_pop_problem_id
.setBackgroundResource(R.drawable.list_answer_wrong);
}
}
return convertView;
}
};
第二种优化方式 ViewHolder getTag:
adapter = new ListAdapter(this, data, R.layout.study_list_item,
new String[] { "c0kana" },
new int[] { R.id.tv_search_list_item }) {
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if (null == convertView) {
holder = new ViewHolder();
LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.study_list_item,
null);
holder.hiragana = (TextView) convertView
.findViewById(R.id.tv_search_list_item);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
HashMap<String, String> record = data.get(position);
setViewText(holder.hiragana, record.get("pattern"));
convertView.setBackgroundResource(R.drawable.home_btn_bg_d);
if (selectedPosition == position) {
convertView
.setBackgroundResource(R.drawable.home_btn_bg_press);
}
return convertView;
}
class ViewHolder {
public TextView hiragana;
}
};
以上就是目前知道的两种优化listview的方式:
参考了一些例子还有自己的一些小的经验,感觉第一种优化方式性能和内存优化方面都很给力。但是有些个别的情况要去取list里面的显示值,或者输入完了的显示值的时候建议使用第二种优化方式。
顺便附上关于listview的两个常用事件:
// 实现列表的显示
lv_search.setAdapter(adapter);
// 条目点击事件
lv_search.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
String docid = "";
adapter.setSelectedPosition(position);
adapter.notifyDataSetInvalidated();
HashMap<String, String> item = (HashMap<String, String>) data
.get(position);
docid = item.get("docid").toString();
ViewHolder vHollder = (ViewHolder) view.getTag();
String doc = vHollder.hiragana.getText().toString();
if ("".equals(infoSentence)) {
btn_d_sentence.setVisibility(View.GONE);
} else {
btn_d_sentence.setVisibility(View.VISIBLE);
}
adapter.notifyDataSetChanged();
}
});
//滚动加载数据
lv_search.setOnScrollListener(new OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
// 当不滚动时
if (scrollState == OnScrollListener.SCROLL_STATE_IDLE) {
// 判断是否滚动到底部
if (view.getLastVisiblePosition() == view.getCount() - 1) {
if ("0".equals(countNum)) {
BaseDialog_YES_NO(getString(R.string.msg_recover),
getString(R.string.dialog_ok),
getString(R.string.dialog_cancel),
new DialogInterface.OnClickListener() {
@Override
public void onClick(
DialogInterface dialog,
int which) {
et_search.setText("");
showToast(getString(R.string.msg_add1000));
dialog.dismiss();
}
}, new DialogInterface.OnClickListener() {
@Override
public void onClick(
DialogInterface dialog,
int which) {
dialog.dismiss();
}
});
} else {
showToast(getString(R.string.msg_add1000));
}
}
}
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
}
});