Denua 博客

ListView 控件的简单使用

发布时间: 2017-11-07 18:16   分类 : 笔记    标签: Android 浏览: 526   

ListView 是Android中展示数据集时使用的一个控件, 非常实用和常用

在布局中加入ListView控件

    <ListView
    android:id="@+id/list_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

添加数据

private String[] data={"Apple", "Banana", "Orange", "Watermelon",
                        "Pear", "Grape", "Pineapple", "StrawBerry",
                        "Cherry", "Mango","Apple", "Banana", "Orange", "Watermelon"};
ListView lv = (ListView)findViewById(R.id.list_view);
ArrayAdapter<String> adapter = new ArrayAdapter<String>
            (MainActivity.this, android.R.layout.simple_list_item_1, data);
lv.setAdapter(adapter);

往ListView中添加数据必须通过适配器 Adapter ,添加不同的数据使用不同的 Adapter

上例中使用的为 ArrayAdapter ,接受泛型, 接受一个当前上下文, ListView 子布局id, 例子中使用的为Android自带的 TextView , 最后把 数据传入

最后, 给ListView 设置适配器 setAdapter 进行关联

定制 ListView 的界面

private List<ListItem> items = new ArrayList<>();   // ListView 成员
ListView lv = null;
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    ActionBar bar = getSupportActionBar();
    if(bar != null){
        bar.hide();
    }

    for(int i=0; i<100; i++){
        ListItem A = new ListItem("Round Icon", R.mipmap.ic_launcher_round);  // 实例化个体列表成员
        ListItem B = new ListItem("Normal Icon", R.mipmap.ic_launcher);
        items.add(A);   // 添加成员
        items.add(B);
    }
    CustomAdapter adapter = new CustomAdapter(MainActivity.this, R.layout.list_item, items);
    // 创建一个自定义适配器, Adapter(Context context, int LayoutViewResourceId, List<E> objects)
    // LayoutViewResourceId 为成员的布局, objects 接受一个泛型列表
    lv = (ListView)findViewById(R.id.list_view);
    lv.setAdapter(adapter); // 设置适配器
}

class CustomAdapter extends ArrayAdapter<ListItem>{ // 继承于 ArrayAdapter 类型为 ListItem

    private int resourceId;
    public CustomAdapter(Context context, int TextViewResourceId, List<ListItem> objects){
        super(context, TextViewResourceId, objects);
        resourceId = TextViewResourceId;    // 传入的列表成员的 Layout 模板
    }
    public View getView(int position, View convertView, ViewGroup parent){
        ListItem item = getItem(position);   // 获取当前 list item 实例
        View view;
        ViewHolder holder;
        if(convertView == null){    // 如果缓存空则创建
            view = LayoutInflater.from(getContext()).inflate(resourceId, parent, false);    
            // 加载 传入布局, 列表成员布局
            holder = new ViewHolder();
            holder.IV_img = view.findViewById(R.id.img);    // 获取实例
            holder.TV_name = view.findViewById(R.id.name);
            view.setTag(holder);    // 存储在 View 中
        }
        else{
            view = convertView;     // 调用缓存
            holder = (ViewHolder) view.getTag();    // 重新获取 view
        }
        holder.IV_img.setImageResource(item.getImageId());
        holder.TV_name.setText(item.getName());
        return view;    // 返回布局
    }
    class ViewHolder{
        ImageView IV_img;
        TextView TV_name;
    }
}

class ListItem {

    private String name;
    private int imageId;

    public ListItem(String name, int imageId){
        this.name = name;
        this.imageId = imageId;
    }

    public String getName(){
        return this.name;
    }
    public int getImageId() {
        return this.imageId;
    }

}

ListView 的点击事件

lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int position, long Id) {
                ListItem item = items.get(position);
                String name = item.getName();
                Toast.makeText(MainActivity.this, name + ",Position: " +
                String.valueOf(position) + ", Id:" + String.valueOf(Id), Toast.LENGTH_SHORT).show();
            }
        });

(完)

评论    

Copyright denua denua.cn