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

我的学习之旅:android:ListView的初步认识

2014-02-11 16:43 477 查看
这是我第一次写博客,目的是为了记录自己学习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的学习者,有什么理解得不对的,请各位多多指教...



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: