Android——自定义ArrayAdapter

原创 2015年11月20日 20:44:27

在取得网页端传回的JSON数据并封装成对象数据后,想要把对象数据的信息显示在一个ListView中,在这里使用自定义ArrayAdapter给ListView添加adapter。

首先传回的JSON数据格式为:

{
"userinfo":[{"username":"zhangsan","id":17,"age":12,"sex":"nan"},
{"username":"zhangsan","id":18,"age":12,"sex":"nan"},...]}

很清楚一个键为”userinfo“值为JSON数组的对象
JSON数组里的对象包含四对Name-Value

所以我们的对象是一个User包含上面的四个字段:uername,id,age,sex;

User.java还有一个静态方法用来将JSON字符串解析为User对象数组

package com.sky.firsthttpapp;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.ArrayList;

/**
 * Created by Administrator on 2015/11/20.
 */
public class User {
    private int id;
    private String username;
    private String sex;
    private int age;

    public User(int id, String username, String sex, int age) {
        this.id = id;
        this.username = username;
        this.sex = sex;
        this.age = age;
    }

    public int getId() {
        return id;
    }

    public String getUsername() {
        return username;
    }

    public String getSex() {
        return sex;
    }

    public int getAge() {
        return age;
    }
    public static ArrayList<User> getUserListFromJSONStrig(String JSONString){
        ArrayList list=new ArrayList<User>();
        try {
            JSONObject root=new JSONObject(JSONString);
            JSONArray array=root.getJSONArray("userinfo");
            for(int i=0;i<array.length();i++){
                JSONObject item= (JSONObject) array.get(i);
                User user=new User(item.getInt("id"),
                        item.getString("username"),
                        item.getString("sex"),
                        item.getInt("age"));
                list.add(user);
            }
        } catch (JSONException e) {
            MessageManager.sendMessage("exception","JSONException:"+e.getMessage());
            e.printStackTrace();
        }
        return list;
    }
}

通过User 的静态方法 getUserArrayFromJSONString()可以得到一个List。

下面通过自定义ArrayAdapter显示List的数据
新建一个类UserArrayAdapter,继承自ArrayAdapter,(超类没有无参构造函数)必须为其显示添加一个构造方法调用超类的构造方法
这里采用和超类一样的三个基本参数,Context context, int resource, List objects

接下来是最关键的一步,就是重写基类的getView方法,让他返回一个自定义的ListView Item的View,
首先通过LayoutInflater.from().inflate()方法得到一个View,再设置view里面的控件的值,这些控件是将要显示在ListView每个item中的控件,所以要新建一个list_cell.layout文件,里面放置四个TexView用来显示四个字段:id,username,age,sex

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal" android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TextView
        android:id="@+id/tvId"
        android:layout_weight="1"
        android:layout_width="wrap_content"
        android:layout_height="fill_parent" />
    <TextView
        android:id="@+id/tvName"
        android:layout_weight="1"
        android:layout_width="wrap_content"
        android:layout_height="fill_parent" />
    <TextView
        android:id="@+id/tvAge"
        android:layout_weight="1"
        android:layout_width="wrap_content"
        android:layout_height="fill_parent" />
    <TextView
        android:id="@+id/tvSex"
        android:layout_weight="1"
        android:layout_width="wrap_content"
        android:layout_height="fill_parent" />

</LinearLayout>

然后我们就可以来写getView方法了

 @Override
    public View getView(int position, View convertView, ViewGroup parent) {
    //得到view
        View v= LayoutInflater.from(super.getContext()).inflate(R.layout.list_cell,null,false);
   //取得控件
        TextView tvId= (TextView) v.findViewById(R.id.tvId);
        TextView tvName= (TextView) v.findViewById(R.id.tvName);
        TextView tvAge= (TextView) v.findViewById(R.id.tvAge);
        TextView tvSex= (TextView) v.findViewById(R.id.tvSex);
        //根据position取得user对象,并设置控件的text
        User user=super.getItem(position);
        tvId.setText(user.getId()+"");
        tvName.setText(user.getUsername());
        tvAge.setText(user.getAge()+"");
        tvSex.setText(user.getSex());
        return v;
    }

好了,到这里完成了自定义ArrayAdapter的设置(很简单)
完整的UserArrayAdapter代码:

public class UserArrayAdapter  extends ArrayAdapter<User>{


