这是我第一次写博客,目的是为了记录自己学习android过程中的心得,这是我对自定义listview学习的一些认识,
本人觉得还可以,所以就写出来分享一下,希望文章也能对大家的学习有帮助。
首先看一下布局文件,布局文件有两个,一个为listview,另一个为listview_item:
含有listview的主布局文件:
activity_main.xml
<RelativeLayout 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:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<ListView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/listview">
</ListView>
</RelativeLayout>
listview_item的布局文件:
listview_item.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<ImageView
android:id="@+id/icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/icon"
android:layout_alignParentLeft="true"/>
<TextView
android:id="@+id/area"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@+id/photo"
android:layout_marginLeft="50dp"
android:text="960平方米"
android:layout_alignTop="@+id/icon"/>
<TextView
android:id="@+id/money"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignTop="@+id/area"
android:layout_marginLeft="15dp"
android:layout_toRightOf="@+id/area"
android:height="25dp"
android:text="2500万" />
<TextView
android:id="@+id/introduce"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="临海别墅,领先国际"
android:layout_marginTop="5dp"
android:layout_below="@+id/area"
android:layout_alignLeft="@+id/area"/>
</RelativeLayout>
接着就是要定义一个含有需要填充的变量的类:
这个类中的变量填充的类型如:TextView中用于显示的Text属性,ImageView中显示图片
这个应该很容易看得懂的。
package com.example.mylistview;
import android.graphics.Bitmap;
/**
*
* @author St-Eyse 这是listviewitem 的类,在此类中定义好ListView每个项要填充的变量
* 在此例子中我要填充的是四个变量,此类的编写没什么难点
*
*/
public class HouseInfo {
private String area; // 面积
private String money; // 价格
private String introduce; // 简介
private Bitmap icon; // 图标
public void setArea(final String area) {
this.area = area;
}
public void setMoney(final String money) {
this.money = money;
}
public void setIntroduce(final String introduce) {
this.introduce = introduce;
}
public void setIcon(final Bitmap icon) {
this.icon = icon;
}
public String getArea() {
return area;
}
public String getMoney() {
return money;
}
public String getIntroduce() {
return introduce;
}
public Bitmap getIcon() {
return icon;
}
}
然后就到了最关键的一步了;给listview编写适配器
package com.example.mylistview;
import java.util.ArrayList;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
public class HouseInfoAdapter extends BaseAdapter {
// 声明一个list,用于接收在Activity中传过来的list
ArrayList<HouseInfo> list = new ArrayList<HouseInfo>();
// 声明一个布局填充器,用于动态布局的填充
LayoutInflater myInflater = null;
Demo demo = new Demo();
public HouseInfoAdapter(final Context context,
final ArrayList<HouseInfo> list) {
myInflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
this.list = list;
}
@Override
// 获取list中的内容数量
public int getCount() {
if (list == null) {
return 0;
}
return list.size();
}
@Override
// 获取list中子项的内容
public Object getItem(final int arg0) {
if (list == null) {
return null;
}
return list.get(arg0);
}
@Override
// 获取list中子项的ID
public long getItemId(final int position) {
if (list == null) {
return 0;
}
return position;
}
@Override
// 这个方法是最重要的,每次子项的内容convertView填充完成,都会返回一个View给ViewGroup中的parent,
// 最终得到整个ListView
public View getView(final int position, View convertView,
final ViewGroup parent) {
// 把布局文件填充到View中
convertView = myInflater.inflate(R.layout.listview_item, null);
// 如果convertView为null,就用findViewById的方法自行查找
if (convertView == null || position < list.size()) {
demo.area = (TextView) convertView.findViewById(R.id.area);
demo.money = (TextView) convertView.findViewById(R.id.money);
demo.introduce = (TextView) convertView
.findViewById(R.id.introduce);
demo.icon = (ImageView) convertView.findViewById(R.id.icon);
} else {
// 把convertView代表的布局文件给demo,等于demo和convertView共同使用一个布局控件
demo = (Demo) convertView.getTag();
}
// System.out.println("=============" + demo);
demo.area.setText(list.get(position).getArea());
demo.money.setText(list.get(position).getMoney());
demo.introduce.setText(list.get(position).getIntroduce());
demo.icon.setImageBitmap(list.get(position).getIcon());
return convertView;
}
// 需要填充的Demo,这里是你需要填充的形式,你需要也什么类形填充就在这定义
public class Demo {
public TextView area;
public TextView money;
public TextView introduce;
public ImageView icon;
}
}
最后在Activity中给listview绑定好adapter,并定义一个ArrayList来接收填充的数据,代码如下:
package com.example.mylistview;
import java.util.ArrayList;
import android.app.Activity;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.view.Menu;
import android.widget.ListView;
public class MainActivity extends Activity {
private ArrayList<HouseInfo> list = new ArrayList<HouseInfo>();
private ListView listView = null;
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getHouse();
getView();
}
// 此方法用于为listview添加适配器
private void getView() {
// 找到布局文件中的listview
listView = (ListView) findViewById(R.id.listview);
HouseInfoAdapter adapter = new HouseInfoAdapter(MainActivity.this, list);
listView.setAdapter(adapter);
}
// 此方法用来使list填入具体的子项内容,也可以填入数据库中动态的数据
private void getHouse() {
for (int i = 0; i < 6; i++) {
HouseInfo house = new HouseInfo();
house.setArea("960平方米");
house.setMoney("2500万");
house.setIntroduce("临海别墅,引领国际");
house.setIcon(BitmapFactory.decodeResource(getResources(),
R.drawable.icon));
list.add(house);
}
}
@Override
public boolean onCreateOptionsMenu(final Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
因为代码中已经有注释,在这里就不在累赘了;
因为我也是android的学习者,有什么理解得不对的,请各位多多指教...