安卓ListView的使用

1.简单介绍ListView

      listview是一个以垂直方式在项目中显示视图的列表。是一种不能实现确定视图中的内容的适配器视图(adapter view)。数据和视图的绑定,需要通过继承ListViewAdapter接口的适配器实现。确保当上下滚动的时候,能够动态刷新视图内容。通常我们都会自定义一个继承自BaseAdapter(已继承ListViewAdapter),ArrayAdapter(继承自BaseAdapter),SimpleAdapter(继承自BaseAdapter)的类,重写getView()方法,实现自己想要的功能。

getView方法详情

   View getView (int position, View convertView, ViewGroup parent)       Get a View that displays the data at the specified position in the data set.        You can either create a View manually or inflate it from an XML layout file.        When the View is inflated, the parent View (GridView, ListView...) will apply        default layout parameters unless you use inflate(int, android.view.ViewGroup, boolean) to        specify a root view and to prevent attachment to the root备注:使用适配器构建布局。

如果布局的内容是属于动态或未预先确定的内容,您可以使用这样一种布局:在运行时通过子类 AdapterView 用视图填充布局。 AdapterView 类的子类使用 Adapter 将数据与其布局绑定。

Adapter 充当数据源与 AdapterView 布局之间的中间人—Adapter(从数组或数据库查询等来源)检索数据,并将每个条目转换为可以添加到 AdapterView 布局中的视图。

适配器支持的常见布局包括:

    使用数据填充适配器视图

    您可以通过将 AdapterView 实例与 Adapter 绑定来填充 AdapterView(如 ListView 或 GridView),此操作会从外部来源检索数据,并创建表示每个数据条目的 View

Android 提供了几个 Adapter 子类,用于检索不同种类的数据和构建 AdapterView 的视图。 两种最常见的适配器是:ArrayAdapter和SimpleCursorAdapter。

2.ListView使用步骤

     1).在布局的XML文件中,添加如下代码:

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

2)新建list_item的布局文件,确定每一个View的样式。

  3).新建一个适配器类。

4).绑定数据到视图。

3.使用实例

     1).使用ArrayAdapter

           主layout文件:

mylistview.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >
    <ListView
        android:id="@+id/mylistview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        >
    </ListView>
</LinearLayout>

list_item的xml文件:

list_item.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:textSize="18sp"
      >
</TextView>

activity文件:

MyActivity.java文件

public class MyActivity extends Activity{

    private ListView listview;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
      super.onCreate(savedInstanceState);
      setContentView(R.layout.mylistview);
      listview = (ListView)findViewById(R.id.mylistview);
      String[] str = {"上海","北京","天津","江苏","河南","西藏","新疆","湖南","湖北"};
      List<String> listdata = new ArrayList<String>();
      listdata.add("上海");
      listdata.add("北京");
      listdata.add("天津");
      listdata.add("江苏");
      ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this,R.layout.list_item,listdata);//listdata和str均可
      listview.setAdapter(arrayAdapter);
    }

}

 2.使用SimpleAdapter

         构造方法:SimpleAdapter(Context context, List<? extends Map<String, ?>> data, int resource, String[] from, int[] to)

         simpleAdapter可以通过hashmap的方式,每个view可以显示几种不同的内容。

1).主layout文件和上面相同

2).list_item的布局文件

<?xml version="1.0" encoding="UTF-8"?>
<RelativeLayout
       xmlns:android="http://schemas.android.com/apk/res/android"
       android:layout_width="match_parent"
        android:layout_height="match_parent"
    >
 <ImageView
     android:id="@+id/iv1"
     android:layout_width="30dp"
     android:layout_height="30dp"
     android:src="@drawable/ic_launcher"
     />
<TextView
        android:id="@+id/tv1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="18sp"
        android:text="wgj"
        android:layout_toRightOf="@id/iv1"
      >
</TextView>
<TextView
     android:id="@+id/tv2"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:textSize="18sp"
     android:text="19岁"
     android:layout_below="@id/tv1"
     android:layout_toRightOf="@id/iv1"
    >
</TextView>
</RelativeLayout>

3.activity文件

public class MyActivity extends Activity{

