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

1. 一、模拟ArrayAdapter适配器前,我们先回顾一下ArrayAdapter:

ArrayAdapter(Context上下文,resourceId Item的布局文件id,数据源String[]/List<String>)
ListView.setAdapter(adapter);

第一个参数:上下文(访问系统资源)
第二个参数:item布局文件id 【布局文件可以自定义(案例中自定义为Item),系统自带的为android.R.layout.simple_list_item_1】
第三个参数:数据源

2. 二、ListView使用步骤:
1)XML中添加ListView的控件
2)创建Item布局,创建并初始化数据源
3)创建并初始化Adapter
4)直接使用setAdapter(adapter)

3.三、代码部分:
activity_main.xml中的代码:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" >

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

    <TextView  android:id="@+id/emptyView" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:text="暂无数据" android:textColor="#00ff00" />

</LinearLayout>

item.xml代码:listView中每个item中是一个TextView。

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/item" android:layout_width="match_parent" android:layout_height="match_parent" >

</TextView>

自定义MyAdapter继承BaseAdapter,模拟ArrayAdapter功能

package org.moblie.train.zday09_myadapter;

import android.app.Activity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

public class MyAdapter extends BaseAdapter {
    private Activity activity;
    private int resourceId;
    private String[] totalList;

    public MyAdapter(Activity activity, int resourceId, String[] totalList) {
        // TODO Auto-generated constructor stub
        this.activity = activity;
        this.resourceId = resourceId;
        this.totalList = totalList;
    }

    public int getCount() {
        // 数组元素个数
        return totalList.length;
    }

    public Object getItem(int position) {
        return totalList[position];
    }

    public long getItemId(int position) {
        return position;
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        // 获取listView对象
        View view = activity.getLayoutInflater().inflate(resourceId, parent,
                false);
        TextView item = (TextView) view.findViewById(R.id.item);
        //给每个Item赋值
        item.setText(totalList[position]);
        return view;
    }

}

MainActivity中代码:

package org.moblie.train.zday09_myadapter;

import android.app.Activity;
import android.os.Bundle;
import android.widget.ListView;
import android.widget.TextView;

public class MainActivity extends Activity {
    // 声明布局控件
    private ListView listView_Main;
    private TextView emptyView;
    // 声明数据源
    private String[] totalList;
    private MyAdapter adapter;
    private int resourceId = R.layout.item;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // 初始化加载数据
        initData();
        // 初始化布局控件
        initViews();
    }

    private void initViews() {
        listView_Main = (ListView) findViewById(R.id.listView_Main);
        emptyView = (TextView) findViewById(R.id.emptyView);
        // 自动匹配当没有数据的时候,显示无数据
        listView_Main.setEmptyView(emptyView);
        // 创建并初始化自定义适配器,第二个参数即自定义的item的id。
        MyAdapter adapter = new MyAdapter(this, resourceId, totalList);
        // 给listView设置适配器
        listView_Main.setAdapter(adapter);
    }

    private void initData() {
        totalList = new String[10];
        for (int i = 0; i < totalList.length; i++) {
            totalList[i] = "联系人" + (i + 1);
        }
    }
}

P.S.
四.如何实现点击Item时,Item变成蓝色:
看见点击事件 条件反射一样 想到给Item绑定监听器。
1.思路:
①先在MyAdapter中定义点击的item位置下标为全局变量,根据下标改变该位置的颜色
②点击下标在MainActivity中adapter对象所绑定的监听器中获取。
具体代码实现如下:
2.MainActivity中代码:

private void initViews() {
        listView_Main = (ListView) findViewById(R.id.listView_Main);
        emptyView = (TextView) findViewById(R.id.emptyView);
        // 自动匹配当没有数据的时候,显示无数据
        listView_Main.setEmptyView(emptyView);
        // 创建并初始化自定义适配器,第二个参数即自定义的item的id。
        adapter = new MyAdapter(this, resourceId, totalList);
        // 给listView设置适配器
        listView_Main.setAdapter(adapter);
        // 给listView绑定监听器,匿名内部类
        listView_Main.setOnItemClickListener(new OnItemClickListener() {

            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {
                // 给点击位置赋值,判断是否要改变颜色。
                adapter.setIndex(position);
                // 刷新UI界面
                adapter.notifyDataSetChanged();
            }
        });
    }

MyAdapter中代码修改:

// 数组下标从0开始,所以定义index应该初始值为-1,
    //如果直接默认0的话,即便不点击第一个item,第一个直接就显示蓝色。不符合要求。
    private int index = -1;

    public int getIndex() {
        return index;
    }

    public void setIndex(int index) {
        this.index = index;
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        // 获取listView对象
        View view = activity.getLayoutInflater().inflate(resourceId, parent,
                false);
        TextView item = (TextView) view.findViewById(R.id.item);
        if (index == position) {
            item.setTextColor(Color.BLUE);
        }
        item.setText(totalList[position]);
        return view;
    }

你可能感兴趣的:(ListView,Adapter,布局)