Android中的Adapter 详解(五)

ArrayAdapter和SimpleCursorAdapter例子:

使用ArrayAdapter定制To-Do List

这个例子将扩展To-Do List工程,以一个ToDoItem对象来储存每一个项目,包含每个项目的创建日期。

你将扩展ArrayAdapter类来绑定一组ToDoItem对象到ListView上,并定制用于显示每一个ListView项目的layout。

1. 返回到To-Do List工程。创建一个新的ToDoItem类来保存任务和任务的创建日期。重写toString方法来返回一个项目数据的概要。

import java.text.SimpleDateFormat; 
import java.util.Date; 
public class ToDoItem { 
String task; Date created; 
public String getTask() { 
return task; 
} 
public Date getCreated() { 
return created; 
} 
public ToDoItem(String _task) { 
this(_task, new Date(java.lang.System.currentTimeMillis()));
}
 public ToDoItem(String _task, Date _created) { task = _task; created = _created; 
} 
@Override 
public String toString() { 
SimpleDateFormat sdf = new SimpleDateFormat(“dd/MM/yy”); 
String dateString = sdf.format(created); 
return “(“ + dateString + “) “ + task; 
} 
} 


2. 打开ToDoList Activity,修改ArrayList和ArrayAdapter变量的类型,储存ToDoItem对象而不是字符串。然后,你将修改onCreate方法来更新相应的变量初始化。你还需要更新onKeyListener处理函数来支持ToDoItem对象。

private ArrayList<ToDoItem> todoItems;  
private ListView myListView;   
private EditText myEditText;   
private ArrayAdapter<ToDoItem> aa;   
  @Override
public void onCreate(Bundle icicle) {  
 super.onCreate(icicle); // Inflate your view setContentView(R.layout.main); //    
 Get references to UI widgets myListView = (ListView)findViewById(R.id.myListView);  
   myEditText = (EditText)findViewById(R.id.myEditText);   
   todoItems = new ArrayList<ToDoItem>();   
   int resID = R.layout.todolist_item; aa = new ArrayAdapter<ToDoItem>(this, resID, todoItems);   
    myListView.setAdapter(aa);  
 myEditText.setOnKeyListener(new OnKeyListener() {   
public boolean onKey(View v, int keyCode, KeyEvent event) {  
 if (event.getAction() == KeyEvent.ACTION_DOWN)  
   if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER) {   
   ToDoItem newItem; newItem = new ToDoItem(myEditText.getText().toString()); todoItems.add(0, newItem);  
    myEditText.setText(“”);   
    aa.notifyDataSetChanged(); cancelAdd(); return true;   
      }   
    return false;   
    }  
  });  
 registerForContextMenu(myListView);   
}   


 

3. 如果你运行Activity,它将显示每个to-do项目,如图5-3所示。

 

图5-3

 

4. 现在,你可以创建一个自定义的layout来显示每一个to-do项目。修改在第4章中创建的自定义layout,包含另外一个TextView,它将用于显示每个to-do项目的创建日期。

import java.text.SimpleDateFormat;  

import android.content.Context;  

import java.util.*;   

import android.view.*;  

 import android.widget.*;   

public class ToDoItemAdapter extends ArrayAdapter<ToDoItem> { int resource; public ToDoItemAdapter(Context _context,int _resource, List<ToDoItem> _items) {   

super(_context, _resource, _items); resource = _resource;  

 }   

 @Override public View getView(int position, View convertView,  ViewGroup parent) {   

  LinearLayout todoView; ToDoItem item = getItem(position);   

  String taskString = item.getTask();   

  Date createdDate = item.getCreated();   

  SimpleDateFormat sdf = new SimpleDateFormat(“dd/MM/yy”);   

  String dateString = sdf.format(createdDate); if (convertView == null) { todoView = new LinearLayout(getContext());   

  String inflater = Context.LAYOUT_INFLATER_SERVICE;   

  LayoutInflater vi; vi = (LayoutInflater)getContext().getSystemService(inflater); vi.inflate(resource, todoView, true);   

}   

else {  

 todoView = (LinearLayout) convertView;   

}   

  TextView dateView = (TextView)todoView.findViewById (R.id.rowDate);   

 TextView taskView = (TextView)todoView.findViewById(R.id.row);      dateView.setText(dateString);  

    taskView.setText(taskString);  

    return todoView;   

  }   

} 


 

5. 创建一个新的类(ToDoItemAdapter),使用指定的ToDoItem变量来扩展一个ArrayAdapter。重写getView方法来将ToDoItem对象中的task和date属性指定给第4步创建的layout中的View。

import java.text.SimpleDateFormat;  

import android.content.Context;  

import java.util.*;   

import android.view.*;  

 import android.widget.*;   

public class ToDoItemAdapter extends ArrayAdapter<ToDoItem> { int resource; public ToDoItemAdapter(Context _context,int _resource, List<ToDoItem> _items) {   

super(_context, _resource, _items); resource = _resource;  

 }   

 @Override public View getView(int position, View convertView,  ViewGroup parent) {   

  LinearLayout todoView; ToDoItem item = getItem(position);   

  String taskString = item.getTask();   

  Date createdDate = item.getCreated();   

  SimpleDateFormat sdf = new SimpleDateFormat(“dd/MM/yy”);   

  String dateString = sdf.format(createdDate); if (convertView == null) { todoView = new LinearLayout(getContext());   

  String inflater = Context.LAYOUT_INFLATER_SERVICE;   

  LayoutInflater vi; vi = (LayoutInflater)getContext().getSystemService(inflater); vi.inflate(resource, todoView, true);   

}   

else {  

 todoView = (LinearLayout) convertView;   

}   

  TextView dateView = (TextView)todoView.findViewById (R.id.rowDate);   

 TextView taskView = (TextView)todoView.findViewById(R.id.row);      dateView.setText(dateString);  

    taskView.setText(taskString);  

    return todoView;   

  }   

} 


 

6. 最后,用ToDoItemAdapter替换ArrayAdapter的定义。

 

private ToDoItemAdapter aa;

 

在onCreate中,使用new ToDoItemAdapter来替换ArrayAdapter<String>的实例化。

 

aa = new ToDoItemAdapter(this, resID, todoItems);

 

7. 如果你运行Activity,它看起来如图5-4的截图。

 


 

 

图5-4

 

使用SimpleCursorAdapter

 

SimpleCursorAdapter允许你绑定一个游标的列到ListView上,并使用自定义的layout显示每个项目。

 

SimpleCursorAdapter的创建,需要传入当前的上下文、一个layout资源,一个游标和两个数组:一个包含使用的列的名字,另一个(相同大小)数组包含View中的资源ID,用于显示相应列的数据值。

 

下面的框架代码显示了如何构造一个SimpleCursorAdapter来显示联系人信息:

String uriString = “content://contacts/people/”;   
Cursor myCursor = managedQuery(Uri.parse(uriString), null, null, null, null);   
String[] fromColumns = new String[] {  
    People.NUMBER,   
    eople.NAME  
};  
 int[] toLayoutIDs = new int[] {   
     R.id.nameTextView,  
     R.id.numberTextView  
};   
  
SimpleCursorAdapter myAdapter; myAdapter = new SimpleCursorAdapter(this,R.layout.simplecursorlayout,myCursor,fromColumns,toLayoutIDs)


 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值