您的位置:首页 > 其它

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

2016-01-08 16:06 423 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: