《了解ListView和ViewPager》的补充

《了解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的关系图,附其中方法的差异:
这里写图片描述

猜你喜欢

转载自blog.csdn.net/STU17xkx/article/details/80950501