在很多时候系统的listview很难满足我们的需要,因为布局比较复杂,所以这时候肯定需要一个布局文件来满足自己需要。这个东西相信大家在网上能搜索一大摞的资料,只是可能感觉不是很适合小白看吧,毕竟有很多大神想追求更加有技术性的东西,我其实想把这些东西简单化,没别的意思。
下面我贴出效果图吧,毕竟是简单化的,没有太多的渲染和繁华。
下面我贴出工程结构图
好了,下面我会一步步详细的介绍如何做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" >