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

相关文章推荐

Android之旅第四站——适配ArrayAdapter,simpleadapter和自定义adapter的区别…

1.ArrayAdapter只可以简单的显示一行文本adapter=new ArrayAdapter(this, R.layout.item_main_lv, R.id.item_main_lv_na...

Android中Spinner下拉列表(使用ArrayAdapter和自定义Adapter实现) .

Android中Spinner下拉列表(使用ArrayAdapter和自定义Adapter实现) . 您的评价:       还行  收藏该经验 ...

Android中Spinner下拉列表(使用ArrayAdapter和自定义Adapter实现)

今天学习了Spinner组件,使用Spinner相当于从下拉列表中选择项目,下面演示一下Spinner的使用(分别使用ArrayAdapter和自定义Adapter实现) (一):使用ArrayAda...

Android学习【5】自定义ArrayAdapter

通过ArrayList显示数据首先要绑定一个ArrayAdapter(适配器)然后将数据传入,详细效果如下: final ArrayAdapter aa; adapt...

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

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

radiobtn的listview,自定义arrayAdapter构成样式

public class myActivity extends ListActivity { private BroadcastReceiver mSDCardCheckReceiver =...

经验分享一 自定义ArrayAdapter中的字体

最近搞个小软件,需要让界面更加的美化一些,所以就用到了,

ListView:自定义Adapter小案例(实现ArrayAdapter功能)

1. 一、模拟ArrayAdapter适配器前,我们先回顾一下ArrayAdapter:ArrayAdapter(Context上下文,resourceId Item的布局文件id,数据源String...
  • iblade
  • iblade
  • 2016年01月08日 16:06
  • 470

使用arrayadapter和自定义adapter

(一):使用ArrayAdapter进行适配数据:    ①:首先定义一个布局文件: [html] view plaincopy span s...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android——自定义ArrayAdapter
举报原因:
原因补充:

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