ListView
特點:
1、屬于ViewGroup,裡面可以放子元件
2、用于展示垂直滾動清單
3、清單有多個條目,條目的資料來自于 ListAdapter 擴充卡,而擴充卡的資料來自于比如數組或資料庫等等
二、擴充卡
ListAdapter接口
BaseAdapter 抽象類
ArrayAdapter 實作類
SimpleAdapter實作類
ArrayAdapter : 當條目布局比較簡單,裡面就是一個textview。總的資料就是一個數組
SimpleAdapter: 當listview條目資料是一個map,總的資料 是 一個list<Map<>>
BaseAdapter:當條目布局比較複雜,裡面有圖檔文本按鈕等等,這個時候我們往往自定義類繼承BaseAdapter (用的最多)
下面是使用各個擴充卡的詳細介紹
一般都分為三部走,1.尋找布局控件2.設定資料3.使用合适的擴充卡——————最後也可以加上監聽器
1.ArrayAdapeter
.xml
<ListView
android:id="@+id/lv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
.java
public class MainActivity extends ActionBarActivity {
private ListView lv;
private List<String> list;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 1.得到控件對象
lv = (ListView) findViewById(R.id.lv);
// 2.設定資料
initData();
// 3.找擴充卡
lv.setAdapter(new ArrayAdapter<String>(this,
android.R.layout.simple_expandable_list_item_1, list));
// simple_expandable_list_item_1是android自帶的布局了,你也可以自己定義
}
private void initData() {
list = new ArrayList<String>();
for (int i = 0; i < 5; i++) {
list.add("haha" + i);
}
}
}
2.SimpleAdapter
Activity_main.xml
<ListView
android:id="@+id/lv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
再建立一個item_activity_simple.xml用于布局你存儲的資訊的格式
item_activity_simple.xml
<TextView
android:id="@+id/name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="38dp"
android:text="1"
/>
<TextView
android:id="@+id/age"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_marginLeft="56dp"
android:layout_toRightOf="@+id/name"
android:text="2"
android:textSize="38dp" />
.java
public class MainActivity extends ActionBarActivity {
private ListView lv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//1.得到布局控件
lv = (ListView) findViewById(R.id.lv);
//2.設定資料
List<Map<String, Object>> data = initData();
//3.擴充卡
lv.setAdapter(new SimpleAdapter(this, data,R.layout.item_activity_simple,
new String[]{"name","age"}, new int[]{R.id.name,R.id.age}));
}
private List<Map<String, Object>> initData() {
// TODO Auto-generated method stub
List<Map<String,Object>> data=new ArrayList<Map<String,Object>>();
Map<String , Object> map=new HashMap<String, Object>();
map.put("name", "tom");
map.put("age", "11");
Map<String , Object> map2=new HashMap<String, Object>();
map2.put("name", "tony");
map2.put("age", "12");
Map<String , Object> map3=new HashMap<String, Object>();
map3.put("name", "sandy");
map3.put("age", "21");
data.add(map);
data.add(map2);
data.add(map3);
return data;
}
}
3.BaseAdapter 抽象類 (最常用也是最麻煩的)
Activity_main.xml
<ListView
android:id="@+id/lv"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
再建一個activity_food_dealites.xml用來布局格式
<ListView
android:id="@+id/lv"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
<TextView
android:id="@+id/lv_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/lv_price"
android:layout_below="@+id/lv_price"
android:text="name"
android:textSize="30dp" />
<ImageView
android:id="@+id/lv_img"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_marginLeft="16dp"
android:layout_marginTop="20dp"
android:src="@drawable/ic_launcher" />
<TextView
android:id="@+id/lv_price"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="20dp"
android:text="price"
android:textSize="30dp" />
MainActivity.java
public class MainActivity extends ActionBarActivity {
private ListView lv;
private List<Food> list;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//1.擷取布局控件
lv = (ListView) findViewById(R.id.lv);
//2.設定資料
initData();
//3、擴充卡
lv.setAdapter(new FoodAdapter(list,this));
//4.設定監聽器
lv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
// TODO Auto-generated method stub
Toast.makeText(MainActivity.this, "你點選了:"+arg2, 0).show();
}
});
}
private void initData() {
list = new ArrayList<Food>();
int count=0;
for (int i = R.drawable.f1; i < R.drawable.f9; i++) {
//這裡的我的圖檔是按f1-f9是以能用for循環,如果你的圖檔不是沒有順序,就老老實實的寫吧。哈哈
Food food=new Food(i,"菜"+count,count+100,"土鼈吃的起碼");
list.add(food);
count++;
}
}
}
再建一個FoodAdapter.java這是一個你自定義的Adapter擴充卡
public class FoodAdapter extends BaseAdapter {
//繼承BaseAdapter時候。必須連接配接上下文
private List<Food> list;
private Context context;
public FoodAdapter(List<Food> list,Context context) {
// TODO Auto-generated constructor stub
this.list=list;
this.context=context;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return list.size();
}
@Override
public Object getItem(int arg0) {
// TODO Auto-generated method stub
return list.get(arg0);
}
@Override
public long getItemId(int arg0) {
// TODO Auto-generated method stub
return arg0;
}
@Override
public View getView(int arg0, View arg1, ViewGroup arg2) {
// TODO Auto-generated method stub
//1.将條目布局中轉換成View對象
View view=View.inflate(context, R.layout.activity_food_dealites, null);
//2.找到條目布局的各個控件,友善下一步設定資料
ImageView lv_img = (ImageView) view.findViewById(R.id.lv_img);
TextView lv_name = (TextView) view.findViewById(R.id.lv_name);
TextView lv_price = (TextView) view.findViewById(R.id.lv_price);
//3.為每個條目設定對應的資料(資料來自于list中每一對象的屬性)
lv_img.setImageResource(list.get(arg0).getImageid());
lv_name.setText(list.get(arg0).getName());
lv_price.setText(list.get(arg0).getPrice()+"");
return view;
}