    private ListView listview;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
      super.onCreate(savedInstanceState);
      setContentView(R.layout.mylistview);
      listview = (ListView)findViewById(R.id.mylistview);
      SimpleAdapter simpleAdapter = new SimpleAdapter(this,putData(),R.layout.list_item,
              new String[]{"name","age","pic"},new int[]{R.id.tv1,R.id.tv2,R.id.iv1});
      listview.setAdapter(simpleAdapter);
    }

    public List<Map<String,Object>> putData(){

        List<Map<String,Object>> list = new ArrayList<Map<String,Object>>();
        Map<String,Object> map1 = new HashMap<String,Object>();
        map1.put("name", "张三");
        map1.put("age", "19岁");
        map1.put("pic", R.drawable.friend);
        Map<String,Object> map2 = new HashMap<String,Object>();
        map2.put("name", "李四");
        map2.put("age", "17岁");
        map2.put("pic", R.drawable.ic_launcher);
        Map<String,Object> map3 = new HashMap<String,Object>();
        map3.put("name", "王五");
        map3.put("age", "17岁");
        map3.put("pic", R.drawable.ic_launcher);
        list.add(map1);
        list.add(map2);
        list.add(map3);
        return list;
    }
}

3.使用BaseAdapter

        优化方法 convertView 重用对象

3.1.通过缓存convertView实现 
              - 这种利用缓存contentView的方式可以判断如果缓存中不存在View才创建View,如果已经存在可以利用缓存中的View,提升了性能

3.2.通过convertView+ViewHolder来实现 
                -ViewHolder就是一个静态类,使用 ViewHolder 的关键好处是缓存了显示数据的视图(View),加快了 UI 的响应速度。 
                -代码中,当convertView为空时,用setTag()方法为每个View绑定一个存放控件的ViewHolder对象。当convertView不为空,重复利用已经创建的view的时候,使用getTag()方法获取绑定的ViewHolder对象,这样就避免了findViewById对控件的层层查询,而是快速定位到控件。

3.3Adapter文件

public class MyAdapter extends BaseAdapter{

    private LayoutInflater mInflater;
    private List<Map<String,Object>> list;

    public MyAdapter(Context context , List<Map<String,Object>> list){

        this.mInflater = LayoutInflater.from(context);
        this.list = list;
    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return list.size();
    }

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return list.get(position);
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub

        ViewHolder holder = null;

        if (convertView == null) {

            holder = new ViewHolder();
            convertView = mInflater.inflate(R.layout.list_item, null);
            holder.name = (TextView)convertView.findViewById(R.id.tv1);
            holder.age = (TextView)convertView.findViewById(R.id.tv2);
            holder.pic = (ImageView)convertView.findViewById(R.id.iv1);
            convertView.setTag(holder);
        }else{
            holder = (ViewHolder)convertView.getTag();
        }

        holder.name.setText((String)list.get(position).get("name"));
        holder.age.setText((String)list.get(position).get("age"));
        holder.pic.setBackgroundResource((Integer)list.get(position).get("pic"));

        return convertView;
    }

    public final class ViewHolder{

        public TextView name;
        public TextView age;
        public ImageView pic;
    }

}

    3.4  Activity文件

public class MyActivity extends Activity{

    private ListView listview;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
      super.onCreate(savedInstanceState);
      setContentView(R.layout.mylistview);
      listview = (ListView)findViewById(R.id.mylistview);
      MyAdapter myAdapter = new MyAdapter(this,putData());
      listview.setAdapter(myAdapter);
    }

    public List<Map<String,Object>> putData(){

        List<Map<String,Object>> list = new ArrayList<Map<String,Object>>();
        Map<String,Object> map1 = new HashMap<String,Object>();
        map1.put("name", "张三");
        map1.put("age", "19岁");
        map1.put("pic", R.drawable.friend);
        Map<String,Object> map2 = new HashMap<String,Object>();
        map2.put("name", "李四");
        map2.put("age", "17岁");
        map2.put("pic", R.drawable.ic_launcher);
        Map<String,Object> map3 = new HashMap<String,Object>();
        map3.put("name", "王五");
        map3.put("age", "17岁");
        map3.put("pic", R.drawable.ic_launcher);
        list.add(map1);
        list.add(map2);
        list.add(map3);
        return list;
    }
}

4.参考文章

    【1】https://blog.csdn.net/zhj19940809/article/details/51442363

【2】https://blog.csdn.net/qq_34487977/article/details/51088239

             

原文地址:https://www.cnblogs.com/wangguangjian/p/8831334.html

时间: 2024-10-19 05:18:54

安卓ListView的使用的相关文章

安卓Listview 不规则项即不同item的运行

