【Android】高效ListView
程序员文章站
2022-06-02 09:20:08
...
在实际开发过程中,为了定制ListView项内容,通常所使用的方式是,创建所需要Adapter的子类,并重写getView()方法。
getView()方法接受一个名为convertView,View类型的参数。
如果convertView为null,就需要创建一个新的View对象;如果convertView非null,它实际上是之前使用过的View对象。
事实上,Android试图循环使用那些scroll到列表边界外的View。
另一个消耗CPU的方法是findViewById()。
所有继承自View的子类都有getTab()方法和setTab()方法,这样我们就可以通过设置“tab”关联任何对象到该View。
使用Holder模式,仅需调用一次findViewById()方法,让“tag”持有该View的子Widget,在每次使用该View时,就可以直接访问这些子Widget,而无需重复调用了。
示例代码:
创建一个ListActivity显示ListView
package lizhen.listview; import android.app.ListActivity; import android.content.Context; import android.os.Bundle; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; public class Main extends ListActivity { private String[] data = {"A", "N", "D", "R", "O", "I", "D", "G", "O", "O", "G", "L", "E"}; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); setListAdapter(new MyAdapter(this, data)); } private class MyAdapter extends BaseAdapter { private final Context context; private final String[] data; public MyAdapter(Context context, String[] data) { this.context = context; this.data = data; } @Override public int getCount() { return data.length; } @Override public Object getItem(int position) { return data[position]; } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { Holder holder = null; if(convertView == null) { convertView = getLayoutInflater().inflate(R.layout.item, parent, false); holder = new Holder(convertView); convertView.setTag(holder); } else { holder = (Holder) convertView.getTag(); } holder.getIcon().setImageResource(R.drawable.icon); holder.getLabel().setText(data[position]); return convertView; } } }
创建自定义类Holder,用于持有列表项的子Widget
package lizhen.listview; import android.view.View; import android.widget.ImageView; import android.widget.TextView; public class Holder { private View parentView; private ImageView iconImageView; private TextView labelTextView; public Holder(View view) { this.parentView = view; } public ImageView getIcon() { if(iconImageView == null) { iconImageView = (ImageView) parentView.findViewById(R.id.icon); } return iconImageView; } public TextView getLabel() { if(labelTextView == null) { labelTextView = (TextView) parentView.findViewById(R.id.label); } return labelTextView; } }
运行结果:
推荐阅读
-
Android自定义View 使用PathMeasure简单模仿系统ProgressBar(四)
-
Android studio中IDE窗口怎么显示或者隐藏?
-
Android studio怎么使用git获取最新内容然后合并?
-
Android Caused by: java.lang.ClassNotFoundException解决办法
-
Android开发之菜单(menu)用法实例分析
-
Android自定义ScrollView实现放大回弹效果实例代码
-
Android编程之ActionBar Tabs用法实例分析
-
Android自定义View圆形进度条控件(三)
-
Android studio中logcat提示信息设置?
-
Android获取本地相册图片和拍照获取图片的实现方法