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"><ListViewandroid: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大小@Overridepublic int getCount() {return strlists.size();}@Overridepublic Object getItem(int position) {return null;}@Overridepublic long getItemId(int position) {return position;}//创建空的View,放入数据//position当前位置//ViewGroup parent:每次调用都有一个空容器,返回值的view添加到空容器,getContext方法获取容器context//convertView:ItemView显示内容@Overridepublic View getView(int position, View convertView, ViewGroup parent) {//创建一个空TextViewTextView 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;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//绑定layoutsetContentView(R.layout.t_listview);//上下文初始化mContext = ListViewActivity.this;//获取ListViewlistView = (ListView) findViewById(R.id.ListView1);//创建数据listArrayList<String> list = new ArrayList<String>();//添加数据for(int i=0;i<5;i++){list.add("listView"+i);}//创建ListViewAdapter对象ListViewAdapter listViewAdapter = new ListViewAdapter(list,mContext);//ListView绑定AdapterlistView.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"><TextViewandroid: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_1View view1= layoutInflater.inflate(android.R.layout.simple_list_item_1,null);
2.使用convertView优化