CursorAdapter使用的例子
CursorAdapter使用心得
CursorAdapter使用心得以下是我的使用心得。
1.用了CursorAdapter之后你可以将数据处理也可以类代对像化。
这个要比视图灵活得多。
比如说以上我的类.这是第一层的所有用到的CursorAdapter类都是继承这个类的的。
*- 主程式类DEFINE CLASS MainDataClass as CursorAdapterDataSourceType="ODBC"DataSource=sql CONNECT([xsconn],.T.)UseDeDataSource= .T.FetchSize=-1MaxRecords=-1FetchMemo= .T.SendUpdates= .T.PROCEDURE initthis.CursorFillENDPROC*- 反回是否有记录存在PROCEDURE isReccount as BooleanLOCAL lRetu as BooleanSELECT (this.Alias)IF RECCOUNT() =0lRetu = .f.ELSElRetu = .t.ENDIFRETURN lRetuENDPROC*- 更新PROCEDURE update as BooleanLOCAL lRetu as BooleanSELECT (this.Alias)lRetu=TABLEUPDATE(.t.)IF lRetu = .f.LOCAL iErrorDIMENSION iError(1)AERROR(iError)MESSAGEBOX([错原因:]+CHR(13)+ALLTRIM(iError(2)),16,"更新失败")RELEASE iErrorENDIFRETURN lRetuENDPROCENDDEFINE接下去要使用到的表是这样。
也就是第二层。
我的商品库用到的类。
DEFINE CLASS spk as MainDataClassAlias=[spk]Tables=[spk]SelectCmd = [select spk.* from spk order by spid]UpdateNameList = [SPID spk.SPID, SPNAME spk.SPNAME, DW spk.DW,BZS spk.BZS, CD s pk.CD, KCWZ spk.KCWZ, LSJ spk.LSJ, PFJ spk.PFJ, KCSL spk.KCSL, KCDJ spk.KCDJ, KCJ E spk.KCJE, BZ spk.BZ, ZGKC spk.ZGKC, ZDKC spk.ZDKC,]+;[JGA spk.JGA,JGB spk.JGB,JGC spk.JGC ,JGD spk.JGD,JGE spk.JGE,JGF spk.JGF ]KeyFieldList = [SPID]UpdatableFieldList = [SPID, SPNAME, DW, CD, KCWZ, BZS,LSJ, PFJ, BZ, ZGKC, ZDKC,JG A,JGB,JGC,JGD,JGE,JGF]CursorSchema=[SPID C(10), SPNAME C(40), DW C(10),BZS N(10,0), CD C(20), KCWZ C(10 ), LSJ N(12, 4), PFJ N(12, 4), KCSL N(12, 2), KCDJ N(12, 4), KCJE I, BZ C(40), ZGKC N(12, 2 ), ZDKC N(12, 2),]+;[ JGA N(10,4),JGB N(10,4),JGC N(10,4),JGD N(10,4),JGE N(10,4),JGF N(10,4)] ENDDEFINE以上的代码是对商品库的一些主要设置。
Android各种Adapter的用法
Android 各种Adapter 的用法同样是一个ListView ,可以用不同的Adapter 让它显示出来,比如说最常用的ArrayAdapter ,SimpleAdapter ,SimpleCursorAdapter ,以及重写BaseAdapter 等方法。
ArrayAdapter 比较简单,但它只能用于显示文字。
而SimpleAdapter 则有很强的扩展性,可以自定义出各种效果,SimpleCursorAdapter 则可以从数据库中读取数据显示在列表上,通过从写BaseAdapter 可以在列表上加处理的事件等。
下面先来看看ArrayAdapter :?1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 package com.shang.test;import java.util.ArrayList;import android.app.Activity;import android.os.Bundle;import android.widget.ArrayAdapter;import android.widget.ListView;/**** @author shangzhenxiang**/public class TestArrayAdapterActivity extends Activity{private ListView mListView;private ArrayList<String> mArrayList = new ArrayList<String>();19202122232425262728293031323334353637 @Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.testarrayadapter);mListView = (ListView) findViewById(R.id.myArrayList);mListView.setAdapter(new ArrayAdapter<String>(this, yout.simple }private ArrayList<String> getData() {mArrayList.add("测试数据1");mArrayList.add("测试数据2");mArrayList.add("测试数据3");mArrayList.add("测试数据4");mArrayList.add("测试数据5");mArrayList.add("测试数据6");return mArrayList;}}布局里面有个ListView就可以了:?1 2 3 4 5 6 7 8 91011121314<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="fill_parent"><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:text="@string/hello"/><ListViewandroid:id="@+id/myArrayList"android:layout_width="match_parent"android:layout_height="wrap_content"/></LinearLayout>上面的代码中用到了ArrayAdapter的构造方法:public ArrayAdapter (Context context, int textViewResourceId, T[] objects) Api中是这么描述的:其中Context为当前的环境变量,可以显示一行文字的一个布局文件,和一个List的集合,也就是数据源。
Android适配器学习和使用
Android的适配器的学习和使用(整理)在开发中我们需要绑定一些数据展现到桌面上,这是就需要AdapterView。
AdapterView是ViewGroup的子类,它决定了怎么展现视图通过Adapter来绑定特殊的数据类型。
AdapterView是非常有帮助的当你展现数据在你的布局中。
Gallery,ListView和Spinner是AdapterView的子类。
下面看一下AdapterView的结构图:然后再看一下Adapter的结构图:上面已经充分展现了他们的子类和父类的基础关系。
下面我们看一个ListViewDemo的例子:先来看一个简单的adapter的例子:public class SimpleList extends ListActivity {private String[] mListString={"姓名:王魁锋","性别:男","年龄:23", "居住地:上海市普陀区","邮箱:wangkuifeng0118@"};private ListView mListView=null;@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);mListView=this.getListView();setListAdapter(new ArrayAdapter<String>(this,yout.simple_list_item_1,mListString));mListView.setOnItemClickListener(new OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {// TODO Auto-generated method stubToast.makeText(SimpleList.this, "你选择了:"+mListString[position], 1).show();}});}这里用到了系统定义好的适配模式,当然这只能用来简单的数据适配,下面看一下效果:接下来看一个稍微复杂点的,SimpleAdapter怎么适配:public class IconList extends ListActivity {private String[] mListTitle = { "姓名", "性别", "年龄", "居住地","邮箱"};private String[] mListStr = { "王魁锋", "男", "23", "上海市普陀区","wangkuifeng0118@"};ListView mListView = null;ArrayList<Map<String,Object>> mData= newArrayList<Map<String,Object>>();;@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubmListView = getListView();int lengh = mListTitle.length;for(int i =0; i < lengh; i++) {Map<String,Object> item = new HashMap<String,Object>(); item.put("image", R.drawable.portrait);item.put("title", mListTitle[i]);item.put("text", mListStr[i]);mData.add(item);}SimpleAdapter adapter = newSimpleAdapter(this,mData,yout.iconlist,new String[]{"image","title","text"},newint[]{R.id.image,R.id.title,R.id.text});setListAdapter(adapter);mListView.setOnItemClickListener(new OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view,int position, long id) {// TODO Auto-generated method stubToast.makeText(IconList.this,"您选择了标题:" + mListTitle[position] + " 内容:"+mListStr[position],Toast.LENGTH_LONG).show();}});super.onCreate(savedInstanceState);}}上面的数据可以是同数据库读取的也可以是从网络获取的,这里不做过多介绍,看下效果:哈哈看起来美观了些,如果要做更复杂的布局,哪就要用BaseAdapter了。
CA类及其在远程数据访问中的意义
CA类及其在远程数据访问中的意义转自《电脑编程技巧和维护》Visual FoxPro 8.0 的CursorAdapter类及其在远程数据访问中的意义[摘要] 本文从Visual FoxPro应用程序的观点深入剖析Visual FoxPro 8.0中新增的CursorAdapter类及其在远程数据访问中的意义。
CursorAdapter对各种远程数据源提供了一种统一的面向对象的访问接口,开发人员借此可以轻松实现基于Native(本地数据)、ODBC、ADO、XML的数据访问。
[关键词] CursorAdapter,远程数据访问,ADO,视图,Cursor,COM一、引言就在“Visual FoxPro已过时,并即将被淘汰……”的一片喧嚣声中,Microsoft于去年6月正式发布了Visual FoxPro 8.0。
据称,这是自Visual FoxPro 3.O发布以来最精彩的一个版本。
新增众多如:结构化异常处理、事件绑定、数据环境子类、XML Web services、自动递增字段、控件延迟绑定、Windows XP风格支持等等令人目不暇接的功能,着实让全球Foxer们兴奋不已,然而其中最值得令人称道的当数CursorAdapter类,笔者以为这是Visual FoxPro 8.0最抢眼的一个亮点。
长期以来,Visual FoxPro因为其先天的弱点如:表的脆弱性、安全性、数据库的容量以及通用性等等,一直成为人们攻击的目标。
因而越来越多的VFP程序员开始抛弃DBF表,转而采用如SQL Server、Oracle 等一些大型数据库来存储数据,而将VFP作为c/s结构中的前端开发工具或者作为基于COM的三层结构应用程序的中间层开发工具。
然而,传统的方式通常是使用远程视图或SQL Pass Through然后经过ODBC 来访问远程数据。
随着新的基于组件技术的数据访问规范OLE DB和扩展标记语言XML的出现,对VFP 开发人员来说无疑产生了极大的吸引力。
Android listview与adapter用法
Android listview与adapter用法listview与adapter用法博客分类:android一个ListView通常有两个职责。
(1)将数据填充到布局。
(2)处理用户的选择点击等操作。
第一点很好理解,ListView就是实现这个功能的。
第二点也不难做到,在后面的学习中读者会发现,这非常简单。
一个ListView的创建需要3个元素。
(1)ListView中的每一列的View。
(2)填入View的数据或者图片等。
(3)连接数据与ListView的适配器。
也就是说,要使用ListView,首先要了解什么是适配器。
适配器是一个连接数据和AdapterView (ListView就是一个典型的AdapterView,后面还会学习其他的)的桥梁,通过它能有效地实现数据与AdapterView的分离设置,使AdapterView与数据的绑定更加简便,修改更加方便Android中提供了很多的Adapter,表4-5列出了常用的几个。
其实适配器还有很多,要注意的是,各种Adapter只不过是转换的方式和能力不一样而已。
下面就通过使用不同的Adapter来为ListView绑定数据(SimpleCursorAdapter暂且不讲,后面讲SQLite 时会介绍)。
4.12.1 ListView使用ArrayAdapter用ArrayAdapter可以实现简单的ListView的数据绑定。
默认情况下,ArrayAdapter绑定每个对象的toString值到layout中预先定义的TextView控件上。
ArrayAdapter的使用非常简单。
实例:工程目录:EX_04_12在布局文件中加入一个ListView控件。
<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="/apk/res/android"android:layout_width="fill_parent"android:layout_height="fill_parent"><!-- 添加一个ListView控件--><ListViewandroid:id="@+id/lv"android:layout_width="fill_parent"android:layout_height="fill_parent"/></LinearLayout>然后在Activity中初始化。
arrayadapter的三个参数
一、ArrayAdapter的作用ArrayAdapter是Android中常用的适配器类,用于将数据源绑定到UI组件,如ListView、Spinner等,使数据能够在界面上显示出来。
在使用ArrayAdapter时,需要使用三个参数来进行实例化,这三个参数分别是数据源、布局资源和目标控件。
下面将分别对这三个参数进行详细介绍。
二、数据源数据源是指要显示的数据集合,通常是一个数组或者List集合。
当实例化ArrayAdapter时,需要将数据源传入构造方法中,这样ArrayAdapter就能够根据数据源来展示列表项。
可以将一个String数组作为数据源,然后ArrayAdapter会将数组中的每个元素显示在列表中。
在使用数据源时,需要保证数据源与要显示的控件相匹配,例如如果是ListView要显示的是String类型的数据,那么数据源也应该是String类型的数组或List集合。
三、布局资源布局资源是用来定义列表项的布局文件,通常是一个包含要显示数据的TextView或者其他控件的XML文件。
在实例化ArrayAdapter时,需要将布局资源的ID传入构造方法中,这样ArrayAdapter就知道要使用哪个布局来显示每个列表项。
布局资源可以根据需求进行定制,例如可以在布局中添加多个控件来显示不同的数据,或者对控件进行样式的调整。
四、目标控件目标控件是指要显示数据的UI组件,通常是一个ListView、Spinner 或者GridView。
在实例化ArrayAdapter时,需要将目标控件的Context和布局资源的ID传入构造方法中,这样ArrayAdapter就能够将数据显示到目标控件上。
需要注意的是,目标控件的类型需要与数据源相匹配,例如如果数据源是String类型的数组,那么目标控件应该是ListView或者Spinner等可以显示String类型数据的控件。
五、总结在使用ArrayAdapter时,需要重点关注三个参数:数据源、布局资源和目标控件。
Android学习笔记--- 采用ListView实现数据列表显示,以及各种适配器使用,和如何写自己的适配器
Android学习笔记---采用ListView实现数据列表显示,以及各种适配器使用,和如何写自己的适配器19_采用ListView实现数据列表显示 --------------------------------------------------ListView显示界面的设置: --------------------------姓名 n n n 电话n n n 存款老周 n 12345687895 n n41111 老方 n 12515466874 n n5000 ------------------------------1.在使用SimpleCursorAdapter adapter=new SimpleCursorAdaptern n (this,yout.item,cursor,new String[]{"name","phone","amount"},new int []n n {,R.id.phone,R.id.amount});这个SimpleCursorAdapter适配器的时候: 出现这个异常: -----------------------------------------------03-12 23:23:22.934: E/AndroidRuntime(23439): Caused by:n n ng.IllegalArgumentException: column '_id' does not exist n --------------------------------------------------------------------这个异常跟SimpleCursorAdapter ,这个源码有关: 可以查看源码,会有说明: ---------------------------方法:1.把数据库表中的主键id改成:_id n n n2.处理查询后的结果集:主键起一个别名: n n n select personid as _id,name,phone,amount from person order by personid ascn n limit ?,? ----------------------------------------------1.使用android自带的两种适配器,实现listview显示的代码: n 在DBSQLIte项目的基础上,复制一份,并重新命名:ListViewDBSQLIte2./ListViewDBSQLIte/src/com/credream/db/DBSQLIteActivity.java package com.credream.db; n n import java.util.ArrayList; n import java.util.HashMap; n import java.util.List; n n importjavax.security.auth.PrivateCredentialPermission; n n import com.credream.adapter.PersonAdapter; n import com.credream.entity.Person; n import com.credream.service.PersonService; n n import android.app.Activity; n import android.database.Cursor; n import android.os.Bundle; n import android.view.View; n import android.widget.AdapterView; n import android.widget.ListView; n import android.widget.SimpleAdapter; n import android.widget.SimpleCursorAdapter; n import android.widget.Toast; n import android.widget.AdapterView.OnItemClickListener; n n public class DBSQLIteActivity extends Activity { n n private nListView listView; nn nprivate PersonService personService; n n /** Called when the activity is first created. */ n n n@Override n n public void onCreate(Bundle savedInstanceState) { n n n nn n super.onCreate(savedInstanceState); n n n n nsetContentView(yout.main); n n n nn personService=new PersonService(this); n n nlistView= (ListView)this.findViewById(R.id.listView); n n n//给每个条目设置监听对象 n nlistView.setOnItemClickListener(new nItemClickListener ()); n n n//show(); n n n//测试使用SimpleCursorAdapter 适配器的时候用这个n n n//show2(); n n //测试使用自定义适配器的时候,用这个n n n show3(); nn n } n n nn n n final class ItemClickListener implements OnItemClickListener{ n n n n @Override n nn public void onItemClick(AdapterView<?> parent, View view, int position,n n long id) n nn { n nn // AdapterView<?> parent指的是用户点击的一个view对象, View view就是点击的那个view n 控件, int position就是所点击的那一条值,在list中的索引值, long id就是listview在内n 部进行排序用的 n nn ListView lvView=(ListView)parent; n n //使用自定义的适配器使用方法: n nn Person person=(Person)lvView.getItemAtPosition(position); n nn n Toast.makeText(getApplicationContext(), person.getId().toString(), 1).show(); n n nn //使用cursor,也就是show2()的时候,cursor适配器的用法 n n n //SimpleCursorAdapter 适配器来显示listView控件 nn nn /*Cursor cursor=(Cursor)lvView.getItemAtPosition(position); n n nint personid=cursor.getInt(cursor.getColumnIndex("_id")); n nn n Toast.makeText(getApplicationContext(), personid+"", 1).show();*/ nn nn } nn n n n n} n n n n n n n nn n private void show() { List<Person> persons=personService.getScrollData(0, 20); n List<HashMap<String, Object>> data=new ArrayList<HashMap<String,Object>>(); n for(Person person:persons){ HashMap<String, Object> item=new HashMap<String, Object>(); n item.put("name", person.getName()); item.put("phone", person.getPhone()); item.put("amount", person.getAmount()); data.add(item); } //适配器:SimpleAdapter 和 item.xml中的条目显示 SimpleAdapter nadapter=new SimpleAdapter(this,data,yout.item,newn n String[]{"name","phone","amount"},new int[]{,R.id.phone,R.id.amount}); n // data,yout.item,把数据data绑定到yout.item上,也就是item.xml n 指定的格式 //把name 这个key指向的值,指定到name显示控件上 listView.setAdapter (adapter); /*SimpleAdapter 的内部工作原理,将data当然以hashMap的形式,让这些数据按照,key和R.id n 中的控件对应的形式显示内部显示的实现过程: n* int total=adapter.getCount(); //取得总素,然后迭代,然后调用View显示,(显示的时候获取屏幕高度,然后获取每个显示控件 n 的高度,然后计算出每页显示多少个项)int perpage=7;// for(int i=0;i<perpage;i++){ View view=adapter.getView(i, , parent); //用于得到条目的view对象 */ } //SimpleCursorAdapter 适配器来显示listview private void show2(){ Cursorcursor=personService.getCursorScrollData(0, 20); n SimpleCursorAdapter adapter=new SimpleCursorAdapter(this,yout.item,cursor, n new String[]{"name","phone","amount"},new int[] n {,R.id.phone,R.id.amount}); n listView.setAdapter(adapter); } //采用自定义适配器来实现数据的绑定 private void show3(){ List<Person> persons=personService.getScrollData(0, 20); n PersonAdapter adapter=new PersonAdapter(this, persons,yout.item); n listView.setAdapter (adapter); } } n --------------------------------------------2.建立一个自定义的适配器:来实现显示数据效果: /ListViewDBSQLIte/src/com/credream/adapter/PersonAdapter.java packagecom.credream.adapter; n import java.util.List; n import com.credream.db.R; importcom.credream.entity.Person; n import android.content.Context; import youtInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.TextView; n public class PersonAdapter extends BaseAdapter { privateList<Person> persons;//在绑定的数据 private int resouce;//绑定条目界面 private LayoutInflater inflater;//布局填充器,是系统的,所以要使用到系统上下文 public PersonAdapter(Contextcontext,List<Person> persons, int resouce) { n this.persons = persons; this.resouce = resouce; inflater=(LayoutInflater)context.getSystemService n (YOUT_INFLATER_SERVICE); } n@Override public int getCount() { // TODO Auto-generated method stub return persons.size(); } n @Override public Object getItem(int position) { // TODO Auto-generated method stub return persons.get(position); } //当显示的时候listView有缓存功能,在访问第一页的时候,他会为每一个条目new 一个对象 //然后, @Override public long getItemId(int position) { return position; } //View convertView这个如果第一次的话,就没有缓存传过来的事null //如果不是第一次的话,那么传过来的应该不是null,含有以前缓存的条目 //这样写性能不好,因为每次的显示条目的时候都要,调用这个方法,都会执行,三个控件的赋n 值@Override public View getView(int position, View convertView, ViewGroup parent) {TextView nameView=null; TextView phoneView=null; TextView amountView=null; nif(convertView==null){ n//创建view对象 convertView= inflater.inflate(resouce, null);//指定用哪n 一个resource的xml文件来生成一个view对象 //给控件赋值n nnameView=(TextView)convertView.findViewById n (); n phoneView=(TextView)convertView.findViewById n(R.id.phone); n amountView=(TextView)convertView.findViewById n (R.id.amount); nViewCachecache=new ViewCache(); View=nameView; ncache.phoneView=phoneView;ncache.amountView=amountView; nconvertView.setTag(cache); n}else{ nViewCache cache=(ViewCache) convertView.getTag(); nnameView=View; n phoneView=cache.phoneView; namountView=cache.amountView; n} n//性能没有优化的情况n/*TextView nameView=(TextView) convertView.findViewById n (); nTextView phoneView=(TextView)convertView.findViewById n (R.id.phone); nTextView amountView=(TextView)convertView.findViewById n (R.id.amount);*/ Person person=persons.get(position); nameView.setText(person.getName()); phoneView.setText(person.getPhone()); amountView.setText(person.getAmount().toString()); nreturn convertView; } private final class ViewCache{ //在android中使用public比较多,因为,使用public,不用多次创n建,private,每次自己使用的时候都会创建,public //创建一次,就可以共享 public TextView nameView; public TextView phoneView; public TextView amountView; } n } ------------------------------------------/ListViewDBSQLIte/res/layout/item.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="/apk/res/android" n nandroid:layout_width="wrap_content" n n android:layout_height="match_parent" n nandroid:baselineAligned="false" n n android:orientation="horizontal" > n n n <TextView n n n n android:layout_width="120dp" n n n n android:layout_height="wrap_content" n n n nandroid:id="@+id/name"n n n n n android:text="xxxxx" n n n n /> n<TextView n n n nandroid:layout_width="150dp" n n n n android:layout_height="wrap_content" n n n nandroid:id="@+id/phone" /> n nn n <TextView n n n n android:layout_width="fill_parent" n n n n android:layout_height="wrap_content" n n n n android:id="@+id/amount" /> n </LinearLayout> -----------------------------------------------------/ListViewDBSQLIte/res/layout/main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayoutxmlns:android="/apk/res/android" n n android:layout_width="fill_parent" n n android:layout_height="fill_parent" n n android:orientation="vertical" > n n n <LinearLayoutn n n android:layout_width="wrap_content" n n android:layout_height="wrap_content" n nandroid:baselineAligned="false" n n android:orientation="horizontal" > n n n <TextView n n n n android:layout_width="120dp" n n n n android:layout_height="wrap_content" n n n nandroid:text="@string/name"n n n n n /> n<TextView n n n n android:layout_width="150dp" n n n n android:layout_height="wrap_content" n n n n android:text="@string/phone" /> n nn n <TextView n n n n android:layout_width="fill_parent" n n n n android:layout_height="wrap_content" n n n n android:text="@string/amount" /> n </LinearLayout> n nn n nn n nn n n <ListView n n n nandroid:layout_width="fill_parent" n n n n android:layout_height="wrap_content" n n n nandroid:id="@+id/listView"/> </LinearLayout> ----------------------------------------------------------注意这里将item.xml中除了命名空间的代码考到main.xml中然后修改这个地方就可以,给listview显示的数据加标题了: n <LinearLayoutn n n android:layout_width="wrap_content" n nandroid:layout_height="wrap_content" n n android:baselineAligned="false" n nandroid:orientation="horizontal" > n n n <TextView n n n n android:layout_width="120dp" n n n n android:layout_height="wrap_content" n n n n android:text="@string/name"n n n n n /> n<TextView n n n n android:layout_width="150dp" n n n n android:layout_height="wrap_content" n n n n android:text="@string/phone" /> n nn n <TextView n n n n android:layout_width="fill_parent" n n n n android:layout_height="wrap_content" n n n n android:text="@string/amount" /> n</LinearLayout> -----------------------------------------------3.还有<GridView>控件的使用,网格显示控件,比如android的应用主页面显。
自定义CursorAdapter,实现ListView中动态加载button
前言:Android中的自带的CursorAdapter适配器可以加载固定格式的数据绑定。
但在实际应用开发中,会碰到ListView中Item项显示根据数据不同,而变化显示。
举例:在我们实际开发中碰到这样的问题根据一个主题答题情况,显示不同的按钮,且点击按钮后,转到各自的处理界面。
【主题状态】第一次答题,显示【开始】按钮事件:点击按钮,下载题库,转到答题界面【主题状态】答题还未结束,显示【继续】按钮事件:点击按钮,转到答题界面【主题状态】全部答题完成,显示【重做】按钮事件:点击按钮,清空答题痕迹,转到答题界面,重新答题实现的效果图:在这样的情况下,原来系统自带的CursorAdapter适配器就不能满足需求的实现。
1 自定义CursorAdapter 说明自定义CursorAdapter 需要重写两个函数1.1 public void bindView(View view, Context context, Cursor cursor)说明:绑定视图函数View 参数:当前ListView 的Item View,在View 中包含了ListView Item 界面元素界面元素调用的方式为:TextView noteData = (TextView) view.findViewById(R.id.note_list_time);Cursor参数:当前游标根据Cursor来获取数据的方法String ID= Cursor.getString(3)1.2 public View newView(Context arg0, Cursor arg1, ViewGroup arg2)获取ListView中的Item 界面元素的函数一般的情况下,扩展定义好的XML界面布局文件return mInflater.inflate(yout.note_item, arg2, false);2 ListView中Button点击事件的实现ListView 中实现Item中的Button事件,在实现Button事件时,最关键的事情是,当前button 对于的Item的唯一标识,而如何保存这唯一标识到button中呢.在View中包含了setTag 和getTag 一对方法,同过这样的方法可以在View’绑定时,把Item 中的唯一标识保存到Button的Tag中,并在Button的点击事件中读取标识。
SQLite及provider
SQLite 的使用SQLite 是非常流行的嵌入式关系型数据库,轻载,速度快,而且是开源。
在 Android 中, runtime 提供 SQLite,所以我们可以使用 SQLite,而且是全集的 SQLite。
SQLite 提供 SQL 接 口,和一般的数据库一样。
但是 Android 的 API 丌采用 JDBC,JDBC 消耗太多的资源。
SQLite 支持绝大部分 SQL-92 标准,丌支持:FOREIGN KEY constraints, nested transactions, RIGHT OUTER JOIN, FULL OUTER JOIN, and some flavors of ALTER TABLE. 而我们在手持终端上使用 SQLite, 一般并丌涉及太复杂的数据库处理, 除了上诉, 其他的 SQL, 包括 tirger、transaction 等都是支持,应该说 SQLite 提供的功能是足够。
和一般的 SQL 数据库比较,最大的差异是数据类型,例如我们定义一个表的某个 column 的数据类型为 INTEGET,如果在揑入时这个数值采用 String,在 SQLite 中是包会产生错诨,我 们可以将定义表格的数据类型作为一个提示,用亍说明期待的数据类型,但是并丌真实起到检测 作用。
如果真的需要限制,要以来程序的其他部分迚行判断。
1、建立我们的数据库 在 MySQL 等数据库中,第一步是创建数据库,第二步是创建表,如需要,还加上我们的初 始预制的数据。
在 Android 的 SQLite 的使用是一样的。
稍微特别一点是,我们需要通过继承 SQLiteOpenHelper 这个类来达到目的。
对亍抽象类 SQLiteOpenHelper 的继承, 需要重写: 1) constructor,2)onCreate()和 onUpgrade(),下面举例介绉。
这个例子,我们创建一个称为 bebook_db 的数据库,里面有一个叨 mytable 的表格,有三 列:_id,Name,Weight。
介绍 CursorAdapter 类
介绍 CursorAdapter 类vfp8最激动人心的变化是 CursorAdapter 类,它为不同的数据源提供通用的数据接口。
下面介绍怎样用 CursorAdapter 改变在 VFP 8 中连接数据的方式,包括,native tables, ODBC, OLE DB, XML. 。
CursorAdapter 类是 VFP 8 开发组的最给人印象深刻的成就之一。
它将会改变许多开发者连接各种不同的数据来源的方式。
开发小组在 VFP 存取数据的方式方面作了重要改变,将本地和远程数据连接方式进行了统一。
另外,创建 CursorAdapter 类对那些已经熟练使用视图和SPT人来说并不费力。
对使用ADO RecordSets 或XML 可扩展标示语言文件的人也不费力。
CursorAdapter 类的独特之处在于,它是第一个提供本地游标、ODBC、ADO、XML数据源连接的基类,在一个类里面实现了所有连接功能。
换句话说,要将ODBC数据源,ADO RecordSet 或XML可扩展标示语言文件翻译成一个 VFP 游标,CursorAdapter 类完全可以胜任。
你或许会说 CursorAdapter 是较早版本中本地视图和远程视图技术的替代 (注意: VFP 8中仍然保留这些功能). 但是在一些情形中,它也代替了SPT, 以及减少了使用ADO和XML时的代码量,可以直接使用ADO和XML。
CursorAdapter 的最大好处是,需要在同一个程序内连接到多个数据源的时候,它为你提供方便。
举例说,如果你的程序大部分数据来自 SQL server,但是同时需要与XML可扩展标示语言连接,CursorAdapter 可以整合这两种情况,使程序取回的数据作为VFP的游标。
另外的一个例子是数据现在被储存在 VFP 表中 , 但是计划要移到一个数据库服务器 , 比如 SQL server或Oracle。
你需要先建立一组 VFP CursorAdapter 类,必要的时候以 SQL server以外的数据库代替这些类。
Visual FoxPro 9 CS(ODBC)方面极富人性化的增强
Visual FoxPro 9 CS(ODBC)方面极富人性化的增强Visual FoxPro 9 C/S(ODBC)方面极富人性化的增强作者:mihu2004年6月,微软公司如期发布了全球Foxer翘首期盼代号为Europa的Visual FoxPro 9beta 版(以下简称VFP9),下文是我学习、探索VFP9 C/S方面新增功能时的一些心得,供大家一起分享。
自从VFP 8 开始,在C/S方面提供了一个CursorAdapter 类,CursorAdapter 是一个基于松散耦合思想设计的对象化的Cursor 处理模型。
对CursorAdapter 类很多人对其褒贬不一,特别是一些老的Foxer认为做C/S系统用SPT就足够了,何必再增加一个类呢?但我可以这么说,从VFP9 开始,几个CursorAdapter新增加的功能,相信足以使那些纯使用SPT 的Foxer 心动不已了。
下面我先谈谈VFP9 在CursorAdapter 部分的几个增加和增强。
1. 属性值可以超过255 个字符大家都知道,VFP的表单、类库和报表等其实都是以DBF形式存放,VFP9以前属性是以(C)字符型存放,VFP9中做了修改,以(M)备注型存放,这样使得在VFP9开始,属性值突破了255个字符的限制。
用过CursorAdapter 类的人都知道,VFP8 时其几个属性SelectCmd、CursorSchema、UpdateNameList、UpdatableFieldList的长度不能超过255个字符,这在VFP8时让人感觉是一件非常滑稽和痛苦的事情,当后台表的字段数一多,连使用它自身生成器生成的字符串都要报错,不能保存,这点造成CursorAdapter使用起来极为不便,使得CursorAdpter的生成器变成了摆设,也是全球Foxer要求解决的呼声最多的地方,现在这个问题在VFP9 中终于得到了彻底解决。
2. NoData 和UseCursorSchema 属性VFP8 时当把CursorAdapter 设计时放到表单的数据环境里,使用CursorFill()里的这两个参数极为不便,尤其是对初学者,现在好了,把这两个属性单独列了出来。
Android学习之适配器SimpleCursorAdapter
Android学习之适配器SimpleCursorAdapter三. SimpleCursorAdapter与SimpleAdapter⽤法相近。
只是将List对象换成了Cursor对象。
⽽且SimpleCursorAdapter类构造⽅法的第四个参数from表⽰Cursor对象中的字段,⽽SimpleAdapter类构造⽅法的第四个参数from表⽰Map对象中的key.这个实例主要是查询通讯录,实现联系⼈拨号实例:1.java代码:1package com.example.simplecursoradapter;23import android.app.Activity;4import android.content.Intent;5import android.database.Cursor;6import android.database.CursorWrapper;7import android.graphics.Color;8import .Uri;9import android.os.Bundle;10import android.provider.Contacts.People;11import android.telephony.PhoneNumberUtils;12import android.util.Log;13import android.view.View;14import android.widget.AdapterView;15import android.widget.LinearLayout;16import android.widget.ListAdapter;17import android.widget.ListView;18import android.widget.SimpleCursorAdapter;192021public class MainActivity extends Activity {22private static final String TAG = "MainActivity";23 ListView listView;24 ListAdapter adapter;2526 @Override27public void onCreate(Bundle savedInstanceState) {28super.onCreate(savedInstanceState);2930 LinearLayout linearLayout = new LinearLayout(this);31 linearLayout.setOrientation(LinearLayout.VERTICAL);3233 youtParams param = new youtParams(34 youtParams.FILL_PARENT,35 youtParams.WRAP_CONTENT);3637 listView = new ListView(this);38 linearLayout.addView(listView, param);39this.setContentView(linearLayout);4041// 从数据库获取联系⼈姓名和电话号码42 Cursor cur = this.getContentResolver().query(People.CONTENT_URI, null,43null, null, null);44 adapter = new SimpleCursorAdapter(this,45 yout.simple_list_item_2, cur, new String[] {46 , People.NUMBER }, new int[] {47 android.R.id.text1, android.R.id.text2 });48this.startManagingCursor(cur);49 listView.setAdapter(adapter);5051 listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {5253public void onItemClick(AdapterView<?> arg0, View arg1,54int position, long arg3) {5556// names=((CursorWrapper)listView.getItemAtPosition(position)).getColumnNames();57// 从指针的封装类中获得选中项的电话号码并拨号58 CursorWrapper wrapper = (CursorWrapper) listView59 .getItemAtPosition(position);60int columnIndex = wrapper.getColumnIndex(People.NUMBER);61if (!wrapper.isNull(columnIndex)) {62 String number = wrapper.getString(columnIndex);63 Log.d(TAG, "number=" + number);64// 判断电话号码的有效性65if (PhoneNumberUtils.isGlobalPhoneNumber(number)) {66 Intent intent = new Intent(Intent.ACTION_DIAL, Uri67 .parse("tel://" + number));68 startActivity(intent);69 }70 }71 }72 });73 }74 }记得添加权限:<!-- 点击拨号时,询问调⽤默认的程序还是调⽤本程序拨号 --><intent-filter><action android:name="android.Intent.Action.CALL_BUTTON" /><category android:name="android.Intent.Category.DEFAULT" /></intent-filter><uses-permission android:name="android.permission.READ_CONTACTS" />。
wpf listview用法
wpf listview用法如何使用WPF ListView 组件。
在WPF 开发中,ListView 组件是非常常用的控件之一。
它允许我们以列表的形式展示数据,并且可以对数据进行排序、过滤等操作。
本文将一步一步回答如何使用WPF ListView 组件。
第一步:引入命名空间和创建UI要使用WPF ListView 组件,我们首先需要在XAML 文件中引入相应的命名空间。
通常我们需要引入的命名空间是`System.Windows.Controls`。
在引入命名空间后,我们就可以在XAML 文件中使用ListView 组件了。
在XAML 文件中创建ListView 组件的方法很简单,我们可以像下面这样创建一个简单的ListView:xml<ListView x:Name="listView"/>在这个例子中,我们创建了一个名为`listView` 的ListView 组件。
接下来我们可以在代码中操作这个listView 对象。
第二步:绑定数据源要在ListView 组件中展示数据,我们需要先绑定一个数据源。
这个数据源可以是一个集合(例如List 或ObservableCollection)或者是一个DataView。
首先,我们需要在代码中创建一个数据集合。
假设我们有一个名为`data` 的List 对象,我们可以在代码中通过以下方式为ListView 绑定数据源:csharplistView.ItemsSource = data;在这个例子中,我们为listView 的`ItemsSource` 属性设置了一个数据源,即`data` 对象。
第三步:定义数据模板一旦我们设置了数据源,我们还需要定义一个数据模板来告诉ListView 如何展示每个数据项。
数据模板可以用来定义数据项的外观、布局和交互行为。
在XAML 文件中,我们可以像下面这样定义一个简单的数据模板:xml<ListView x:Name="listView"><ListView.ItemTemplate><DataTemplate><TextBlock Text="{Binding}" /></DataTemplate></ListView.ItemTemplate></ListView>在这个例子中,我们使用一个TextBlock 控件来展示每个数据项的内容。
ArrayAdapter ,SimpleAdapter ,SimpleCursorAdapter 区别
map.put("BigText", "Android");
map.put("LittleText", "Google phone.");
return list;
}
}
//==============================SimpleCursorAdapter===================
注意:SimpleCursorAdapter是和数据库有关的东西,而sqlite数据库所要求的 自动增长的 id 必须是 _id这中形式
"Aragon", "Ardi Gasna", "Ardrahan", "Armenian
"Asadero", "Asiago", "Aubisque Pyrenees", "Autun",
"Babybel", "Baguette Laonnaise", "Bakers", "Bal"};
listView=new ListVeiw(this);
listView.setAdapter(new ArrayAdapter<String>(this,
yout.simple_list_item_1, mStrings));
super.onCreate(savedInstanceState);
arrayadapter用法
ArrayAdapter用法简介ArrayAdapter是Android中常用的适配器类之一,用于将数据源与ListView或Spinner等控件进行关联,实现数据的展示。
本文将详细介绍ArrayAdapter的用法,包括创建适配器、设置数据源、自定义列表项布局、添加点击事件等方面。
创建ArrayAdapter要创建一个ArrayAdapter对象,需要提供上下文、列表项布局和数据源。
构造函数的参数如下:ArrayAdapter(Context context, int resource, List<T> objects)•context:上下文,一般为当前的Activity•resource:列表项布局,可以使用系统预定义的布局,如yout.simple_list_item_1,也可以自定义布局文件•objects:数据源,通常为一个List对象,T为数据类型以下是创建一个ArrayAdapter对象的示例代码:List<String> dataList = new ArrayList<>();dataList.add("Apple");dataList.add("Banana");dataList.add("Orange");ArrayAdapter<String> adapter = new ArrayAdapter<>(this, yout.simple_list_item_1, dataList);设置数据源创建适配器后,需要将其与ListView或Spinner等控件关联起来,并设置数据源。
使用setAdapter()方法可将适配器与控件进行关联。
ListView listView = findViewById(R.id.listView);listView.setAdapter(adapter);自定义列表项布局如果想自定义列表项的布局,可以通过创建自定义的布局文件,并在适配器的构造函数中传入布局资源的ID。
Android中Adapter之SimpleCursorAdapter使用
Android中Adapter之SimpleCursorAdapter使用此Adapter(SimpleCursorAdapter)是Android专门为了连接数据库与视图而产生的.此例中借助ListView体现SimpleCursorAdapter的用法。
因为,ListView在android中是比较常用的视图组件,不论是静态还是动态都可以在其上显示。
当然,在实际的android项目中需要显示的数据一般都是动态从数据库表中获取的。
而SimpleCursorAdapter就是将从数据库表中获取的数据显示到ListView的桥梁。
在做的时候,可以将SimpleCursorAdapter与前面的SimpleCursorAdapter进行对比一下,你会发现二者的使用非常相似:1.在new xxxAdapter时候, 如下 ,红色字体,SimpleCursorAdapter adapter = new SimpleCursorAdapter( this,yout.simple_expandable_list_item_1,cursor,new String[]{},new int[]{android.R.id.text1});SimpleAdapter adapter = new SimpleAdapter(this,allInfos ,yout.simple_adapter_view,new String[]{"img","name","phone","region"},newint[]{_img,_name,_phone,_regio n})红色字体部分,即二者的数据源类型不同,SimpleCursorAdapter 的数据源是一个从数据库表中查询出来的数据集合cursor;而SimpleAdapter的数据源allInfos 是list集合(当然也可以是数组等),可以看到一个是动态一个是静态的数据。
第十一章 SQL视图、VFP8.0的CursorAdapter
第十一章 SQL视图、VFP8.0的CursorAdapter和客户/服务器编程11.1 客户/服务器结构(Client/Server) (1)11.2 创建和使用视图(SQL View) (2)11.3 更新视图的数据 (11)11.4 集成视图(Combining View) (13)11.5 使用视图和 SQL传递进行C/S模式编程 (14)11.6 VFP8.0的CursorAdapter与C/S模式编程 (17)如果用户想为自己的应用程序提供一个定制的更新的数据集,可以使用视图(SQL View,下面简称视图)。
视图结合了表(Tables)和查询(Queries)两者的特性:象一个查询,用户可以使用视图从一个或多个相关的表中提取一个数据集;象一个表,用户又能运用视图去更新View中的信息,并且永久地存贮结果到磁盘(而查询产生的临时表CURSOR只能读,既不能编辑,又不能存贮到磁盘)。
本章主要讲述如何建立、使用和更新视图,以及设置属性去优化视图的性能。
在xBASE 中也有一个视图,但它是一种为重新使用而存贮数据环境的方法。
本章的视图不同,是SQL 视图。
本章还介绍了客户/服务器(Client/Server)编程(特别是VFP8.0中用ADO的CursorAdapter等进行C/S模式编程)、Oracle升迁向导等。
11.1 客户/服务器结构(Client/Server)在讲述视图前,先讨论与远程视图等密切相关的客户/服务器结构。
客户/服务器(Client/Server)结构中的数据库服务器与Novell网中的文件服务器不同,如图11-1所示,它在前端(客户机)和后端(服务器)均有自己的数据库管理系统,它的主要概念是“简单的劳动分工”,即专业化:让服务器代替每个需要处理数据库任务的工作站以最佳状态来完成那些任务(存贮和管理数据),而把客户机设计成提出请求,可以用有效的、美观的格式返回并显示数据。
Adapter基础讲解
Adapter基础讲解这一节我们要讲的UI控件都是跟(Ad)ap(te)r(适配器)打交道的,了解并学会使用Adapter很重要,Adapter是用来帮助填充数据的中间桥梁,简单来说就是:将各种数据以合适的形式显示到view 上,提供给用户看!1.MVC模式的简单理解在开始学习Adapter之前我们要来了解下这个MVC模式概念。
举个例子:大型的商业程序通常由多人一同开发完成,比如有人负责操作接口的规划与设计,有人负责(程序代码)的编写,如果要能够做到程序项目的分工就必须在程序的结构上做合适的安排。
如果接口设计与修改都涉及到程序代码的改变的话,那么两者的分工就会造成执行上的困难,良好的程序架构师将整个程序项目划分为如图的三个部分:Model:通常可以理解为数据,负责执行程序的核心运算与判断逻辑,,通过view获得用户输入的数据,然后根据从数据库查询相关的信息,最后进行运算和判断,再将得到的结果交给view来显示view:用户的操作接口,说白了就是GUI,应该使用哪种接口组件,组件间的排列位置与顺序都需要设计Controller:控制器,作为model与view之间的枢纽,负责控制程序的执行流程以及对象之间的一个互动Adapter则是中间的这个Controller的部分:Model(数据) --->Controller(以什么方式显示到)--->View(用户界面) 这就是简单MVC组件的简单理解!2.Adapter概念解析首先我们来看看他的继承结构图:上面就是Adapter以及继承结构图了,接着我们介绍一下实际开发中还用到的几个Adapter吧!BaseAdapter:抽象类,实际开发中我们会继承这个类并且重写相关方法,用得最多的一个Adapter!ArrayAdapter:支持泛型操作,最简单的一个Adapter,只能展现一行文字~SimpleAdapter:同样具有良好扩展性的一个Adapter,可以自定义多种效果!SimpleCu(rs)orAdapter:用于显示简单文本类型的listView,一般在数据库那里会用到,不过有点过时,不(推荐)使用!3.代码示例:好的,多说无益,写代码最实际,接下来我们来用写几个简单的Adapter实例,帮助我们了解Adapter给我们带来的便利,另外,因为Adapter需要结合ListView,Gri(dVi)ew等等控件讲解,一些高级一点的用法我们都放在ListView那里讲!1)ArrayAdapter使用示例:运行效果图:代码实现:public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(yout.activity_main); //要显示的数据String[] strs = {"基神","B神","翔神","曹神","J神"}; //创建ArrayAdapter ArrayAdapter adapter = new ArrayAdapter (this,(android)yout.simple_expandable_list_item_1,strs); //获取ListView对象,通过调用setAdapter方法为ListView设置Adapter 设置适配器ListView list_test = (ListView) findViewById(R.id.list_test);list_test.setAdapter(adapter); }}一些相关的东西:1.除了通过数组外,我们还可以写到一个数组资源文件中:比如:在resvaluse下创建一个数组资源的xml文件:arrays.xml:语文数学英语接着布局的listview属性设置下这个列表项:就可以了~当然我们也可以在(Java)代码中这样写:ArrayAdapter adapter = ArrayAdapter.createF(rom)Resource(this, R.array.myarray,yout.simple_list_item_multiple_choice );同样也是可以的!2.一开始也说了这个ArrayAdapter支持泛型,那么集合必不可少啦,比如,这样写:List data = new ArrayList();data.add("基神");data.add("B神");ArrayAdapter adapter = new ArrayAdapter (this,yout.simple_expandable_list_item_1,data);就可以了~3.我们看到了在实例化ArrayAdapter的第二个参数:yout.simple_expandable_list_item_1其实这些是系统给我们提供好的一些ListView模板。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
package com.chinamobile.icontact.im.message;import java.util.Date;import java.util.HashMap;import java.util.Map;import android.content.Context;import android.database.Cursor;import android.graphics.Color;import android.text.Spannable;import android.text.style.ForegroundColorSpan;import youtInflater;import android.view.View;import android.view.ViewGroup;import android.widget.AbsListView;import android.widget.CursorAdapter;import android.widget.LinearLayout;import android.widget.TextView;import com.chinamobile.icontact.im.UI.Activity.R;import com.chinamobile.icontact.im.database.SmsDatabaseManager;import com.chinamobile.icontact.im.message.SmsSearchWordAdapter.ViewHolder; import com.chinamobile.icontact.im.utility.LogCat;public class SmsSearchCursorAdapter extends CursorAdapter implements AbsListView.RecyclerListener {private static final String TAG = SmsSearchCursorAdapter.class.getSimpleName();private Context mContext;private String constraint;private int smsCount = 0;private LayoutInflater mInflater;private Map<String, String> contactMap;private SmsDatabaseManager smsDBManager;private Map<Integer, Integer> itemBackgroudColorMap;private int color = Color.rgb(255, 165, 0);class ViewHolder {LinearLayout lineLayout;TextView smsComeFrom;TextView content;TextView time;}ViewHolder holder = null;public SmsSearchCursorAdapter(Context context, Cursor c) {super(context, c, false);mContext = context;smsDBManager = SmsDatabaseManager.getInstance(mContext);contactMap = smsDBManager.getContactsNameMap();this.mInflater = LayoutInflater.from(context);System.out.println("=========SmsSearchCursorAdapter========"); }public void setConstraint(String constraint, int smsCount) {System.out.println("---------------setConstraint---");this.smsCount = smsCount;this.constraint = constraint;getItemColorMap(this.smsCount);}@Overridepublic View newView(Context context, Cursor cursor, ViewGroup parent) { // TODO Auto-generated method stubSystem.out.println("---------------newView---");View convertView = null;holder = new ViewHolder();convertView = View.inflate(mContext,yout.sms_searchword_list_item, null);holder.lineLayout = (LinearLayout) convertView.findViewById(R.id.sms_search);holder.smsComeFrom = (TextView) convertView.findViewById(R.id.sms_from_number);holder.time = (TextView) convertView.findViewById(R.id.sms_time);holder.content = (TextView) convertView.findViewById(R.id.sms_content);return convertView;}@Overridepublic void bindView(View convertView, Context context, Cursor cursor) { System.out.println("---------------bindView---");int position = cursor.getPosition();MessageDataObject mdo = new MessageDataObject();String number = cursor.getString(cursor.getColumnIndexOrThrow(SmsDatabaseManager.address));String content = cursor.getString(cursor.getColumnIndexOrThrow(SmsDatabaseManager.body));Date time = new Date(cursor.getLong(cursor.getColumnIndexOrThrow(SmsDatabaseManager.date)));mdo.set_msg_from_number(number);mdo.set_msg_body(content);mdo.set_msg_time(time);initControls(mdo);setItemBackgroudColor(position);}@Overridepublic void onMovedToScrapHeap(View view) {System.out.println("---------------onMovedToScrapHeap---");}private void initControls(MessageDataObject mdo) {int indexOfBody_Up = 0;int indexOfBody_Down = 0;String contactName = null;String number = mdo.get_msg_from_number();if (number != null) {contactName = contactMap.get(smsDBManager.numberFilter(number));}if (contactName != null) {holder.smsComeFrom.setText("来自:" + contactName);} else {holder.smsComeFrom.setText("来自:" + number);}holder.time.setText(MessageUtils.getFormatDate(mdo.get_msg_time()));String body = mdo.get_msg_body();if (body != null) {indexOfBody_Up = body.indexOf(constraint.toUpperCase());indexOfBody_Down = body.indexOf(constraint.toLowerCase());}if (indexOfBody_Up != -1) {lightOfBody(holder, body, indexOfBody_Up);}if (indexOfBody_Down != -1) {lightOfBody(holder, body, indexOfBody_Down);}}private void lightOfBody(ViewHolder holder, String body, int indexOfBody) { Spannable spannableString = FacesUitlity.matchFace(body);spannableString.setSpan(new ForegroundColorSpan(color), indexOfBody, indexOfBody + constraint.length(),Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);holder.content.setText(spannableString);}private void setItemBackgroudColor(int position) {int setColor = 0;if (position % 2 == 0) {setColor = itemBackgroudColorMap.get(0);} else {setColor = itemBackgroudColorMap.get(1);}holder.lineLayout.setBackgroundColor(setColor);}private void getItemColorMap(int smsCount) {itemBackgroudColorMap = new HashMap<Integer, Integer>();itemBackgroudColorMap.put(1, Color.argb(255, 245, 245, 245));itemBackgroudColorMap.put(0, Color.WHITE);}}。