ListView 中使用 BaseAdapter
然後 ListItem 放入 ImageView + TextView + Button 的練習
預計做完會長這樣 (誰叫我是DQ 迷)
首先這個例子的作法是將原本繼承的 Activity 改為繼承 ListActivity
這樣的話就不需要在畫面上再拉一個 ListView 了
然後再來是設計一下 ListView 裡面 item 的長相
所以新建了一個 XML 叫做 test.xml
如下 :
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/imageView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="6dp"
android:src="@drawable/arrow" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_marginLeft="5dp"
android:layout_toRightOf="@+id/imageView1"
android:orientation="vertical" >
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Medium Text"
android:textAppearance="?android:attr/textAppearanceMedium" />
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Small Text"
android:textAppearance="?android:attr/textAppearanceSmall" />
</LinearLayout>
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:focusable="false"
android:text="基本資料" />
</RelativeLayout>
切到 Layout 畫面長這樣
然後再來是程式碼
做法是自己做一個 MyAdapter 繼承 BaseAdapter 然後就可以針對內容 or 行為去客制了
繼承 BaseAdapter 後再覆寫 getCount()、getItem()、getItemId()、getView()
package com.myfirst.myapp;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.app.ListActivity;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
//這邊把原本繼承的 Activity 改為 ListActivity
//然後 implements ListView.OnItemClickListener,方便等下捕捉 ListView item 的 click
public class Basic extends ListActivity implements ListView.OnItemClickListener {
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
// 標題是DQ裡面史萊姆系的怪物名稱
private final String[] titleArr = new String[] {
"スライム",
"バブルスライム",
"ホイミスライム",
"スライムナイト",
"キングスライム",
"ドラゴスライム",
"ぶちスライム",
"スライムつむり",
"ボックススライム",
"スラッピー",
"ストーンスライム",
"メタルキング",
"はぐれメタル",
};
//副標題是怪物編號
private final String[] subTitleArr = new String[] {
"001",
"002",
"003",
"004",
"005",
"006",
"007",
"008",
"009",
"010",
"011",
"012",
"013"
};
//再來是網路找的怪物圖片
private final int[] imgArr = new int[] {
R.drawable.a001,
R.drawable.a002,
R.drawable.a003,
R.drawable.a004,
R.drawable.a005,
R.drawable.a006,
R.drawable.a007,
R.drawable.a008,
R.drawable.a009,
R.drawable.a010,
R.drawable.a011,
R.drawable.a012,
R.drawable.a013,
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
list = getData();
MyAdapter adapter = new MyAdapter(this);
setListAdapter(adapter);
}
//將需要的資料塞到 List 裡面
private List<Map<String,Object>> getData() {
List<Map<String, Object>> list2 = new ArrayList<Map<String, Object>>();
for(int i=0;i<titleArr.length;i++) {
HashMap<String,Object> item = new HashMap<String,Object>();
item.put("title", titleArr[i]);
item.put("subtitle", subTitleArr[i]);
item.put("mpic", imgArr[i]);
list2.add(item);
}
return list2;
}
// ListView 的 item click
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
// TODO Auto-generated method stub
Toast.makeText(Basic.this,"編號" + subTitleArr[arg2], Toast.LENGTH_SHORT).show();
}
public final class MyView {
public TextView title;
public TextView subtitle;
public Button bt;
public ImageView img;
}
// 實作一個 Adapter 繼承 BaseAdapter
public class MyAdapter extends BaseAdapter {
private LayoutInflater inflater;
public MyAdapter(Context context) {
inflater = LayoutInflater.from(context);
}
@Override
public int getCount() {
// TODO Auto-generated method stub
//回傳這個 List 有幾個 item
return list.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return null;
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
MyView myviews = null;
myviews = new MyView();
convertView = inflater.inflate(R.layout.test, null);
myviews.title = (TextView) convertView.findViewById(R.id.textView1);
myviews.subtitle = (TextView) convertView.findViewById(R.id.textView2);
myviews.bt = (Button) convertView.findViewById(R.id.button1);
myviews.img = (ImageView) convertView.findViewById(R.id.imageView1);
myviews.title.setText((String) list.get(position).get("title"));
myviews.subtitle.setText((String) list.get(position).get("subtitle"));
myviews.img.setImageResource(imgArr[position]);
myviews.bt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(Basic.this, titleArr[position], Toast.LENGTH_SHORT).show();
}
});
return convertView;
}
}
}
然後點"基本資料" 就會出現"怪物名稱" (基本資料不知去哪生 = = )
然後點"怪物名稱"會出現"怪物編號"