ArrayAdapter
1.從文檔中介紹來看ArrayAdapter原本就是用來幫助你顯示文本的,如果你想要顯示其它視圖比如:ImageView。就需要自己重寫getView()方法
2.如果是這樣,我覺得還不如使用SimpleAdapter或是BaseAdapter來得方便
3.構造方法中有四個參數
(1)context --- 包含有關應用環境的全局信息,允許我們訪問系統資源和服務,以及我們自己定義的特定資源
由於適配器需要了解每個列表項的佈局,因此需要引用我們自己定義的xml佈局
(2)id of list item layout --- 列表項的佈局
(3)id of text view --- 文本視圖的id
(4)list of data --- 數組列表(數據)
List<String> array = new ArrayList<String>();
for(int i=0; i<120; i++) {
array.add("Tom");
}
final Context context = this;
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.listitem, R.id.text, array){
@Override
public View getView(int position, View convertView, ViewGroup parent){
if(convertView == null){
LayoutInflater inflater = LayoutInflater.from(context);
convertView = inflater.inflate(R.layout.listitem, null);
}
TextView textView = (TextView)convertView.findViewById(R.id.text);
ImageView imageView = (ImageView)convertView.findViewById(R.id.image);
textView.setText("Tom");
imageView.setImageResource(R.mipmap.ic_launcher);
return convertView;
}
};
ListView listView = (ListView)findViewById(R.id.listView);
listView.setAdapter(adapter);
SimpleAdapter
1.數據源類型List<? extends Map<String, ?>>
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.listview);
ListView listView = (ListView)findViewById(R.id.listView);
SimpleAdapter simpleAdapter = new SimpleAdapter(this, getData(), R.layout.listitem,
new String[]{"image", "text"}, new int[]{R.id.image, R.id.text});
listView.setAdapter(simpleAdapter);
}
private List<Map<String, Object>> getData(){
List<Map<String, Object>> list = new ArrayList<>();
for(int i=0; i<120; i++) {
Map<String, Object> map = new HashMap<String, Object>();
map.put("image", R.mipmap.ic_launcher);
map.put("text", "Tom");
list.add(map);
}
return list;
}
BaseAdapter
1.該適配就比較靈活,因爲你可以重寫裏面的方法來實現自己的適配器
2.需要重寫的方法有:
(1)public Object getItem(int position)
(2)public int getCount()
(3)public long getItemId(int position)
(4)public View getView(int position, View convertView, ViewGroup)
在這裏文檔裏建議應該檢查convertView是否爲空,若爲空就應該從新創建一個新的視圖,若不爲空,直接複用即可
3.你可以通過構造方法將必要的參數傳進來
public class TestBaseAdapter extends BaseAdapter {
private List<String> list;
private Context context;
public TestBaseAdapter(List<String> list, Context context){
this.list = list;
this.context = context;
}
//在數據集中有多少個數據項
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return list.get(position);
}
//返回指定位置數據項的id
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
//如果爲null就創建一個新的視圖
if(convertView == null){
LayoutInflater inflater = LayoutInflater.from(context);
convertView = inflater.inflate(R.layout.listitem, null);
<span style="font-size:14px;"></span><pre name="code" class="java"> TextView textView = (TextView)convertView.findViewById(R.id.text);
ImageView imageView = (ImageView)convertView.findViewById(R.id.image);
textView.setText("Tom");
imageView.setImageResource(R.mipmap.ic_launcher);
} return convertView; }}
4.網上看見的一些人的整理
(1)第一種沒有任何處理BaseAdapter --- 因爲沒有複用機制,所以會浪費資源
(2)第二種使用了convertView進行復用 --- 就是我上面的寫的
(3)第三種就是通過一個靜態類保存視圖 --- 將視圖保存在緩存中,這樣就不用一直findViewById(),提高效率
@Override
public View getView(int position, View convertView, ViewGroup parent) {
TextView textView = null;
ImageView imageView = null;
//如果爲null就創建一個新的視圖
if(convertView == null){
LayoutInflater inflater = LayoutInflater.from(context);
convertView = inflater.inflate(R.layout.listitem, null);
textView = (TextView)convertView.findViewById(R.id.text);
imageView = (ImageView)convertView.findViewById(R.id.image);
ViewHolder viewHolder = new ViewHolder();
viewHolder.text = textView;
viewHolder.image = imageView;
convertView.setTag(viewHolder);
}else{
ViewHolder viewHolder = (ViewHolder)convertView.getTag();
textView = viewHolder.text;
imageView = viewHolder.image;
}
textView.setText("Tom");
imageView.setImageResource(R.mipmap.ic_launcher);
return convertView;
}
private final class ViewHolder
{
public ImageView image;
public TextView text;
}
listview.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="match_parent">
</ListView>
</LinearLayout>
listitem.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/image"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>