在很多时候系统的listview很难满足我们的需要,因为布局比较复杂,所以这时候肯定需要一个布局文件来满足自己需要。这个东西相信大家在网上能搜索一大摞的资料,只是可能感觉不是很适合小白看吧,毕竟有很多大神想追求更加有技术性的东西,我其实想把这些东西简单化,没别的意思。

下面我贴出效果图吧,毕竟是简单化的,没有太多的渲染和繁华。

android 自定义矩形移动 android 自定义布局_List

下面我贴出工程结构图

android 自定义矩形移动 android 自定义布局_android list apadter_02

好了,下面我会一步步详细的介绍如何做listview自定义布局

一、我们需要在layout文件夹下建立一个myapadter.xml布局文件,代码如下:

android:layout_width="match_parent"

android:layout_height="match_parent" >

android:id="@+id/textView1"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignParentLeft="true"

android:layout_alignParentTop="true"

android:layout_marginLeft="40dp"

android:layout_marginTop="48dp"

android:text="TextView" />

android:id="@+id/textView2"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignBottom="@+id/textView1"

android:layout_centerHorizontal="true"

android:layout_marginBottom="20dp"

android:text="不变数据" />

android:id="@+id/textView3"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignRight="@+id/textView2"

android:layout_below="@+id/textView2"

android:text="不变数据" />

二、建立一个Apadter,这个类需要继承BaseApadter。注意里面的getView()方法,getView()返回的是view,这个view就是listview里面的item,所以getview()本身就是一个循环,不需要在里面写循环了。代码注释的比较全面,我就不解释了


package com.yuriko.mybaseapater;

import java.util.List;

import android.content.Context;

import android.view.View;

import android.view.ViewGroup;

import android.widget.BaseAdapter;

import android.widget.TextView;

public class Apadter1 extends BaseAdapter {

private Context context;

//数据源

private List lv;

private TextView textview1;

@Override

public int getCount() {

// 返回lv的长度

return lv.size();

}

@Override

public Object getItem(int arg0) {

// 返回lv的第几个item,其实如果你里面放的是对象,返回的也就是第几个对象

return lv.get(arg0);

}

@Override

public long getItemId(int arg0) {

// 返回item的id,也就是为了在写listview的点击事件时方便使用

return arg0;

}

@Override

public View getView(int arg0, View arg1, ViewGroup arg2) {

//判断arg1是否为空,如果为空就建一个view

//R.layout.myapadter就是listview里面的item,也就是apadter

if(arg1==null){

arg1=View.inflate(context, R.layout.myapadter, null);

}

//绑定控件

textview1=(TextView)arg1.findViewById(R.id.textView1);

//绑定数据

textview1.setText(lv.get(arg0));

return arg1;

}

//构造方法

public Apadter1(Context context, List lv) {

super();

this.context = context;

this.lv = lv;

}

}三、MainActivity,里面基本上没有什么问题,注释的比较全面

package com.yuriko.mybaseapater;

import java.util.ArrayList;

import java.util.List;

import android.app.Activity;

import android.os.Bundle;

import android.view.Menu;

import android.view.View;

import android.widget.AdapterView;

import android.widget.AdapterView.OnItemClickListener;

import android.widget.ListView;

public class MainActivity extends Activity {

private ListView listview1;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

listview1=(ListView)findViewById(R.id.listView1);

//加载Apadter

listview1.setAdapter(new Apadter1(this,data()));

listview1.setOnItemClickListener(new OnItemClickListener() {

@Override

public void onItemClick(AdapterView> arg0, View arg1, int arg2,

long arg3) {

// arg2其实就是第N+1个item

//可能大家就是说会希望每个item触发不同事件,这个就可以做到,但是仅仅限于少量的item,多的话不好用

if(arg2==0){

}else if(arg2==1){

}else{

}

}

});

}

//数据源

private List data(){

//存储数据,里面的类型是String,当然喜欢的话可以选择使用类,用来存储对象

List data=new ArrayList();

//循环添加十个数据

for(int i=0;i<10;i++){

String s="第"+i+"个数据";

//添加数据

data.add(s);

}

return data;

}

}

四、主界面

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" >

android:id="@+id/listView1"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_alignParentTop="true"

android:layout_centerHorizontal="true" >