Android ArrayAdapter 詳解

本文主要講解ArrayAdapter的創建方法,我把ArrayAdapter分爲三種:簡單的、樣式豐富的但內容簡單的、內容豐富的。默認情況下,ArrayAdapter期望接受的樣式文件裏只含有一個textview,然後它把接受到的數據toString後(即調用數據對象的toString方法)展示在textview裏。

簡單的

這樣的列表的每一行都只有一行文字。

// 當然listview 也可以是在layout裏寫好,然後findViewById()獲取出來,這樣的話後面就不需setContentView(listview);      
ListView listview = new ListView(this);  
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_expandable_list_item_1);  
adapter.add("string1");  
adapter.add("haha");  
adapter.add("heihei");        
listview.setAdapter(adapter);  
setContentView(listview);    

上面代碼中,android.R.layout.simple_expandable_list_item_1android裏已提供的樣式,我們也可換成自己的xml。但是需要注意的是這個xml文件僅能有一個textview。連Layout也不能有。否則會報錯:ArrayAdapter requires the resource ID to be a TextView
layout下有online_user_list_item.xml,它的內容如下:

<TextView xmlns:android="http://schemas.android.com/apk/res/android"  
android:layout_width="wrap_content"   
android:layout_height="wrap_content"    
android:id="@+id/online_user_list_item_textview" >  
</TextView>  

android.R.layout.simple_expandable_list_item_1換成R.layout.online_user_list_item
如果我們想要使用更復雜一點的layout,而不僅是隻有一個textview,那就要用下面這種。

樣式豐富但內容簡單的。

layout下的online_user_list_item.xml內容如下:

<?xml version="1.0" encoding="utf-8"?>  
<LinearLayout  xmlns:android="http://schemas.android.com/apk/res/android"  
    android:layout_width="fill_parent"  
    android:layout_height="wrap_content">  
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content"  android:id="@+id/online_user_list_item_textview" android:text="TextView"></TextView>  
<Button  
    android:text="button"  
    android:layout_width="wrap_content"  
    android:layout_height="wrap_content">  
</Button>  
</LinearLayout>  

裏面含有的textview是我們想要展示內容的地方。那麼構建ArrayAdapter時,應該這樣寫:

ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.online_user_list_item, R.id.online_user_list_item_textview);  

如果我們需要展示的內容是一僅一個textview承載不了的,還需要其它組件,怎麼辦?我們可以自定義。

內容豐富的(自定義ArrayAdapter)。

這就需要寫一個類繼承自ArrayAdapter並且重寫getView方法。上代碼:

public class UserListAdapter extends ArrayAdapter<User> {  
    private int resourceId;  
    public UserListAdapter(Context context, int textViewResourceId, List<User> objects) {  
        super(context, textViewResourceId, objects);  
        this.resourceId = textViewResourceId;  
    }  

    @Override  
    public View getView(int position, View convertView, ViewGroup parent){  
        User user = getItem(position);  
        LinearLayout userListItem = new LinearLayout(getContext());  
        String inflater = Context.LAYOUT_INFLATER_SERVICE;   
        LayoutInflater vi = (LayoutInflater)getContext().getSystemService(inflater);   
        vi.inflate(resourceId, userListItem, true);  
        TextView tvUsername = (TextView)userListItem.findViewById(R.id.tv_user_list_username);  
        TextView tvAskedNum = (TextView)userListItem.findViewById(R.id.tv_user_list_askednum);  
        TextView tvLastMsg = (TextView)userListItem.findViewById(R.id.tv_user_list_lastmsg);  
        tvUsername.setText(user.getUsername());  
        tvAskedNum.setText(String.valueOf(user.getAskedNum()));  
        tvLastMsg.setText(user.getLastMsg());  
        return userListItem;  
    }  
}  

activity裏就這樣寫:

List<User> users = new ArrayList<User>();  
        User user = new User();  
        user.setAskedNum(8);  
        user.setLastMsg("hello");  
        user.setUsername("pxx");  
        users.add(user);  
        users.add(user);  
        users.add(user);  
        UserListAdapter adapter = new UserListAdapter(this,R.layout.online_user_list_item,users);  
        listview.setAdapter(adapter);  

轉自

  1. http://daimajishu.iteye.com/blog/1088680
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章