Android ListView和Adapter(一) 不用ListView 来实现列表的功能

By | 2014/06/23

1.ListView是Android中常用的视图之一,几乎没有之一,在安卓的应用中我们经常会看到列表无论是联系人,还是QQ的列表。都离不开ListView,ListView是一个视图容器,顾名思义它可以存放其他的View.我们暂且把包含在它中的条目称作ListItem。

如下图是一个手机自带的设置应用的界面截图,此界面用ListView来显示的:

list

从上图中可以看到整个列表是一个ListView,ListView含有N多条目,每个条目中都已一个图标和一个文字说明,从而引出两个概念:图形和数据。

为了代码的高内聚低耦合,Google的Android工程师们把采用MVC的方式把ListView 中的图形显示和数据分开来存放,然后用一个Adapter把两者结合起来,数据保存在数组(或者集合)中:

符合MVC标准:
M 模型: List<Object>
V 视图: ListView
C 控制器: Adapter数据适配器

2.不使用ListView和适配器,能否实现显示列表

答案是肯定的:

既然是要列表显示,我们首先想到的当然是纵向排列的LinearLayout,在LinearLayout中添加一系列的TextView就能实现这种效果了

用LinearLayout和TextView虽然可以实现,但有弊端,我在这个例子中先实现一个用一般方法实现的列表显示如下:

我们首先在layout文件夹下创建一个布局文件:activity_none_list_view.xml如下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/linear_layout"
	android:layout_width="match_parent"
	android:layout_height="match_parent"
	android:orientation="vertical" >

</LinearLayout>

这个布局文件非常非常的简单,仅仅只有一个LinearLayout布局而已,我们的思想是在Activity中向这个布局中动态的添加TextView对象,使之形成一个列表。

接下来我们创建一个Activity,命名为NoneListViewActivity如下:

package com.comcons.testlistviewandadapter;

import android.app.Activity;
import android.os.Bundle;
import android.widget.LinearLayout;
import android.widget.TextView;

public class NoneListViewActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		//设置这个Activity的填充布局的xml文件
		setContentView(R.layout.activity_none_list_view);

		//首先获取这个布局文件中的LinearLayout的对象的引用
		LinearLayout layout = (LinearLayout)findViewById(R.id.linear_layout);

		//在这里我用一个50个数据模拟创建50个条目,
		//也就是对应50个TextView
		//每次循环创建一个,总格创建50个
		for(int i=0;i<50;i++){
			TextView t = new TextView(this);    //创建一个TextView对象
			t.setText("item"+i);    //设置TextView显示的内容
			layout.addView(t);    //把一个TextView添加到LinearLayout中
		}
	}
}

上面的Activity的代码非常的简单,为了便于观看(也为了突出重点)我把所有的不想关的方法实现都删除了,只保留了onCreate()方法,每行代码的用途都做了详细的注释。这里就不再赘述。

好了,现在运行下这个程序就会发现,屏幕上是不能一下把50条数据都显示出来的,虽然每条数据已经足够窄了,而且不能滚动对不?!

OK,因为手机的屏幕大小是有一定的限制的,所以50 条数据不可能全部显示,这时候必须让这些数据能够滚动,其实很简单,只要修改下布局文件就行了,在LinearLayout外面嵌套添加一个<ScrollView>标签使布局文件看起来是这样的:


<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
	android:layout_height="fill_parent">
	<LinearLayout
	    android:id="@+id/linear_layout"
	    android:layout_width="match_parent"
	    android:layout_height="wrap_content"
	    android:orientation="vertical" >

	</LinearLayout>
</ScrollView>

这时候是不是就和真正的ListView差不多了,虽然难看了点。因为每一条的TextView我们没有对其进行设定样式,就像HTML中的标签没有样式一样,在这里一切为了简单TextView的边框高度大小背景,我一概没有设置。看看下面的截图:

QQ截图20140623212904

如果在加上边框背景,宽度和高度的设置,完全能模仿出上面的设置窗口的样子,但是试想下,我们的这个小程序有什么缺陷。。。
我们在for循环中创建了50个TextView对象,每一个对象都要开辟内存空间,手机内存现在虽然有的能达到一个或者两个G了,但是如果每个程序都这样用了列表,而且每个程序的条目,不仅仅是50个,而是500,甚至是5000条,那多浪费空间啊,而且每个窗口我们看到最多只能显示那么20几条数据,其余的根本是看不到的,没必要占用内存了。所以我们引出了ListView:

 

请看下一篇博客:自己实现一个简单的列表视图ListView

 示例源代码下载

 

One thought on “Android ListView和Adapter(一) 不用ListView 来实现列表的功能

发表评论

电子邮件地址不会被公开。 必填项已用*标注

This site uses Akismet to reduce spam. Learn how your comment data is processed.