本文主要講解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_1
是android
裏已提供的樣式,我們也可換成自己的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);