您的位置:首页 > 其它

列表视图案例1——阅读古诗

2018-03-06 11:12 330 查看
列表视图案例1——阅读古诗
一、列表视图(ListView)ListView是AdapterView的子类,要通过适配器作为梁桥来绑定数据源。有四种适配器可以使用:数组适配器(ArrayAdapter)、简单适配器(SimpleAdapter)、简单游标适配器(SimpleCursorAdapter)、基适配器(BaseAdapter)。
使用列表控件需要四样东西:列表控件、适配器、数据源、列表项模板

列表视图继承关系图:

二、案例运行效果




二、实现步骤1、创建安卓应用ReadAncientPoetry


2、添加背景图片background.jpg


3、字符串资源文件strings.xml
<resources>
<string name="app_name">阅读古诗</string>

<string-array name="titles">
<item>静夜思</item>
<item>登鹳雀楼</item>
<item>相思</item>
<item>听弹琴</item>
<item>登乐游原</item>
<item>朝发白帝城</item>
<item>巴山夜雨</item>
<item>渭城曲</item>
<item>春夜喜雨</item>
<item>离离原上草</item>
<item>示儿</item>
</string-array>

<string-array name="authors">
<item>唐·李白</item>
<item>唐·王之涣</item>
<item>唐·王维</item>
<item>唐·刘长卿</item>
<item>唐·李商隐</item>
<item>唐·李白</item>
<item>唐·杜牧</item>
<item>唐·王维</item>
<item>唐·杜甫</item>
<item>唐·白居易</item>
<item>宋·陆游</item>
</string-array>

<string-array name="contents">
<item>床前明月光,\n疑是地上霜。\n举头望明月,\n低头思故乡。</item>
<item>白日依山尽,\n黄河入海流。\n欲穷千里目,\n更上一层楼。</item>
<item>红豆生南国,\n春来发几枝。\n愿君多采撷,\n此物最相思。</item>
<item>泠泠七弦上,\n静听松风寒。\n古调虽自爱,\n今人多不弹。</item>
<item>向晚意不适,\n驱车登古原。\n夕阳无限好,\n只是近黄昏。</item>
<item>朝辞白帝彩云间,\n千里江陵一日还。\n两岸猿声啼不住,\n轻舟已过万重山。</item>
<item>君问归期未有期,\n巴山夜雨涨秋池。\n何当共剪西窗烛,\n却话巴山夜雨时。</item>
<item>渭城朝雨浥轻尘,\n客舍青青柳色新。\n劝君更尽一杯酒,\n西出阳关无故人。</item>
<item>好雨知时节,当春乃发生。\n随风潜入夜,润物细无声。\n野径云俱黑,江船火独明。\n晓看红湿处,花重锦官城。</item>
<item>离离原上草,一岁一枯荣。\n野火烧不尽,春风吹又生。\n远芳侵古道,晴翠接荒城。\n又送王孙去,萋萋满别情。</item>
<item>死去元知万事空,\n但悲不见九州同。\n王师北定中原日,\n家祭无忘告乃翁。 </item>
</string-array>

</resources>
4、诗歌列表布局文件poem_list_activity.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:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="net.hw.read_ancient_poetry.PoemListActivity">

<ListView
android:id="@+id/lv_poem_title"
android:layout_width="match_parent"
android:divider="#aaaaaa"
android:dividerHeight="1dp"
android:entries="@array/titles"
android:layout_height="match_parent">
</ListView>
</LinearLayout>
此时,运行程序,看看效果:


确实,能够列表显示诗歌标题,但是,我们希望每一行能显示序号以及诗歌作者,利用entries属性绑定数据源的方式就不凑效了,必须使用Java代码来解决。
去掉 android:entries="@array/titles"
5、编写PoemListActivity代码
package net.hw.read_ancient_poetry;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;

