Android ListView优化

写一个公共的方法继承了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) {
   }
  });



猜你喜欢

转载自blog.csdn.net/qq995475158/article/details/34817173