当前位置: 代码迷 >> 综合 >> ListView——ArrayAdapter
  详细解决方案

ListView——ArrayAdapter

热度:60   发布时间:2024-01-06 02:39:07.0
一:分别继承于Activity,ListActivity,ListView使用    
1)继承于Activity写法
Java代码  
public class ListView_ArrayAdapterActivity extends Activity {    
     
  private ListView listView;    
  private ArrayList<String> list=new ArrayList<String>();      
  public void onCreate(Bundle savedInstanceState) {    
      super.onCreate(savedInstanceState);    
      setContentView(R.layout.main);    
      listView = (ListView) findViewById(R.id.listView);    
      ArrayAdapter<String> adapter=new ArrayAdapter<String>(this,android.R.layout.simple_expandable_list_item_1,getListData());      
      listView.setAdapter(adapter);    
  }    
     
  public List<String> getListData(){    
      list.add("Item 1");    
      list.add("Item 2");    
      list.add("Item 3");    
      list.add("Item 4");    
      list.add("Item 5");    
      return list;    
  }    
 
}  


下面这个程序是简单的使用ArrayAdapter来进行ListView和ArrayList的绑定
public class TodoListActivity extends Activity {
 
  @Override
  public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.main);
      ListView myListView=(ListView)findViewById(R.id.myListView);
      final EditText myEditView=(EditText)findViewById(R.id.myEditText);
      final ArrayList<String> todoItems=new ArrayList<String>();
      final ArrayAdapter<String> aa;
      aa=new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,todoItems);
        myListView.setAdapter(aa);
       
      myEditView.setOnKeyListener(new OnKeyListener() {
public boolean onKey(View v, int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
if(event.getAction()==KeyEvent.ACTION_DOWN)
if(keyCode==KeyEvent.KEYCODE_DPAD_CENTER)
{
todoItems.add(0,myEditView.getText().toString());
aa.notifyDataSetChanged();
myEditView.setText("");
return true;
}

return false;
}
});
       
  }
}

自己定制ToDoItem来的代替String的程序如下:
默认情况下,ArrayAdapter把每个对象(如下面的 ToDoItem)的toString值绑定到一个ListView的一项(它的每一项都是一个TextView)中。
public class TodoListActivity extends Activity {
 
  @Override
  public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.main);
      ListView myListView=(ListView)findViewById(R.id.myListView);
      final EditText myEditView=(EditText)findViewById(R.id.myEditText);
      final ArrayList< ToDoItem> todoItems=new ArrayList< ToDoItem>();
      final ArrayAdapter< ToDoItem> aa;
      aa=new ArrayAdapter< ToDoItem>(this, android.R.layout.simple_list_item_1,todoItems);
      myListView.setAdapter(aa);
       
      myEditView.setOnKeyListener(new OnKeyListener() {
public boolean onKey(View v, int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
if(event.getAction()==KeyEvent.ACTION_DOWN)
if(keyCode==KeyEvent.KEYCODE_DPAD_CENTER)
{
todoItems.add(0,new ToDoItem(myEditView.getText().toString()));
aa.notifyDataSetChanged();
myEditView.setText("");
return true;
}

return false;
}
});
       
  }
}



package cn.todolist.rxm;

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) {
// TODO Auto-generated constructor stub
task=_task;
created=_created;
}
public String toString()
{
SimpleDateFormat sdf=new SimpleDateFormat("dd/MM/yy");
String dateString=sdf.format(created);
return "("+dateString+")"+task;
}
}












  2)继承于ListActivity写法    
Java代码  
public class ListView_ArrayAdapterActivity extends ListActivity {    
     
  private ArrayList<String> list=new ArrayList<String>();      
     
  public void onCreate(Bundle savedInstanceState) {    
      super.onCreate(savedInstanceState);    
      setContentView(R.layout.main);    
      ArrayAdapter<String> adapter=new ArrayAdapter<String>(this,android.R.layout.simple_expandable_list_item_1,getListData());      
      setListAdapter(adapter);    
  }    
     
  public List<String> getListData(){    
      list.add("Item 1");    
      list.add("Item 2");    
      list.add("Item 3");    
      list.add("Item 4");    
      list.add("Item 5");    
      return list;    
  }    
 
}  
对比很容易发现,前者(extends Activity)需要在xml布局中找到ListView控件,后者则不需要,但是后者xml布局中ListView标签id固定.最后关于布局文件,前者(extends Activity)xml布局中,ListView标签id可以任意取值,而后者(extends ListActivity)ListView标签中id写法固定android:id="@+id/android:list"二:以ArrayAdapter为例,自定义ListItem样式系统样式:android.R.layout.simple_expandable_list_item_1
Java代码  
ArrayAdapter<String> adapter=new ArrayAdapter<String>(this,android.R.layout.simple_expandable_list_item_1,getListData());    
自定义样式R.layout.my_simple_list_item_1
Java代码  
ArrayAdapter<String> adapter=new ArrayAdapter<String>(this,R.layout.my_simple_list_item_1,getListData());    
my_simple_list_item_1.xml:
Java代码  
<?xml version="1.0" encoding="utf-8"?>    
<TextView xmlns:android="http://schemas.android.com/apk/res/android"  
  android:id="@+id/tv"  
  android:layout_width="fill_parent"  
  android:layout_height="fill_parent"  
  android:textColor="#0000FF"  
  android:textSize="12pt"  
/>  
请留意这种布局,根布局为控件TextView.三:自定义ArrayAdapterListView_ArrayAdapterActivity .java
Java代码  
public class ListView_ArrayAdapterActivity extends Activity {    
     
