您的位置:首页 > 移动开发 > Android开发

020自定义BaseAdapter,然后绑定ListView的最简单例子

2016-02-23 13:44 141 查看


1 首先在drawable/中导入7张图片

2写一个名为activity_item.xml 文件



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

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content" >

<ImageView
android:id="@+id/imageView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/aa4" />

<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="40dp"
android:text="name" />

<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20dp"
android:text="speak" />
</LinearLayout>

</LinearLayout>

</LinearLayout>


3 编写主xml文件

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

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

</LinearLayout>


4



实现如图所示的3个java文件

4.1 Animal.java

/*
* 获取字段
*/
package com.example.data;

public class Animal {
private String aName;
private String aSpeak;
private int aIcon;

public Animal() {
super();
}

public String getaName() {
return aName;
}

public void setaName(String aName) {
this.aName = aName;
}

public String getaSpeak() {
return aSpeak;
}

public void setaSpeak(String aSpeak) {
this.aSpeak = aSpeak;
}

public int getaIcon() {
return aIcon;
}

public void setaIcon(int aIcon) {
this.aIcon = aIcon;
}

public Animal(String aName, String aSpeak, int aIcon) {
super();
this.aName = aName;
this.aSpeak = aSpeak;
this.aIcon = aIcon;
};

}


4.2 自定义适配器 编写AnimalAdapter.java

package com.example.data;

import java.util.LinkedList;

import com.example.androidtext001.R;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.WebView.FindListener;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

public class AnimalAdapter extends BaseAdapter {
private LinkedList<Animal> mData;//注 :1
private Context mContext;// 声明上下文

public AnimalAdapter(LinkedList<Animal> mData, Context mContext) {
super();
this.mData = mData;
this.mContext = mContext;
}

@Override
public int getCount() {// 设置layout中填充条目的数量
// TODO 自动生成的方法存根

return mData.size();

}

@Override
public Object getItem(int position) {// 得到相关的数据项的指定位置的数据
// TODO 自动生成的方法存根
// return mData == null ? null : mData.get(position);
return null;

}

@Override
public long getItemId(int position) {// 得到相关的行id
// TODO 自动生成的方法存根
return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
// position指定位置从0开始
// converView是Spinner,listView中每一项(item)要显示的view
// parent 父窗体,就是spinner,GridView
// TODO 自动生成的方法存根
convertView = LayoutInflater.from(mContext).inflate(
R.layout.activiy_item, parent, false);

img_icon.setBackgroundResource(mData.get(position).getaIcon());// 设置这个view的背景样式 注:1
text_name.setText(mData.get(position).getaName());
text_speak.setText(mData.get(position).getaSpeak());

return convertView;
}

}

/*
* 注:
*  1 setBackgroundDrawable的参数为Drawable对象,setBackgroundColor的参数为Color对象,
* 比如说Color.Red为红色,或Color.rgb(255,0,0) 来制定一个红色 setBackgroundResource
* 的参数为资源ID,比如说R.drawable.icon
* 2 ArrayList采用的是数组形式来保存对象的,这种方式将对象放在连续的位置中,所以最大的缺点就是插入删除时
* 非常麻烦 LinkedList采用的将对象存放在独立的空间中,而且在每个空间中还保存下一个链接的索引 但是缺点就是
* 查找非常麻烦 要丛第一个索引开始
*/


4.3MainActivity.java

/**
* 自定义BaseAdapter,然后绑定ListView
*/
package com.example.androidtext001;

import java.util.LinkedList;
import java.util.List;

import com.example.data.Animal;
import com.example.data.AnimalAdapter;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.widget.ListView;

public class MainActivity extends Activity {
private List<Animal> mData;
private Context mcontext;
private AnimalAdapter mAdapter ;
private ListView list_animal;

@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO 自动生成的方法存根
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

mcontext = MainActivity.this;
list_animal = (ListView) findViewById(R.id.listView1);

mData = new LinkedList<Animal>();//
mData.add(new Animal("gou", "zhu", R.drawable.aa1));
mData.add(new Animal("2", "2.1", R.drawable.aa2));
mData.add(new Animal("3", "3.1", R.drawable.aa3));
mData.add(new Animal("4", "4.1", R.drawable.aa4));
mData.add(new Animal("5", "5.1", R.drawable.aa5));
mData.add(new Animal("6", "6.1", R.drawable.aa6));
mData.add(new Animal("7", "7.1", R.drawable.aa7));

mAdapter=new AnimalAdapter((LinkedList<Animal>)mData,mcontext);//创建适配器
list_animal.setAdapter(mAdapter);
list_animal.setOnItemClickListener(new onitemClickListener());// 创建条目选择监听器
}

