该笔记为Android中关于适配器Adapter的使用。
Adapter是用来帮助填充数据间的中间桥梁,比如通过它将数据填充到ListView,GridView,Gallery。而Android也提供了多种Adapter:ArrayAdapter,BaseAdapter,CursorAdapter,HeaderViewListAdapter, ListAdapter, ResourceCursorAdapter, SimpleAdapter, SimpleCursorAdapter, SpinnerAdapter, WrapperListAdapter.
1、如果你有几千几万甚至更多的选项(item)时,其中只有可见的项目(满屏显示的Item数目)存在内存(说的优化就是说在内存中的优化!)中,其他的在Recycler(View的缓存池)中
2、ListView先请求一个type1视图(getView)然后请求其他可见的项目。convertView在getView中是空(null)的,第一次都是为空的,只要显示过了convertView都不为空,会保存在Recycler中
3、当item1滚出屏幕,并且一个新的项目从屏幕低端上来时,ListView再请求一个type1视图。convertView此时不是空值了,它的值是item1。你只需设定新的数据然后返回convertView,不必重新创建一个视图,省去了inflate和findViewById的时间,性能就得到了优化。
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="${relativePackage}.${activityClass}" > <ListView android:id="@+id/lv_view" android:layout_width="match_parent" android:layout_height="match_parent" /> </RelativeLayout>一个ListView控件即可。
public class ItemBean { public int iamgeSouceId; public String itemTitle; public String itemContent; public ItemBean(int iamgeSouceId, String itemTitle, String itemContent) { this.iamgeSouceId = iamgeSouceId; this.itemTitle = itemTitle; this.itemContent = itemContent; } }然后在MainActivity中给数据源赋值
List<ItemBean> itemlist = new ArrayList<ItemBean>(); for (int i = 0; i < 20; i++){ itemlist.add(new ItemBean(R.drawable.ic_launcher, "我是标题" + i, "我是内容" + i)); }
import java.util.List; import android.annotation.SuppressLint; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.TextView; @SuppressLint("InflateParams") public class MyAdapter extends BaseAdapter { List<ItemBean> itemlist; LayoutInflater inflater; public MyAdapter(Context context,List<ItemBean> itemlist) { this.itemlist = itemlist; inflater = LayoutInflater.from(context); } @Override public int getCount() { return itemlist.size(); } @Override public Object getItem(int position) { return itemlist.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { /*****************普通式**********************//* if(convertView == null){ convertView = inflater.inflate(R.layout.item, null); } ImageView imageView = (ImageView) convertView.findViewById(R.id.item_image); TextView titleView = (TextView) convertView.findViewById(R.id.item_title); TextView contentView = (TextView) convertView.findViewById(R.id.item_content); imageView.setImageResource(itemlist.get(position).iamgeSouceId); titleView.setText(itemlist.get(position).itemTitle); contentView.setText(itemlist.get(position).itemContent); return convertView;*/ ViewHolder viewHolder = new ViewHolder(); if(convertView == null){ convertView = inflater.inflate(R.layout.item, null); viewHolder.imageView = (ImageView) convertView.findViewById(R.id.item_image); viewHolder.titleView = (TextView) convertView.findViewById(R.id.item_title); viewHolder.contentView = (TextView) convertView.findViewById(R.id.item_content); convertView.setTag(viewHolder); } else { viewHolder = (ViewHolder) convertView.getTag(); } viewHolder.imageView.setImageResource(itemlist.get(position).iamgeSouceId); viewHolder.titleView.setText(itemlist.get(position).itemTitle); viewHolder.contentView.setText(itemlist.get(position).itemContent); return convertView; } class ViewHolder{ private ImageView imageView; private TextView titleView; private TextView contentView; } }
ListView lv_view = (ListView) findViewById(R.id.lv_view); lv_view.setAdapter(new MyAdapter(this, itemlist));
public SimpleAdapter (Context context, List<? extends Map<String, ?>> data, int resource, String[] from, int[] to)这里解释下各个参数:
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); ListView lv = (ListView) findViewById(R.id.listView1); String[] from = { "Text", "Button" }; int[] to = { R.id.text, R.id.button }; List<Map<String, ?>> list = new ArrayList<Map<String, ?>>(); for (int i = 0; i < 10; i++) { Map<String, String> m = new HashMap<String, String>(); m.put("Text", "Text" + i); m.put("Button", "Button" + i); list.add(m); } SimpleAdapter adapter = new SimpleAdapter(this, list, R.layout.listitem, from, to); lv.setAdapter(adapter); }来个最简单的例子,上面这个例子中定义了数据源----list,是一个Map的集合。而Map中有两个键值--“Text”和“Button”因此我们可以看到参数“from”就是这两个值组成的字符数组,而参数“to”中的int[] to = { R.id.text, R.id.button };应该是参数“source”=R.layout.listitem里两个控件的ID。