1.适配器介绍
之前介绍了简单的listView的使用,使用到了listView,数据源(提供给listView显示的实际数据),系统自带的适配器。
这样固然简单,但实际开发中,我们更希望根据需要来自己设定布局,那么就需要自定义适配器。
2.自定义适配器
创建一个类并让它继承自BaseAdapter,并重写BaseAdapter的四个方法,getCount();getItem();getItemId();getView();
示例如下:
/**自定义适配器,BaseActivity是适配器的基类*/ public class MyAdapter extends BaseAdapter { //返回的个数决定listView最终显示几条信息 @Override public int getCount() { return 0; } //返回的数据代表当调用getItem()方法的时候返回的内容(很少用) @Override public Object getItem(int position) { return null; } //基本不用,返回position即可 @Override public long getItemId(int position) { return 0; } /** * 创建并返回每一条信息的实际内容 * @param position 当前创建并返回的是第几条信息 * @param view 当前复用的布局(后面再介绍) * @param viewGroup * @return */ @Override public View getView(int position, View view, ViewGroup viewGroup) { return null; } }
这样,一个适配器就定义好了,为了让自定义适配器被listView使用,需要调用listView的setAdapter()方法,之前我们用这个方法为listView绑定了安卓自带的适配器
修改之前MainActivity中的代码为:
public class MainActivity extends Activity { private ListView lv; //listView组件 private List<String> list; //listView要显示的数据 private MyAdapter adapter; //自定义adapter @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initData();//初始化即将要显示的数据 lv = (ListView) findViewById(R.id.lv); //初始化自定义适配器(注意为适配器写一个构造方法) adapter = new MyAdapter(this,list); //为listView设置适配器 lv.setAdapter(adapter); } /** * 初始化即将要显示的数据 */ private void initData() { list = new ArrayList<>(); for (int i = 0; i < 20; i++) { list.add("呵呵" + i); } } }
这里初始化自定义适配器并将数据源通过构造方法传递给自定义适配器,最后调用listView的setAdapt() 方法绑定适配器。
然后我们需要写一个xml文件,用于给每一条信息的布局创建一个模具,然后再根据每条数据的不同,使用模具创建不同的信息
xml文件如下:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="60dp"> <TextView android:id="@+id/item_textView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" /> </RelativeLayout>
接下来,根据需要开始写自定义适配器中的内容
实际内容如下:
/** * 自定义适配器,BaseActivity是适配器的基类 */ public class MyAdapter extends BaseAdapter { private List<String> list; //数据源 private Context context; //上下文对象 private LayoutInflater inflater; //用于加载xml布局 public MyAdapter(Context context, List<String> list) { this.context = context; this.list = list; this.inflater = LayoutInflater.from(context); } //返回的个数决定listView最终显示几条信息 @Override public int getCount() { //返回list的大小意味着当list的大小为3,则最终显示3条信息,大小为5,则最终显示5条信息 return list.size(); } //返回的数据代表当调用getItem()方法的时候返回的内容(很少用) @Override public Object getItem(int position) { return position; } //基本不用,返回position即可 @Override public long getItemId(int position) { return position; } /** * 创建并返回每一条信息的实际内容 * * @param position 当前创建并返回的是第几条信息 * @param view 当前布局内容,当前复用的布局(后面再介绍) * @param viewGroup * @return */ @Override public View getView(int position, View view, ViewGroup viewGroup) { //加载刚才为适配器写的布局 view = inflater.inflate(R.layout.list_item,viewGroup,false); //根据布局中的组件相对应的创建组件,由于布局中仅写了一个TextView,所以这里相应创建 TextView tv = (TextView) view.findViewById(R.id.item_textView); //根据数据源内容设置文本内容 tv.setText(list.get(position)); //注意返回view,若返回null则上面的代码都不会生效 return view; } }
运行项目: