Android通过字符串数组构建ListView

参照代码
APIDemo工程,com.example.android.apis.view这个包下List1.java。

适合场景
显示单纯的文字数据,并且一行就显示一条。

代码深入分析
具体代码

public class ListViewByArray extends ListActivity{
    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        
        // Use an existing ListAdapter that will map an array
        // of strings to TextViews
        
        setListAdapter(new ArrayAdapter(this, android.R.layout.simple_list_item_1,mStrings));
        getListView().setTextFilterEnabled(true);
    }
    
    private String[] mStrings = {
    "第一个","第二个","第三个","第四个","第五个","第六个",  "第七个","第八个","第九个","第十个","第十一个","第十二个",  "第十三个","第十四个","第十五个","第十六个","第十七个","第十八个",  "第十九个","第二十个","第二十一个","第二十二个","第二十三个","第二十四个",  "第二十五个","第二十六个","第二十七个","第二十八个","第二十九个","第三十个",  "第三十一个","第三十二个","第三十三个"
    };
}

步骤
1.继承ListActivity类
2.通过String[]初始化一个Android字符串数组变量
3.通过字符串数组,new出ArrayAdapter<String>
4.在setListAdapter,参数为new出的ArrayAdapter<String>

深入分析
一、setListAdapter方法(在ListActivity里面)源码为:

public void setListAdapter(ListAdapter adapter){
	synchronized (this){
    	ensureList();
        mAdapter = adapter;
        mList.setAdapter(adapter);
	}
}

这个方法使用了synchronized关键字,通过百度搜索到相关的说明如下:

1.当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块一行才能执行该代码块。

2.当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对object中所有其他synchronized(this)同步代码块的访问将被阻塞

3.然而,当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的除synchronized(this)同步代码块以外的部分。

4.第三个例子同样适用其它同步代码块。也就是说,当一个线程访问object的一个synchronized(this)同步代码块时,它就获得了这个object的对象锁。结果,其他线程对该object对象所有同步代码部分的访问都被暂停阻塞。

5.以上规则对其他对象锁同样适用

自己的一些分析
1:setListAdapter方法的参数类型为ListAdapter,但是在我们的代码里,方法传递过去的变量类型为 ArrayAdapter,ArrayAdapter(类)继承了BaseAdapter(抽象类),BaseAdapter(抽象类)实现了ListAdapter(接口)和SpinnerAdapter(接口),也就是说这个方法的参数,只要是继承了BaseAdapter的类都可以传递。这样的设计,能增强功能的可扩展性

2:使用了synchronized(this),来保证了线程安全。在Android里面,一个Activity就是一个界面,并且这个界面能被开启多次(这是我使用android手机的一个体会),最典型的情况就是,我通过程序打开了一个Activity,然后又通过通知栏打开这个Activity,这时候点击返回,会返回到通过程序打开的Activity。我猜想,这样可以保证ListView在加载大量数据的时候,不会频繁出现内存溢出的情况。

二、setTextFilterEnabled方法

方法作用:长按菜单键,弹出了搜狗输入法(不知道其他输入法能否这样弹出),然后我输入文字,会对构建ListView的Item进行过滤,不过是按照第一个字到最后一个字来过滤的(也就是我输入一字,那么过滤出来的是第一个字为一的Item项,而不是Item项含有一的),英文,中文都可以。

方法位置:方法在AbsListView(抽象类)里,稍微浏览了一下,是通过boolean值来判断是否执行setFilterText(String filterText)方法。

暂无评论
  • 1:请一针见血的评论。
  • 2:评论需要审核通过后才能显示。
  • 3:评论字数限制在1000字以内。
  • 当前字数:0
热门文章
推荐文章
随机文章
关于本站 - 广告服务 - 版权声明 - 联系我们 - 友情链接 - 网站地图 - 帮助中心