在Android中就提供了专门列表显示条目的控件,ListView控件,ListView控件不是一次性加载全部数据,他是只加载用户在屏幕看得到的数据,当用户滑动的过程中在去加载新的数据,同时会自动销毁之前加载过的数据
什么时候使用ListView ?
答:当很多条目Item,显示都内容不同,数据不同,但是存放的位置是相似的,并且动态变化的条目Item(和数据),就可以用ListView
ListView的使用:
1.在布局中定义ListVIew
<?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="match_parent"> <!-- 定义ListView --> <ListView android:id="@+id/listview" android:layout_width="match_parent" android:layout_height="wrap_content"> </ListView> </RelativeLayout>
2.在Java代码中找到ListVIew,再设置适配器 setAdapter(ListAdapter的子类)
为何有BaseAdapter的出现 ?
答:无论是ArrayAdapter还是SimpleAdapter,都是都不够灵活,所以Android提供了BaseAdapter适配器,BaseAdapter可以自定义适配器。
BaseAdapter是 ArrayAdapter 和 SimpleAdapter 的父类,所以可以理解为:ArrayAdapter 和 SimpleAdapter 都去继承了BaseAdapter后进行了封装
ListView+BaseAdapter代码:
package liudeli.ui.all; import android.app.Activity; import android.os.Bundle; import android.widget.ListAdapter; import android.widget.ListView; public class ListViewActivity2 extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_listview2); ListView listView = findViewById(R.id.listview); ListAdapter listAdapter = new MyBaseAdapter(); listView.setAdapter(listAdapter); } @Override protected void onDestroy() { super.onDestroy(); } }
自定义BaseAdapter:
package liudeli.ui.all; import android.util.Log; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; public class MyBaseAdapter extends BaseAdapter { private final String TAG = MyBaseAdapter.class.getSimpleName(); /** * 此方法是返回 Item条目都总数,此方法非常重要 * @return */ @Override public int getCount() { return 10; } @Override public Object getItem(int position) { return null; } @Override public long getItemId(int position) { return 0; } /** * 此方法是返回 每一个条目Item的View,有十个条目Item就会执行此方法十次,此方法非常重要 * @param position * @param convertView * @param parent * @return */ @Override public View getView(int position, View convertView, ViewGroup parent) { Log.d(TAG, "调用了一次 getView position:" + position); return null; } }
看显示的结果,就明白为什么说,getCount(); getView() 方法重要了
BaseAdapter 内部的实现:首先是要得到getCount(); 条目Item的总数,然后在去调用getView() 把getView 得到的View 绑定给条目Item加载等操作