Adapter的使用

本文介绍了Android开发中的两种适配器:ArrayAdapter和SimpleCursorAdapter。ArrayAdapter用于将数据绑定到预定义的布局文件中,而SimpleCursorAdapter则用于将ContentProvider查询结果绑定到自定义布局。文中还详细展示了如何创建自定义适配器来展示复杂数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ArrayAdapter(字符串调用toString)

ArrayAdapter是一个绑定View到一组对象的通用类。默认情况下,ArrayAdapter绑定每个对象的toString值到在layout中预先定义的TextView控件上。 可变通的,构造函数允许你使用更加复杂的layout或者通过重写getView方法来扩展类从而使用TextView的替代物(如ImageView或嵌套的layout)。

SimpleCursorAdapter(游标)

SimpleCursorAdapter绑定View到Content Provider查询返回的游标上。指定一个XML layout定义,然后将数据集中的每一列的值绑定到layout中的一个View上。

Adapter进行数据绑定

//将数组中的字符串绑定到ListView中用于显示每个项目的简单TextView控件上


ArrayList < String > myStringArray = new ArrayList < String >();

ArrayAdapter < String > myAdapterInstance ;

//显示布局,可以系统自带,也可以自定义
int layoutID = android . R . layout . simple_list_item_1 ;

//参数context,布局,数据
myAdapterInstance
= new ArrayAdapter < String >( this , layoutID , myStringArray );

myListView
. setAdapter ( myAdapterInstance );

重写ArrayAdapter,显示多个元素

1.创建一个新的ToDoItem类来保存任务和任务的创建日期.

package
 com
.
paad
.
todolist
;


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.创建一个自定义的layout来显示每一个子项目

<!-- 定义两个TextView,一个显示名称,一个显示日期 -->

<? xml version =” 1.0 encoding =” utf - 8 ”?>

   
<RelativeLayout xmlns:android = ”http://schemas.android.com/apk/res/android”
   
android:layout_width = ”fill_parent”
   
android:layout_height = ”fill_parent”
   
android:background = ”@color/notepad_paper” >

   
<TextView
     
android:id = ”@+id/rowDate”
     
android:layout_width = ”wrap_content”
     
android:layout_height = ”fill_parent”
     
android:padding = ”10dp”
     
android:scrollbars = ”vertical”
     
android:fadingEdge = ”vertical”
     
android:textColor = ”@color/notepad_text”
     
android:layout_alignParentRight = ”true”
   
/>

   
<TextView
     
android:id = ”@+id/row”
     
android:layout_width = ”fill_parent”
     
android:layout_height = ”fill_parent”
     
android:padding = ”10dp”
     
android:scrollbars = ”vertical”
     
android:fadingEdge = ”vertical”
     
android:textColor = ”@color/notepad_text”
     
android:layout_alignParentLeft = ”@+id/rowDate”
   
/>
</RelativeLayout>

3.创建一个新的类(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 ;
     
}
}

4.在Activity中显示

    
private
 
ArrayList
<
ToDoItem
>
 todoItems
;

   
private ListView myListView ;
   
//自定义的Adapter
   
private ToDoItemAdapter < ToDoItem > aa ;

   
@Override

   
public void onCreate ( Bundle icicle ) {

       
super . onCreate ( icicle );
        setContentView
( R . layout . main );

        myListView
= ( ListView ) findViewById ( R . id . myListView );

        todoItems
= new ArrayList < ToDoItem >();
       
//上面定义的布局
       
int resID = R . layout . todolist_item ;

        aa
= new ToDoItemAdapter < ToDoItem >( this , resID , todoItems );

        myListView
. setAdapter ( aa );
   
}

使用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 , People . NAME };
//组件
int [] toLayoutIDs = new int [] { R . id . nameTextView , R . id . numberTextView };

SimpleCursorAdapter myAdapter ;

myAdapter
= new SimpleCursorAdapter ( this , R . layout . simplecursorlayout , myCursor , fromColumns , toLayoutIDs );

myListView
. setAdapter ( myAdapter );

XML文件中使用RecyclerView、ViewHolder和Adapter的步骤和Java代码类似,只需要在XML文件中定义RecyclerView、ViewHolder和Adapter即可。 ViewHolder的实现: ``` <?xml version="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="text" type="String" /> </data> <TextView android:id="@+id/text_view" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@{text}" /> </layout> ``` 在这个示例中,我们使用Android的Data Binding功能,定义了一个包含一个TextView的布局文件,并将TextView的文本绑定到一个字符串变量中。 Adapter的实现: ``` public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> { private List<String> mData; public MyAdapter(List<String> data) { mData = data; } @NonNull @Override public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { ViewDataBinding binding = DataBindingUtil.inflate( LayoutInflater.from(parent.getContext()), R.layout.item_view, parent, false ); return new MyViewHolder(binding); } @Override public void onBindViewHolder(@NonNull MyViewHolder holder, int position) { holder.bind(mData.get(position)); } @Override public int getItemCount() { return mData.size(); } public static class MyViewHolder extends RecyclerView.ViewHolder { private ViewDataBinding mBinding; public MyViewHolder(ViewDataBinding binding) { super(binding.getRoot()); mBinding = binding; } public void bind(String text) { mBinding.setVariable(BR.text, text); mBinding.executePendingBindings(); } } } ``` 在这个示例中,我们使用Android的Data Binding功能,定义了一个包含一个TextView的ViewHolder,并将ViewHolder的视图绑定到一个布局文件中。我们还创建了一个Adapter,它管理一个字符串列表,并将每个字符串绑定到ViewHolder中的TextView中。 最后,我们需要将Adapter设置到RecyclerView中: ``` <androidx.recyclerview.widget.RecyclerView android:id="@+id/recycler_view" android:layout_width="match_parent" android:layout_height="match_parent" app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" app:adapter="@{adapter}" /> ``` 在这个示例中,我们在XML文件中定义了一个RecyclerView,并将LayoutManager和Adapter设置到RecyclerView中,其中Adapter使用了Data Binding功能。 这样就可以显示一个简单的RecyclerView了。当我们滚动列表时,RecyclerView会自动回收不再需要的视图,并将它们重新用于新的列表项。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值