    public UserArrayAdapter(Context context, int resource, List<User> objects) {
        super(context, resource, objects);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View v= LayoutInflater.from(super.getContext()).inflate(R.layout.list_cell,null,false);
        TextView tvId= (TextView) v.findViewById(R.id.tvId);
        TextView tvName= (TextView) v.findViewById(R.id.tvName);
        TextView tvAge= (TextView) v.findViewById(R.id.tvAge);
        TextView tvSex= (TextView) v.findViewById(R.id.tvSex);
        User user=super.getItem(position);
        tvId.setText(user.getId()+"");
        tvName.setText(user.getUsername());
        tvAge.setText(user.getAge()+"");
        tvSex.setText(user.getSex());
        return v;
    }
}

然后在MainActivity中新建一个UserArrayAdapter

 ArrayList<User> list=User.getUserListFromJSONString(result);
        adapter=new UserArrayAdapter(this,R.layout.list,list);
        lv.setAdapter(adapter);

ListView的适配(使用自定义ArrayAdapter)

ListView在平时开发中使用的最广泛,应用也是最多的,而使用系统的适配器并不能满足我们多样化的要求,因此本文就自定义适配器展开,下面直接附上我已经测试通过的代码: MainActivity.ja...
  • liuyucui100
  • liuyucui100
  • 2016年03月03日 14:57
  • 2267

[Android开发]如何自定义ArrayAdapter

场景: 我想显示sd卡的/DCIM/Camera目录中的所有图片到一个列表中,这个列表中的每一项左边是图片的缩略图,右边是文件名。 分析: 这个应用是很典型的 数据绑定 加 自定义显示. 如何...
  • sayo
  • sayo
  • 2010年12月30日 23:41
  • 2214

android之ArrayAdapter的重写

昨天介绍了ArrayAdapter的使用,今天介绍一下更加实用的一点,对它进行重写,满足自己的个性化设计需要. ArrayAdapter(数组适配器)一般用于显示一行文本信息,所以比较容易。 publ...
  • jason0539
  • jason0539
  • 2013年08月12日 16:46
  • 19227

最简单自定义实现ArrayAdapter,可以显示自己的逻辑

1.很多童鞋在网上搜到的ArrayAdapter,不是使用系统的布局,就是要重新很多方法,起初听老师讲课说ArrayAdapter自定义麻烦,也就信了,但是今天刚好要使用AutoCompleteTex...
  • zeng_zhiqian
  • zeng_zhiqian
  • 2015年10月23日 12:45
  • 456

Android定制ListView的界面(使用继承自ArrayAdapter的自定义适配器)--《第一行代码Android》学习笔记

ListView控件用于实现程序中的内容在屏幕上滚动的效果,大部分日常使用的应用程序都会使用ListView控件。一、简单ListView的用法简单ListView,即实现只有多个文本内容的滚动显示(...
  • u013632190
  • u013632190
  • 2015年10月13日 00:35
  • 1922

Android 自定义Adapter以实现自定义填充ListView的Item

1>实体类---即ListView中各个Item中填充的内容 package com.demo.cxc.compoundview.com.demo.cxc.entity; import java....
  • cxc19890214
  • cxc19890214
  • 2015年04月15日 00:42
  • 1593

继承ArrayAdapter类的实例

private class SelectAccountListAdapter extends ArrayAdapter{ private Context mContext; p...
  • u012966861
  • u012966861
  • 2017年04月17日 16:34
  • 400

如何自定义ArrayAdapter

场景: 我想显示sd卡的/DCIM/Camera目录中的所有图片到一个列表中,这个列表中的每一项左边是图片的缩略图,右边是文件名。 分析: 这个应用是很典型的 数据绑定 加 自定义显...
  • xajax
  • xajax
  • 2011年10月02日 19:58
  • 3927

ArrayAdapter参数的理解

转载:http://www.cnblogs.com/lewisky/p/5017052.html 1.   适配器的作用是数据和视图之间的桥梁 2.   要显示一个数组,我们就用Arr...
  • Hello___A__World
  • Hello___A__World
  • 2017年04月22日 16:47
  • 2298

Android25闹钟项目——ArrayAdapter动态添加数据,显示数据,删除数据SharedPreferences存储数据,读取数据

效果: 项目结构: MainActivity中: package com.example.myarrayadapter; /**  * ArrayAdapter动态添加数据,显示数据,删...
  • zhaihaohao1
  • zhaihaohao1
  • 2015年06月07日 09:44
  • 944
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android——自定义ArrayAdapter
举报原因:
原因补充:

(最多只允许输入30个字)