该笔记为Android中关于适配器Adapter的使用。
Adapter的介绍:
Adapter是用来帮助填充数据间的中间桥梁,比如通过它将数据填充到ListView,GridView,Gallery。而Android也提供了多种Adapter:ArrayAdapter,BaseAdapter,CursorAdapter,HeaderViewListAdapter, ListAdapter, ResourceCursorAdapter, SimpleAdapter, SimpleCursorAdapter, SpinnerAdapter, WrapperListAdapter.
Adapter的用途:
ListView的显示和缓存机制:
1、如果你有几千几万甚至更多的选项(item)时,其中只有可见的项目(满屏显示的Item数目)存在内存(说的优化就是说在内存中的优化!)中,其他的在Recycler(View的缓存池)中
2、ListView先请求一个type1视图(getView)然后请求其他可见的项目。convertView在getView中是空(null)的,第一次都是为空的,只要显示过了convertView都不为空,会保存在Recycler中
3、当item1滚出屏幕,并且一个新的项目从屏幕低端上来时,ListView再请求一个type1视图。convertView此时不是空值了,它的值是item1。你只需设定新的数据然后返回convertView,不必重新创建一个视图,省去了inflate和findViewById的时间,性能就得到了优化。
Adapter模式的应用:
<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;
}
}
可以看到我们自定义的MyAdapte继承自BaseAdapter,那么上面代码的四个函数必须重写----getCount(),getItem(),getItemId(),getView()。
ListView lv_view = (ListView) findViewById(R.id.lv_view);
lv_view.setAdapter(new MyAdapter(this, itemlist));
SimpleAdapter的使用:
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。