《了解ListView和ViewPager》的补充
ListView
AdapterView是一组重要的UI组件,其本身是一个抽象基类,他的派生的子类在用法上十分相似,只是显示界面有一定的区别,它派生了AbsListView、AbsSpinner、AdapterViewAnimator,而ListView是继承了AbsListView子类,本文就针对ListView进行讲解补充.
- 可以直接使用ListView进行创建,从而生产列表视图。
- 也可以让Activity继承ListActivity(其实就相当于该Activity显示的组件为ListView),从而生产列表视图。
在res\layout\main.xml中
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<ListView
android:id="@+id/list_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:entries="@array/books">
</ListView>
</LinearLayout>
从上述代码可以看出ListView的常用XML属性中,若仅需要实现一个非常简单的ListView视图,只需要用entries属性指定一个数组资源,(若想再简单,其实也可以省)然后Android根据这个数组资源来生产ListView。其余的常用XML属性在《了解ListView和ViewPager》中。
在res\values\中新建一个arrays.xml书写数组资源的代码块
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="books">
<item>微积分</item>
<item>离散数学</item>
<item>大学物理</item>
<item>JAVA</item>
</string-array>
</resources>
效果图如下:
对在《了解ListView和ViewPager》文中,为何要运用Adapter进行补充,基于上面实现的代码,我们会发现使用数组创建的ListView太过于简单,甚至连每个列表项的字号大小、颜色都不能改变。
为了满足需求,对ListView的外观、行为进行定制,这时就需要把ListView作为AdapterView来使用,通过Adapter控制每个列表项的外观和行为。
常用适配器在《了解ListView和ViewPager》文中,在这里仅仅拿ArrayAdapter作为例子进行代码的展示与分析。
在res\layout\activity_main.xml中,书写的代码段几乎差不多。格外运用android:divider和android:dividerHeight属性(其实上面的例子也可以运用),唯一一点不同的是,这里没有制定android:entries属性,这意味着我需要通过Adapter来提供列表项。
<ListView
android:id="@+id/list1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:divider="#f00"
android:dividerHeight="2px''
android:headerDividersEnabled="false">
</ListView>
//没有指定android:entries属性.
在JAample.kaixuan.assignment\MainActivity中
在onCreate()方法中书写代码
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ListView list1 = (ListView) findViewById(R.id.list1);
// 定义一个数组
String[] arr1 = { "微积分", "离散数学", "大学物理","JAVA" };
// 将数组包装为ArrayAdapter
ArrayAdapter<String> adapter1 = new ArrayAdapter<String>
(this, R.layout.array_item, arr1);
// 为ListView设置Adapter
list1.setAdapter(adapter1);
}
新引用了R.layout.array_item资源ID,我们需要为它建立一个.xml文件。
<?xml version="1.0" encoding="utf-8"?>
<TextView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/TextView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="24dp"
android:padding="10px"
android:divider="#f0f"
android:shadowDx="4"
android:shadowDy="4"
android:shadowRadius="2"/>
效果图:
是不是很不一样了呢?有兴趣的话,你还可以尝试其他样式哦。
这里遇到一个有意思的问题————关于cannot resolve symbol R
setContentView(R.layout.main);
ListView list1 =(ListView) findViewById(R.id.list_view);
当遇到所有R都cannot resolve symbol的时候,可以尝试在Android studio的Build菜单中点击Clean Project——亲测有效!
ArrayAdapter<String> adapter1 = new ArrayAdapter<String>(this,R.array_item,arr1);
在这一行创建ArrayAdapter时,必须指定以下三个参数:
Context:代表了访问整个Android应用的接口。且几乎创建所有组件都需要传入Context对象。
textViewResourceld :是一个资源ID,该资源ID代表一个TextView,该TextView组件将作为ArrayAdapter的列表项组件。
数组或List:负责为多个列表项提供数据。
第二个参数控制每个列表项的组件,第三个参数则负责为列表项提供数据。数组或List包含多少个元素,就将生产多少个列表项,每个列表项都是TextView组件,而显示的文本由数组或List的元素提供。
ViewPager
《了解ListView和ViewPager》中实现简单ViewPager的程序亲测有效,下面增加一些解读:
List<String> list = new ArrayList<>();
list.add("微积分");
list.add("离散数学");
list.add("大学物理");
list.add("JAVA"); //list数组
在MainActivity用list数组代替
View view1 = View.inflate(this,R.layout.view_1,null);
View view2 = View.inflate(this,R.layout.view_2,null);
View view3 = View.inflate(this,R.layout.view_3,null);
View view4 = View.inflate(this,R.layout.view_4,null);
将其初始化延迟到继承了PagerAdapter的子类MyPagerAdapter中实现
这时创建PagerAdapter对象的时候,要传递两个参数Context 和List.
MyPagerAdapter PA = new MyPagerAdapter(this,list);
pager.setAdapter(PA);
//在MyPagerAdapter类中
public MyPagerAdapter(Context context,List<String> list) {
mContext =context;
mData = list;
}
//实例化过程的代码
public Object instantiateItem(ViewGroup container, int position) {
View view = View.inflate(mContext,R.layout.page,null);
/*这个通过View.inflate的过程也可以再MainActivity中使用,
这样就省去传两个值得步骤
*/
TextView tv=(TextView)view.findViewById(R.id.for_Page);
tv.setText(mData.get(position));
container.addView(view);
return view;
}
这里就展示不效果演示了,自己实现的和《了解ListView和PagerView》一文中,效果差不多。
//没下载录屏软件,那就想象他是可以滚动的吧
补充一个FragmentPagerAdapter和FragmentStatePagerAdapter的关系图,附其中方法的差异: