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_1list));

// 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.适配器

      /**

       * SimpleAdapter(context, data, resource, from, to)

       * context联系上下文对象  data数据  resource 布局   from 列名的数组 比如姓名,年龄。

       * to 条目布局中所有TextView id 的数组

       */

      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();

}

 

/**

 *  每个条目的数据对象   相当于本程序的Food对象

 * arg0   条目的索引

 */

@Override

public Object getItem(int arg0) {

// TODO Auto-generated method stub

return list.get(arg0);

}

/**

 * 每个条目的索引从0开始

 */

 

@Override

public long getItemId(int arg0) {

// TODO Auto-generated method stub

return arg0;

}

/**

 * 设置并返回每个条目的布局,这个布局中设置好数据内容。。。。。必须重写

 * arg0 条目的索引

 * arg1 可以复用的条目的对象

 * arg2 父元素

 */

 

@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_dealitesnull);

//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;

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值