/**
* Created by howard on 2017/10/6
*/
public class PoemListActivity extends Activity {
/**
* 诗歌总数
*/
private static final int POEM_COUNT = 11;
/**
* 诗歌标题列表控件
*/
private ListView lvPoemTitle;
/**
* 数组适配器(桥梁)
*/
private ArrayAdapter<String> adapter;
/**
* 诗歌标题数组(数据源)
*/
private String[] strPoemTitles;
/**
* 作者数组
*/
private String[] strAuthors;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 利用布局资源文件设置用户界面
setContentView(R.layout.activity_poem_list);

// 通过资源标识获得控件实例
lvPoemTitle = (ListView) findViewById(R.id.lv_poem_title);

// 初始化诗歌标题数组,作为列表控件的数据源
String[] authors = getResources().getStringArray(R.array.authors);
String[] titles = getResources().getStringArray(R.array.titles);
strPoemTitles = new String[POEM_COUNT];
for (int i = 0; i < POEM_COUNT; i++) {
strPoemTitles[i] = (i + 1) + ". " + authors[i] + "·" + titles[i];
}

// 创建数组适配器,作为联系列表控件与数据源的桥梁
adapter = new ArrayAdapter<String>(
this, // 参数1:上下文环境
android.R.layout.simple_list_item_1, // 参数2:列表项模板
strPoemTitles // 参数3:数据源(数组或数组列表)
);

// 给列表控件设置适配器
lvPoemTitle.setAdapter(adapter);

// 给列表控件注册监听器
lvPoemTitle.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
// 获取用户单击的诗歌标题
String title = strPoemTitles[position];
// 通过吐司显示用户选择的诗歌标题
Toast.makeText(PoemListActivity.this, title, Toast.LENGTH_SHORT).show();
}
});
}
}



此时,运行程序,看看效果。


刚才创建数组适配器时,第二个参数是列表项模板,我们采用的是安卓平台提供的布局资源:android.R.layout.simple_list_item_1。这个布局资源文件在哪里可以看到呢?在安卓开发工具包里的platforms\android-25\data\res\layout。


查看该文件内容:


6、创建自定义列表项模板title_list_item.xml


7、修改PoemListActivity


再运行程序,看看效果:


一页没有显示完,可以拖动显示余下的列表项:


8、创建PoemContentAcitivty


9、设计诗歌内容布局文件activity_poem_content.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@mipmap/background"
android:gravity="center"
android:orientation="vertical" >

<TextView
android:id="@+id/tv_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="20dp"
android:textColor="#ff00ff"
android:textSize="30sp" />

<TextView
android:id="@+id/tv_author"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="20dp"
android:textColor="#000000"
android:textSize="18sp" />

<TextView
android:id="@+id/tv_content"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="20dp"
android:textColor="#0000ff"
android:textSize="20sp" />

<Button
android:id="@+id/btn_back"
android:layout_width="150dp"
android:layout_height="wrap_content"
android:onClick="doBack"
android:text="@string/back"
android:textSize="20sp" />

</LinearLayout>
10、修改字符串资源文件strings.xml


11、修改PoemListActivity代码


12、编写PoemContentActivity代码
package net.hw.read_ancient_poetry;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

public class PoemContentActivity extends Activity {
/**
* 标题标签
*/
private TextView tvTitle;
/**
* 作者标签
*/
private TextView tvAuthor;
/**
* 内容标签
*/
private TextView tvContent;
/**
* 诗歌标题数组
*/
private String[] titles;
/**
* 诗歌作者数组
*/
private String[] authors;
/**
* 诗歌内容数组
*/
private String[] contents;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 利用布局资源文件设置用户界面
setContentView(R.layout.activity_poem_content);

// 通过资源标识获得控件实例
tvTitle = (TextView) findViewById(R.id.tv_title);
tvAuthor = (TextView) findViewById(R.id.tv_author);
tvContent = (TextView) findViewById(R.id.tv_content);

// 获得诗歌标题数组
titles = getResources().getStringArray(R.array.titles);
// 获取诗歌作者数组
authors = getResources().getStringArray(R.array.authors);
// 获取诗歌内容数组
contents = getResources().getStringArray(R.array.contents);

// 获取诗歌索引
int poemIndex = getIntent().getIntExtra("poem_index", 0);

// 设置标题标签、作者标签与内容标签
tvTitle.setText(titles[poemIndex]);
tvAuthor.setText(authors[poemIndex]);
tvContent.setText(contents[poemIndex]);
}

/**
* 返回按钮单击事件处理代码
*
* @param view
*/
public void doBack(View view) {
finish();
}
}
运行程序,看看效果:




单击【返回目录】按钮:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: