Android学习之ListView与适配器


简单适配器SimpleAdapter继承自BaseAdapter,用于将静态数据映射到xml文件中定义好的视图当中。比如可以指定静态数据为由Map组成的ArrayList。在ArrayList中每个条目对应List中的一行,Map可以包含多项数据。

  SimpleAdapter的构造方法如下:

  public SimpleAdapter (Context context, List<? extends Map<String, ?>> data, int resource, String[] from, int[] to); 

  其中,参数context用于指定SimpleAdapter所关联的上下文对象;参数data用于指定Map列表;参数resource用于指定资源标识符(即列表项的视图布局);参数from用于指定Map列表中每项数据所对应的标签;参数to用于指定Map列表中每项数据在布局文件中所要匹配的对象。

【摘】http://www.cnblogs.com/menlsh/archive/2013/03/03/2942127.html


除了简SimpleAdapter以外,还有ArrayAdapter。其中ArrayAdapter用于绑定单一的数据,而SimpleAdapter用于绑定格式复杂的数据

ArrayAdapter的简单使用如下,其中的三个参数分别是文本,布局(这里选用的是样例),字符串数组

    private ArrayAdapter<String> arrayAdapter;
    String [] arr={"慕课网1","慕课网2"};
    arrayAdapter=new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,arr);

最后通过获取的ListView将适配器装进去就可以了

下面是SimpleAdapter的使用

其中接收五个参数,下面是一个简单的介绍与使用,R.simple_layout里面包含的是一个imageView,id为R.id.image,和一个TextView,id为R.id.text

/**
         * context:上下文
         * data:数据源(List <? extends Map<String, ?>),其中的每一个Map对应一个子视图
         * resource 布局,即每一个子视图
         * from:Map中的键名,这个是对应着to中的子id,然后通过给此赋值来改变子元素中的内容
         * to:绑定数据视图的ID,即resource中布局里面的子元素,通过此获取子元素的id,并与from中的键值对应
         */


        simpleAdapter=new SimpleAdapter(this,getDate(),R.layout.simple_layout,new String[]{"pic","text"},new int[]{R.id.image,R.id.text});
        listView.setAdapter(simpleAdapter);




    }

    private List<Map<String,Object>> getDate(){
        for(int i=0;i<20;i++){
            //new一个map
            Map<String,Object> map=new HashMap<>();
            //pic对应的是图片,text对应的是文本
            map.put("pic",R.drawable.deng1);
            map.put("text","mkw"+i);
            data.add(map);

        }
        return data;
    }

举个例子

1.ListView

首先是建一个加载ListView的XML文件

如下activity_main.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"
    android:orientation="vertical">
    <ListView
        android:id="@+id/listview"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"></ListView>
</LinearLayout>


想让ListView中的列表项显示如下

先建立一个上述的布局文件simple_item.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="80dp"
    android:orientation="horizontal">
    <ImageView
        android:id="@+id/header"
        android:layout_width="0dp"
        android:layout_weight="1"
        android:layout_height="wrap_content"
        android:paddingLeft="10dp"/>
    <LinearLayout
        android:orientation="vertical"
        android:layout_width="0dp"
        android:layout_weight="3"
        android:layout_height="wrap_content">
        <TextView
            android:id="@+id/name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="30dp"
            android:textColor="#f0f"
            android:paddingLeft="10dp"/>
        <TextView
            android:id="@+id/desc"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="20dp"
            android:paddingLeft="10dp"/>
    </LinearLayout>

</LinearLayout>

在MainActivity.java中加载信息

private String[] names=new String[]{
            "Chain","America","Canada","Russia"
    };
    private String[] descs=new String[]{
            "traditional culture","professional technology","Chinese people very much","big place"
    };
    private int[] imageIds=new int[]{
            R.drawable.im1,R.drawable.im2,R.drawable.im3,R.drawable.im4
    };

接下来便要在OnCreate中写入SinpleAdapter的代码

分别解释

new一个以map为元素的list

List<Map<String,Object>> listItems=new ArrayList<Map<String, Object>>();
然后在其中添加Map的信息

for(int i=0;i<names.length;i++){
            Map<String,Object> listItem=new HashMap<String,Object>();
            listItem.put("header",imageIds[i]);
            listItem.put("personName",names[i]);
            listItem.put("desc",descs[i]);
            listItems.add(listItem);
        }
一个Map中含有三个对应的项,并将map添加到list中


下面便是将list加载到adapter中,如下

SimpleAdapter simpleAdapter=new SimpleAdapter(this,listItems,
               R.layout.simple_item,
                new String[]{"personName","header","desc"},
                new int[]{R.id.name,R.id.header,R.id.desc});
        ListView list=(ListView)findViewById(R.id.listview);
        list.setAdapter(simpleAdapter);
this表示当前的context

listItems为含有map的list

R.layout.simple_item表示ListView中的列表项的布局

下面两个数组是将对应的关系确定,例如peronName对应于names[i],将其赋给R.id.name

最后在手机上显示的就像下面的一样


讲一下其他的

GridView(网格视图)

和ListView的区别在于ListView只有一列,而GridView却可以自定义列数

实现如下的图片浏览器


同样先是建一个GridVview的布局,然后再建一个GridView子项的布局,

只对MainActivity中的代码分析

加载信息

GridView grid;
    ImageView imageView;
    int[] imageIds=new int[]{
            R.drawable.im1,R.drawable.im2,R.drawable.im3,R.drawable.im4,
    R.drawable.im5,R.drawable.im6,R.drawable.im7,R.drawable.im8};

list填充

List<Map<String,Object>> listItems=new ArrayList<Map<String,Object>>();
        for(int i=0;i<imageIds.length;i++){
            Map<String,Object> listItem=new HashMap<String,Object>();
            listItem.put("image",imageIds[i]);
            listItems.add(listItem);
        }

simpleAdapter

SimpleAdapter simpleAdapter=new SimpleAdapter(this,listItems,R.layout.cell,
                new String[] {"image"},new int[] {R.id.image1});
        grid=(GridView)findViewById(R.id.grid01);
        grid.setAdapter(simpleAdapter);


最后讲一下监听器

一般都是实现接口,然后重载其中的方法

下面附一段代码

@Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

        //position表示的是点击的子元素的序号,下面一句是获取该子元素的信息
        String str=listView.getItemAtPosition(position)+"";
        Toast.makeText(this,str+position,Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {

        switch (scrollState){
            case SCROLL_STATE_FLING:
                Log.i("SIMPLEADAPTER","手指离开,惯性滑动过程");
                break;
            case SCROLL_STATE_IDLE:
                Log.i("SIMPLEADAPTER","滚动停止");
                break;
            case SCROLL_STATE_TOUCH_SCROLL:
                Log.i("SIMPLEADAPTER","手指正在滚动");
                break;
        }
    }



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值