1.在adapter中的getView方法中尽量少使用逻辑
2.尽最大可能避免GC。频繁GC通常是代码问题引起的内存泄露导致的
3.滑动的时候不加载图片将ListView的scrollingCache和animateCache设置为false
4.item的布局层级越烧越好
5.使用ViewHolder。减少findViewById
6、convertView减少加载布局。ViewHolder只是将需要缓存的那些view封装好,convertView的setTag才是将这些缓存起来供下次调用
7、RecyclerView 是Android L版本中新增加的,可以完美代替Listview,Gridview 瀑布流
对于2,有个点击事件的优化。
如果每个getView中,有多个点击事件,如果对每个子view进行setOnclickListener,就会出现多个listener对象在内存中,如果View回收不畅,会更多,这样,在滚动的时候频繁GC 就会导致卡顿,所以可以统一设置listener
优化后的demo
package demo.hq201612.com.frbretrofitrxjava.questions.listviewadapter;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import java.util.ArrayList;
import java.util.List;
import demo.hq201612.com.frbretrofitrxjava.R;
import demo.hq201612.com.frbretrofitrxjava.basic.CMLog;
/**
* Created by huqing on 2017/1/9.
*/
public class ListViewAdapter extends BaseAdapter
{
private List<String> datas = new ArrayList<>();
private LayoutInflater mInflater;
private Context mContext;
public ListViewAdapter(Context mContext, List<String> datas)
{
this.datas = datas;
this.mInflater = LayoutInflater.from(mContext);
this.mContext = mContext;
}
@Override
public int getCount()
{
return datas.size();
}
@Override
public Object getItem(int position)
{
return this.datas.get(position);
}
@Override
public long getItemId(int position)
{
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
ViewHolder holder = null;
if (convertView == null)
{
holder = new ViewHolder();
convertView = mInflater.inflate(R.layout.item_lv, null);
holder.bn1 = (Button) convertView.findViewById(R.id.bn1);
holder.bn2 = (Button) convertView.findViewById(R.id.bn2);
holder.bn3 = (Button) convertView.findViewById(R.id.bn3);
holder.bn4 = (Button) convertView.findViewById(R.id.bn4);
holder.bn1.setOnClickListener(holder);
holder.bn2.setOnClickListener(holder);
holder.bn3.setOnClickListener(holder);
holder.bn4.setOnClickListener(holder);
convertView.setTag(holder);
}
else
{
holder = (ViewHolder) convertView.getTag();
}
holder.setPosition(position);
holder.bn1.setText(position + " " + datas.get(position));
return convertView;
}
private class ViewHolder implements View.OnClickListener
{
private Button bn1;
private Button bn2;
private Button bn3;
private Button bn4;
private int position;
public void setPosition(int position)
{
this.position = position;
}
@Override
public void onClick(View v)
{
switch (v.getId())
{
case R.id.bn1:
CMLog.e("hq",position + " 左上");
break;
case R.id.bn2:
CMLog.e("hq",position + " 右上");
break;
case R.id.bn3:
CMLog.e("hq",position + " 左下");
break;
case R.id.bn4:
CMLog.e("hq",position + " 右下");
break;
}
}
}
}