在安卓中,listview  的item 是一个不断被轮询调换位置的过程,这样 即 图片参考地址   http://www.cnblogs.com/mybkn/archive/2012/05/23/2514681.html   谢谢. 开发中 ,我们经藏会遇到listview  的每一项都不同的需求.   这个时候如果使用 以前自定义的BaseAdapter的方法的话 .在滚动的时候就会出现item布局错乱的情况,也就是说 第一项在最初的背景是红色的xml布局, 当滚动到第二项置顶,在回到顶部的

安卓 listview与arrayadapter

今天有感于群里讨论的一个问题,很简单,但是问题还真是需要仔细看一下 问题:定义了一个最简单的arrayadapter,和listview结合使用,灭个item就显示个最简单的textView,一共6个item,一屏显示3个,遇到的问题就是,程序运行后,点击一屏显示出来的3个item没有问题,但是当滑动超出了一屏,再次点击item的时候就会出现nullpointer. 看了一下onitemlistener,是这么写的: list.setOnItemClickListener(new OnItemC

安卓ListView 如何设置item的高度

安卓中的listview,设置其显示item布局的高度来设置item在listview中显示的高度是不可取的.如何设置item的高度? 分为两种情况: 1.有图片的情况: 有图片的情况比较简单,布局的大小将会由图片的大小来撑起,这是只需要调节图片的width和height即可. 2.无图片情况 无图片的情况我们可以用两种方式来确定大小 a.在布局中使用Android:minHeight="5dp",填上需要的最小高度,这个方便直接. b.如果是在自己写的Adapter中,那就可以在ge

安卓ListView控件详解

1.ArrayAdapter 这个是最简单的了,只默认接受TextView控件,而且还只是一个. listView = new ListView(this); //注意没有使用XML文件的 //样式是安卓提供的样式 listView.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1,getData())); setContentView(listView); 这个就表

android 安卓 listview 支持下拉刷新 上拉加载更多

[1]重写listView import java.text.SimpleDateFormat; import java.util.Date; import android.content.Context; import android.util.AttributeSet; import android.util.Log; import android.view.MotionEvent; import android.view.View; import android.view.ViewGrou

sos:安卓listview的问题

============问题描述============ 多个按钮共有一个listview,怎么在其中一个按钮中添加listview的footerview 比如: 先在要在左侧listview的3选中后,在右侧加一个添加的footerview,左侧按钮的点击都是用的右侧一个listview2,现在我想只有在点击3的情况下,listview2才添加footerview,而点击1,2的时候不添加,这个要怎么写啊 谁能教教我 ============解决方案1============ 引用 2 楼 s

安卓——ListView的动态添加与删除

一,添加 case R.id.imgBtnAdd:/*添加列表*/ if(SetTempListView.getChildCount()>5){ Toast.makeText(getApplicationContext(), "列表只能添加6条!", Toast.LENGTH_SHORT).show(); break; } listItem.clear(); for(int i=0;i<SetTempListView.getChildCount();i++){ View v

安卓listview监听滑动到底部

listview.setOnScrollListener(new OnScrollListener(){       @Override       public void onScrollStateChanged(AbsListView view, int scrollState){           // 当不滚动时           if (scrollState == OnScrollListener.SCROLL_STATE_IDLE) {               // 判断是

安卓listView实现下拉刷新上拉加载滑动仿QQ的删除功能

大家对这些功能都是看的多了,然后对上拉刷新和下拉加载的原理都是非常清楚的,所以实现这功能其实也就是为了让大家能够从众多的同行们来进行比较学习而已,虽然即使是这样,但是面试的时候面试官还是会问你上拉和下拉是怎么实现的,滑动删除功能是怎么实现,其实要实现这些功能又不是唯一的方法,但是基本上思想都是一致的.然后gitup上的这些例子是非常的多,然后实现的也是大同小异但是也不能不让我们去球童存异.作为天朝的程序员即使是一个伸手党也不必太觉得羞耻,能把别人的东西来改一改或者沿用别人的思想来模仿也是不错的.

(BUG已修改,最优化)安卓ListView异步加载网络图片与缓存软引用图片,线程池,只加载当前屏之说明

原文:http://blog.csdn.net/java_jh/article/details/20068915 迟点出更新的.这个还有BUG.因为软引应不给力了.2.3之后 前几天的原文有一个线程管理与加载源过多,造成浪费流量的问题.下面对这进下改进的一些说明(红色为新加) 这两天一直在优化这个问题.google也很多种做法.但发现都是比较不全面. 比如: 一些只实现了异步加载,却没有线程池与软引用. 一些是用AsynTast的, 一些有了线程池但加载所有的图片,这样造成具大资源浪费 一些是用