  private ListView listView;    
     
  public void onCreate(Bundle savedInstanceState) {    
      super.onCreate(savedInstanceState);    
         
      setContentView(R.layout.main);    
      listView = (ListView) findViewById(R.id.listView);    
         
      IconListAdapter adapter = new IconListAdapter(this,getListData());    
      listView.setAdapter(adapter);    
  }    
     
  //初始化数据  
  private List<IconListItem> getListData(){    
      List<IconListItem> listItems = new ArrayList<IconListItem>();    
      IconListItem item1 = new IconListItem("Item 1   ",R.drawable.icon );    
      IconListItem item2 = new IconListItem("Item 2   ",R.drawable.icon );    
      IconListItem item3 = new IconListItem("Item 3   ",R.drawable.icon );    
      IconListItem item4 = new IconListItem("Item 4   ",R.drawable.icon );    
      listItems.add(item1);    
      listItems.add(item2);    
      listItems.add(item3);    
      listItems.add(item4);    
      return listItems;    
  }    
     
     
  class IconListAdapter extends ArrayAdapter<IconListItem> {    
             
      protected LayoutInflater mInflater;    
      private static final int mLayout = R.layout.custom_layout1;    
         
      public IconListAdapter(Context context,List<IconListItem> items) {    
             
          super(context,mLayout, items);//上下文环境/布局文件/填充布局文件数据  
          mInflater = LayoutInflater.from(ListView_ArrayAdapterActivity.this);    
      }    
 
      public View getView(int position, View convertView, ViewGroup parent) {    
             
          TextView textView;    
          ImageView imageView;    
 
          View view;    
          if (convertView == null) {    
              view = mInflater.inflate(mLayout,null);    
          } else {    
              view = convertView;    
          }    
 
          textView = (TextView) view.findViewById(R.id.text1);    
          textView.setText(getItem(position).getTitle());    
 
          imageView = (ImageView) view.findViewById(R.id.icon);    
          imageView.setImageResource(getItem(position).getResource());    
 
          return view;    
      }    
  }    
}  
IconListItem.java
Java代码  
public class IconListItem {    
     
  //每条显示的构造方法  
  private final String mTitle;    
  private final int mResource;    
 
  public IconListItem(String title, int resource) {    
      mResource = resource;    
      mTitle = title;    
  }    
 
  public String getTitle() {    
      return mTitle;    
  }    
 
  public int getResource() {    
      return mResource;    
  }    
}  
main.xml
Java代码  
<?xml version="1.0" encoding="utf-8"?>    
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  android:orientation="vertical"  
  android:layout_width="fill_parent"  
  android:layout_height="fill_parent"  
  >    
<ListView    
  android:id="@+id/listView"      
  android:layout_width="fill_parent"    
  android:layout_height="wrap_content"    
  />    
</LinearLayout>  
custom_layout1.xml
Java代码  
<?xml version="1.0" encoding="utf-8"?>    
<RelativeLayout    
  xmlns:android="http://schemas.android.com/apk/res/android"  
  android:orientation="horizontal"  
  android:layout_width="fill_parent"  
  android:layout_height="fill_parent"  
  >    
<TextView    
  android:id="@+id/text1"  
  android:layout_width="wrap_content"  
  android:layout_height="wrap_content"  
  android:layout_alignParentRight="true"  
  android:layout_centerVertical="true"  
/>    
 
<ImageView    
  android:id="@+id/icon"  
  android:layout_width="wrap_content"  
  android:layout_height="wrap_content"  
  android:layout_alignParentLeft="true"  
/>    
</RelativeLayout>  

引用
给大家列出本类所有成员方法实用的处理方式:void   add(T object)   //添加一个对象到本ArrayAdaptervoid   clear()   //清除所有元素static ArrayAdapter<CharSequence>   createFromResource(Context context, int textArrayResId, int textViewResId)   //从layout资源构造arrayadapterContext   getContext()   //获取实例int   getCount()View   getDropDownView(int position, View convertView, ViewGroup parent)   //获取drop down的popup风格选择条目的内容,参数1是位置,参数2可以通过强制转换直接获取本条的内容Filter   getFilter() //使用正则过滤数据T   getItem(int position)   //获取单条内容long   getItemId(int position) int   getPosition(T item) //通过内容获取是某条View   getView(int position, View convertView, ViewGroup parent)void   insert(T object, int index)   //插入新条目到数组的index位置void   notifyDataSetChanged()   //通知数据变化了,告诉绑定Adapter的widget来更新UIvoid   remove(T object)   //移出一条从数组,这里并没有指定位置void   setDropDownViewResource(int resource)   //设置dropdown的layout风格Sets the layout resource to create the drop down views.void   setNotifyOnChange(boolean notifyOnChange)   //本条是arrayadapter最强大的功能,android123强烈推荐处理大数据时使用该方法,可以降低ui的处理量,刷新ui可以更快速,主要可以停止对(add(T), insert(T, int), remove(T), clear() 的操作,当然可以通过 notifyDataSetChanged(). 或 setNotifyOnChange(true) 通知变化void   sort(Comparator<? super T> comparator)   //这里是android开发网经常用的排序,使用arrayadapter可以直接排序,十分方便推荐大家什么情况使用arrayadapter,什么时候使用baseadapter。当数量较多,比如超过100条或频繁动态增减时使用arrayadapter可以方便控制ui,通过setNotifyOnChanage方法,如果比较简单仅仅呈现直接从 baseadapter更节省资源。
  相关解决方案