您的位置:首页 > 其它

ListView的使用方法总结

2016-07-13 22:25 417 查看

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

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



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



**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))
ret
a67e
urn 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、下面有必要所以下
listview
adapter
之间的关系:

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


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



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




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

这是完整源码
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: