前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >速读原著-Android应用开发入门教程(列表(List)视图组)

速读原著-Android应用开发入门教程(列表(List)视图组)

作者头像
cwl_java
发布2020-02-13 15:13:52
5360
发布2020-02-13 15:13:52
举报
文章被收录于专栏:cwl_Javacwl_Java

8.6 列表(List)视图组

本节介绍的列表(List)视图组可以将某种控件按照列表的形式组织起来,它与网格视图组类似,但是附加了更方便的组织方式。

参考示例程序:ListArray(ApiDemo=>Views=>List=>ListArray) 源代码:com/example/android/apis/view/List1.java ListArray 程序的运行结果如图所示:

在这里插入图片描述
在这里插入图片描述

本示例显示一系列的字符串,实现的方法是在代码中完成的,没有使用布局文件。 列表视图 ListView 的扩展关系如下所示:

代码语言:javascript
复制
 => android.view.View 
 => android.view.ViewGroup 
 => android.widget.AdapterView<T extends android. widget.Adapter> 
 => android.widget.AbsListView 
 => android.widget.ListView

ListView 也扩展了 AbsListView,列表视图的使用方法和网格视图具有很相似的共同点。

ListView 本身的使用方法可以和 GridView 一样,通过构建一个android.widget.BaseAdapter 来完成。在实际的使用过程中,可以使用 ListActivity 这种更简单的方式。在使用列表类 ListView 时通常使用 ListActivity 来代替 Activity,ListActivity 扩展了 Activity 可以方便 ListView的使用,主要的方法包括以下几个:

代码语言:javascript
复制
void setListAdapter(ListAdapter adapter) 
// 设置 ListAdapter 作为数据
void onListItemClick(ListView l, View v, int position, long id) 
// Item 选择时的函数

本示例程序的实现是一个字符串列表,没有布局文件,直接使用 ListActivity 进行操作,主要的实现部分如下所示:

代码语言:javascript
复制
public class List1 extends ListActivity { // 扩展实现 ListActivity 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setListAdapter(new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1, mStrings)); // 设置 ListAdapter 
        getListView().setTextFilterEnabled(true); //获得 ListView 并进行设置
    }
    private String[] mStrings = { //....列表项文本}; 
    }
}

ArrayAdapter 是一个模板类(android.widget.ArrayAdapter),它也是 android.widget. BaseAdapter 的实现者。如果需要实现对列表项选择的操作,可以通过实现 ListActivity 的 onListItemClick()等函数完成。ListActivity 类实际上集成了 Activity 和 ListView 的功能,其内部包含了一个 ListView,使用这个类可以直接构造界面中的列表视图。

ListView 也可以有更灵活的方式进行使用: 参考示例程序:ListArray(Views=>List=>ListArray) 源代码:com/example/android/apis/view/List8.java 布局文件:list8.xml

在这里插入图片描述
在这里插入图片描述

布局文件 list8.xml 如下所示:

代码语言:javascript
复制
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
 android:orientation="vertical" 
 android:layout_width="fill_parent" 
 android:layout_height="fill_parent"> 
 <LinearLayout 
 android:orientation="horizontal" 
 android:layout_width="fill_parent" 
 android:layout_height="wrap_content"> 
 <Button android:id="@+id/add" 
 android:layout_width="wrap_content" 
 android:layout_height="wrap_content" 
 android:text="@string/list_8_new_photo"/> 
 <Button android:id="@+id/clear" 
 android:layout_width="wrap_content" 
 android:layout_height="wrap_content" 
 android:text="@string/list_8_clear_photos"/> 
 </LinearLayout> 
 <FrameLayout
 android:layout_width="fill_parent" 
 android:layout_height="0dip" 
 android:layout_weight="1" > 
 <ListView android:id="@android:id/list" 
 android:layout_width="fill_parent" 
 android:layout_height="fill_parent" 
 android:drawSelectorOnTop="false"/> 
 <TextView android:id="@+id/empty" 
 android:layout_width="fill_parent" 
 android:layout_height="fill_parent" 
 android:text="@string/list_8_no_photos"/> 
 </FrameLayout> 
</LinearLayout>

在这个布局文件,定义了上面的 2 个按钮,主体部分 ListView 部分是空着的,需要在 JAVA 源文件中设置其中的内容。其中的 ListView 的 id是"@android:id/list",这样当活动是一个 ListActivity 的时候,将可以直接使用这个ListView 作为默认的 ListView,进而获得和 ListActivity 的交互。如果不是用这样的 id 也可以,但是需要在源代码中使用普通的 Activity 并调用函数进行设置。List8.java 中的构造函数如下所示:

代码语言:javascript
复制
public class List8 extends ListActivity {
    PhotoAdapter mAdapter;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.list_8);
        getListView().setEmptyView(findViewById(R.id.empty)); //获得 ListView 并设置
        mAdapter = new PhotoAdapter(this);
        setListAdapter(mAdapter);
        // ......省略部分内容
    }
}

本例的活动是一个 ListActivity,这里使用的 getListView()将返回布局文件中定义 id 是"@android:id/list"的ListView。 其中 mAdapter 是自定义的一个 BaseAdapter 类型,也是在这个类中实现的。

代码语言:javascript
复制
public class PhotoAdapter extends BaseAdapter {
    private Integer[] mPhotoPool = {
    // 图片的资源 ID 数组 }; 
    private ArrayList<Integer> mPhotos = new ArrayList<Integer>();
    // ...... 省略部分内容
    public long getItemId(int position) {
        return position;
    }
    public View getView(int position, View convertView, ViewGroup parent) {
        ImageView i = new ImageView(mContext);
        i.setImageResource(mPhotos.get(position));
        i.setAdjustViewBounds(true);
        i.setLayoutParams(
                new AbsListView.LayoutParams(LayoutParams.WRAP_CONTENT,
                        LayoutParams.WRAP_CONTENT));
        i.setBackgroundResource(R.drawable.picture_frame);
        return i;
    }
    // ...... 省略部分内容
}

这里的 getView()函数所返回的是 ImageView 类型,这样在列表中显示的内容就可以是一组图片了。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-01-14 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 8.6 列表(List)视图组
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档