class onitemClickListener implements OnItemClickListener {

@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
// TODO 自动生成的方法存根
switch (arg2) {
case 0:
Toast.makeText(MainActivity.this, "你点击了第" + arg2 + 1 + "项", 1)
.show();
break;
case 1:
Toast.makeText(MainActivity.this, "你点击了第" + arg2 + 1 + "项", 1)
.show();
break;
case 2:
Toast.makeText(MainActivity.this, "你点击了第" + arg2 + 1 + "项", 1)
.show();
break;
case 3:
Toast.makeText(MainActivity.this, "你点击了第" + arg2 + 1 + "项", 1)
.show();
break;

}
}
}
}


BaseAdapter的优化:

何来使用一个ListView以及自定义一个简单的BaseAdapter,从代码

中可以看出比较重要的两个方法:getCount()和getView(),界面上有多少列就会调用多少次getView, 每次都是新inflate一个View,都要进行这个XML的解析,这样会 很浪费资源

BaseAdapter的优化,优化的两点有,复用convertView

ViewHolder重用组件

嘿嘿,getView()会被调用多次,那么findViewById不一样得调用多次,而我们的ListView的Item

一般都是一样的布局,我们可以对这里在优化下,我们可以自己定义一个ViewHolder类来对这一部分

@Override
public View getView(int position, View convertView, ViewGroup parent) {
// position指定位置从0开始
// converView是Spinner,listView中每一项(item)要显示的view
// parent 父窗体,就是spinner,GridView
// TODO 自动生成的方法存根
// convertView = LayoutInflater.from(mContext).inflate(
// R.layout.activiy_item, parent, false);
AnimalViewHolder holder;
if (convertView == null) {// convertView是系统提供给我们的可供服用的View 的缓存对象
convertView = LayoutInflater.from(mContext).inflate(
R.layout.activiy_item, parent, false);
holder = new AnimalViewHolder();
holder.img_icon = (ImageView) convertView
.findViewById(R.id.imageView1);
holder.txt_name = (TextView) convertView
.findViewById(R.id.textView1);
holder.txt_speak = (TextView) convertView
.findViewById(R.id.textView2);
convertView.setTag(holder);// 将holder存储到convertView中
} else {
holder = (AnimalViewHolder) convertView.getTag();
}

holder.img_icon.setBackgroundResour
b6bd
ce(mData.get(position).getaIcon());// 设置这个view的背景样式
holder.txt_name.setText(mData.get(position).getaName());
holder.txt_speak.setText(mData.get(position).getaSpeak());

return convertView;
}

}

class AnimalViewHolder {
ImageView img_icon;
TextView txt_name;
TextView txt_speak;
}


表头表尾分割线的设置:

listview作为一个列表控件,他和普通的列表一样,可以自己设置表头与表尾:

以及分割线,可供我们设置的属性如下:

footerDividersEnabled:是否在footerView(表尾)前绘制一个分隔条,默认为true

headerDividersEnabled:是否在headerView(表头)前绘制一个分隔条,默认为true

divider:设置分隔条,可以用颜色分割,也可以用drawable资源分割

dividerHeight:设置分隔条的高度

addHeaderView(View v):添加headView(表头),括号中的参数是一个View对象

addFooterView(View v):添加footerView(表尾),括号中的参数是一个View对象

addHeaderView(headView, null, false):和前面的区别:设置Header是否可以被选中

addFooterView(View,view,false):同上

对了,使用这个addHeaderView方法必须放在listview.setAdapter前面,否则会报错。

设置表头表尾:

1 设置表头表尾布局文件 (以下是表头文件)

view_header.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"
android:gravity="center">
<TextView
android:layout_width="match_parent"
android:layout_height="48dp"
android:textSize="18sp"
android:text="表头"
android:gravity="center"
android:background="#43BBEB"
android:textColor="#FFFFFF"/>
</LinearLayout>


2 java代码

//动态加载顶部View和底部View
final LayoutInflater inflater = LayoutInflater.from(this);
View headView = inflater.inflate(R.layout.view_header, null, false);
View footView = inflater.inflate(R.layout.view_footer, null, false);
//添加表头和表尾需要写在setAdapter方法调用之前!!!
list_animal.addHeaderView(headView);
list_animal.addFooterView(footView);


注:添加表头表尾后,我们发现positon是从表头开始算的,就是你添加的第一个数据本来的postion是 0,但是此时却变成了1,表头也算

以下常用属性



列表从底部开始显示:stackFromBottom

设置点击颜色cacheColorHint

如果你为ListView设置了一个图片作为Background的话,当你拖动或者点击listView空白位置会发现 item都变成黑色了,这是时候我们可以通过这个cacheColorHint将颜色设置为透明:#00000000

隐藏滑动条

我们可以通过设置:android:scrollbars=”none” 或者setVerticalScrollBarEnabled(true);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android listview 布局