Android:ViewAdapter
3.11 View&Adapter
View是视图文件,表示页面的框架结构。Adapter适配器,通过适配器填充数据信息。
1、简单ListView使用
ListView用来显示一个相同样式的视图列表。
ListView无法直接将数据显示,需要先将Data数据放入Adapter适配器,然后ListView绑定适配器。
操作步骤:
1.在layout布局中创建ListView;
2.在layout对应ActivityActivity中创建对应ListView对象listView;
3.创建数据ArrayList<String>类型的list;
4.创建ListViewAdapter类继承BaseAdapter,在Activity中创建ListViewAdapter类对象listViewAdapter,传入参数list,上下文;
5.调用listView对象的setAdapter方法,绑定listViewAdapter;
示例:
创建t_listview.xml文件,ListView标签,设置id。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
android:id="@+id/ListView1"
android:layout_width="match_parent"
android:layout_height="match_parent">
</ListView>
</LinearLayout>
创建ListViewAdapter类继承BaseAdapter类。
public class ListViewAdapter extends BaseAdapter {
private ArrayList<String> strlists;
private Context mContext;
public ListViewAdapter(ArrayList<String> list,Context context){
this.strlists=list;
this.mContext=context;
}
//获取list大小
@Override
public int getCount() {
return strlists.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return position;
}
//创建空的View,放入数据
//position当前位置
//ViewGroup parent:每次调用都有一个空容器,返回值的view添加到空容器,getContext方法获取容器context
//convertView:ItemView显示内容
@Override
public View getView(int position, View convertView, ViewGroup parent) {
//创建一个空TextView
TextView textView = new TextView(mContext);
//设置宽高
textView.setLayoutParams(new AbsListView.LayoutParams(AbsListView.LayoutParams.MATCH_PARENT,
AbsListView.LayoutParams.WRAP_CONTENT));
//设置文本大小
textView.setTextSize(30);
//设置文本
textView.setText(strlists.get(position));
return textView;
}
}
创建ListViewActivity类继承Activity。
public class ListViewActivity extends Activity {
//上下文
private Context mContext;
private ListView listView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//绑定layout
setContentView(R.layout.t_listview);
//上下文初始化
mContext = ListViewActivity.this;
//获取ListView
listView = (ListView) findViewById(R.id.ListView1);
//创建数据list
ArrayList<String> list = new ArrayList<String>();
//添加数据
for(int i=0;i<5;i++){
list.add("listView"+i);
}
//创建ListViewAdapter对象
ListViewAdapter listViewAdapter = new ListViewAdapter(list,mContext);
//ListView绑定Adapter
listView.setAdapter(listViewAdapter);
}
}
2、BaseAdpater优化
1.使用LayoutInfalter优化
当ListView中的内容不是简单的字符串表时,ListViewAdpater类中的getView方法中就不是简单创建一个TextView可以解决问题,需要创建多个View组件,这个时候,我们需要根据ListView中子Item的结构自动生成View组件。
示例:
创建子Item的布局文件t_listview_item.xml。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/tv1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="30dp">
</TextView>
</LinearLayout>
修改getView方法中逻辑:
//LayoutInflater类将一个布局变成一个类
LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
//inflate参数1:布局页面,参数2:root是否加入到某个容器
View view = layoutInflater.inflate(R.layout.t_listview_item,null);
TextView textView = view.findViewById(R.id.tv1);
textView.setText(strlists.get(position));
return view;
Android提供一些固定的子Item布局:
示例:
//android提供了一些布局页面android.R.layout.XXXX
//示例:android.R.layout.simple_list_item_1
View view1= layoutInflater.inflate(android.R.layout.simple_list_item_1,null);
2.使用convertView优化