ListView的使用方法总结

此文章是在上一篇文章的基础上进一步的学习

效果图如下,每一个列表项代表一个Crime实体

这里写图片描述

这里首先解释一下原理 ,然后再贴上代码,并在最后附上源码,原理图如下

listview原理图

                              **listview原理图**

1、在模型层增加 CrimeLab 类,用来存储多个 Crime对象;

2、为了能显示crime列表,在控制层增加,一个 activity 和一个 fragment ,即 CrimeListActivity 和 CrimeListFragment (CrimeListFragment 是 ListFragment 的子类, ListFragment 是 Fragment 的子类 );

3、Fragment 内置列表显示支持功能,所以无需为CrimeListFragment 设置布局,ListFragment 类默认实现方法已生成一个全屏 ListView 布局,(当然也可以覆盖 CrimeListFragment.onCreateView(…)方法,去实现自定义布局)。

接下来贴上代码,并详细解释每一部分代码所实现的功能及其作用

  • 首先让我们先来实现CrimeLab 类,该类的作用就是 实现可容纳多个crime 对象的 ArrayList(ArrayList 是一个可以用来存放指定数据类型对象的数组类,具有 获取、新增、删除数组中元素的方法)

1、首先是 CrimeLab 类 代码如下:

import android.content.Context;

import java.util.ArrayList;
import java.util.UUID;

/**
 * Created by horizon on 2016/7/13.
 */
public class CrimeLab {
    public ArrayList<Crime> mCrimes;     //用来保存 crime 对象的数组

    private static CrimeLab sCrimeLab;
    private Context mAppContext;


    private CrimeLab(Context appContext){
        mAppContext = appContext;
        mCrimes = new ArrayList<>();

        //添加100个数据
        for (int i = 0;i < 100;i++)
        {
            Crime c = new Crime();
            c.setTitle("Crime#"+i);
            mCrimes.add(c);
        }
    }

   //此get 方法用来返回实例,若存在直接返回,若不存
   //在则调用构造方法创建后返回
    public static CrimeLab get(Context c)       
    {                                           
        if(sCrimeLab == null)
            sCrimeLab = new CrimeLab(c.getApplicationContext());
        return sCrimeLab;
    }

    //返回数组列表
    public ArrayList<Crime> getCrimes(){
        return mCrimes;
    }

    //返回某一指定的对象
    public Crime getCrimes(UUID id){
        for(Crime c : mCrimes){
            if (c.getId().equals(id))
                return c;
        }
        return null;

    }
}
  • 若要创建单例,需要创建一个带有私有构造方法和 get()方法的类,其中get()方法用来返回实例。

2、接着是 CrimeListFragment 类 代码如下:

import android.os.Bundle;
import android.support.v4.app.ListFragment;
import android.widget.ArrayAdapter;

import java.util.ArrayList;

/**
 * Created by horizon on 2016/7/13.
 */
public class CrimeListFragment extends ListFragment {
    private ArrayList<Crime> mCrimes;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        getActivity().setTitle(R.string.crime_title);  //getActivity()方法可以返回托管此fragment的 activity 来实现一些功能

        //此fragment 需要获取 CrimeLab 中的crime 列表
        mCrimes = CrimeLab.get(getActivity()).getCrimes();  

    //下面两句是为每一个listview 的 view 项设置一个 adapter ,用来生成相应的视图
        ArrayAdapter<Crime> adapter = new ArrayAdapter<Crime>(getActivity(),android.R.layout.simple_list_item_1,mCrimes);

        setListAdapter(adapter);
    }
}

-此处需要说明的是 这里 不需要为 CrimeListFragment 设置相应的布局,因为 在 fragment 内部已生成一个全屏 listView 布局 (具体代码解释 见代码注释)

3、接着是托管 CrimeListFragment 的CrimeListActivity类 代码如下:

import android.support.v4.app.Fragment;

/**
 * Created by horizon on 2016/7/13.
 *
 *此类继承了自定义的抽象类 SingleFragmentActivity
 */

public class CrimeListActivity extends SingleFragmentActivity {
    @Override
    public Fragment createFragment() {
        return new CrimeListFragment();
    }
  • SingleFragmentActivity 类,代码如下
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;

/**
 * Created by horizon on 2016/7/13.
 *
 *
 * 此类为抽象类,可供其他类继承
 */
public abstract class SingleFragmentActivity extends FragmentActivity {
   //抽象方法,能够返回一个新的 CrimeListFragment
    public abstract Fragment createFragment();   

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_fragment);

        //以下已在上篇文章中解释过

        FragmentManager fm = getSupportFragmentManager();   
        Fragment fragment = fm.findFragmentById(R.id.fragment_container);

        if(fragment == null)
        {
            fragment = createFragment();
            fm.beginTransaction().add(R.id.fragment_container,fragment).commit();
        }
    }
}

-使用抽象类 可以大大减少代码的输入量,提高工作效率。

4、下面有必要所以下listviewadapter之间的关系:

adapter 是一个控制器对象,从模型层获取数据,并将之提供给ListView 显示,起到桥梁的作用。
adpater 负责:
1、创建必要的视图;
2、从模型层获取数据填充视图对象;
3、将准备好的视图对象返回给 ListView 

下面这个图展示了 ListView 和 adapter 会话的过程

还有一点值得注意的是,如果在Crime类中 没有重写 toString 方法 ,得到最终不是文章一开始显示的界面,而是下面这种情况

这里写图片描述

这是由于ArrayAdapter.getView(…)实现方法依赖于toString()方法,它首先生成视图,然后找到指定位置的Crime对象并对其调用 toString()方法,最后得到信息并传递给TextView。由于Crime类没有覆盖toString()方法,因此,默认使用了 java.lang.Object类的实现方法,直接返回了混合对象类名和内存地址的字符串信息。

这是完整源码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值