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类的实现方法,直接返回了混合对象类名和内存地址的字符串信息。
这是完整源码
相关文章推荐
- jstl,el,ognl的区别
- ORA-27101 ORACLE not available
- python3解释器
- JAVA设计模式--代理模式(动态)(二)
- 字符串的展开
- jQuery:bind方法的使用详解
- 集训第八天
- LeetCode - 90. SubsetsII
- servlet测试获取请求行信息
- DFS--poj 2488
- 虚拟机联网和互ping的问题
- Java中的Set集合
- javascript运算符——位运算符
- Lost connection to MySQL server at ‘reading initial communication packet', system error: 0
- PhpStorm 设置自动FTP同步文件
- 题目链接...
- if 语句 基础学习笔记 (一)
- eclipse中代码注释
- Codeforces Round #321 (Div. 2) C dfs处理(双向边叶子节点的判断)
- web开发(六)之激活邮件发送