天天看點

Android進階UI控件—ListView

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;

}