在我刚入Android的时候,真心觉得ListView的自定义适配器好难啊,不过后来写的多了,渐渐发现它的使用方式也就那点套路,初期自学的话上手不易,但是真的上手了就会很简单了,当然了,listview的运用扩展性特别强,所以后期还得靠自己的悟性,废话不多说,最初级的教程奉上,(大神勿喷,本人菜鸟,不当之处多多包涵)
主窗体至少得有一个listview控件吧,既然是自定义适配器,还少不了一个自定义布局的视图(view),【新手请看:listview是一个数据列表,这个自定义视图就是来定义每一行的布局】,视图的东西好像就这么多,下面是代码了
自定义视图的xml布局代码
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="50dp" >
<TextView
android:id="@+id/textName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_weight="1"
android:gravity="center"
android:text="TextView" />
<TextView
android:id="@+id/textSex"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_weight="1"
android:gravity="center"
android:text="TextView" />
<TextView
android:id="@+id/textAge"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_weight="1"
android:gravity="center"
android:text="TextView" />
LinearLayout>
LinearLayout>
需要写两个类,一个是继承于BaseAdapter的自定义适配器类,暂且命名为CustomAdapter吧,还有一个类似于枚举但又不是枚举的类(这就有点尴尬了),可能有大神写成别的方式了,我个人认为我这方式也可以满足需要,类名CustomMessageItems,直接上代码吧,简单粗暴,代码里都有注释
CustomAdapter类
import java.util.ArrayList;
import java.util.List;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
import com.example.listview.R;
public class CustomAdapter extends BaseAdapter {
private LayoutInflater mInflater;
private Context context;
private List mMessageItem = new ArrayList();
public CustomAdapter(Context context, List mMessageItem) {
this.context = context;
this.mInflater = LayoutInflater.from(context);
this.mMessageItem = mMessageItem;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return mMessageItem.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return mMessageItem.get(position);
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// 这块代码是自定义适配器的关键,用来为自定义视图赋值以及其他操作
ViewHolder holder;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.lv_custom_item, null);// 将自定义xml视图装载进convertView
holder = new ViewHolder(convertView);// 然后通过实例化,将视图传给自定义类ViewHolder,在ViewHolder中声明并绑定自定义视图中的控件
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
CustomMessageItems item = mMessageItem.get(position);
holder.txtName.setText(item.Name);
holder.txtSex.setText(item.Sex);
holder.txtAge.setText(item.Age);
return convertView;// 将装载完毕的视图返回给listview
}
private class ViewHolder {
TextView txtName, txtSex, txtAge;
public ViewHolder(View v) {
txtName = (TextView) v.findViewById(R.id.textName);
txtSex = (TextView) v.findViewById(R.id.textSex);
txtAge = (TextView) v.findViewById(R.id.textAge);
}
}
}
我觉得注释已经很详细了,就不多言了。
CustomMessageItems类(这个不伦不类,见笑了)
public class CustomMessageItems {
public String Name;
public String Sex;
public String Age;
}
这个类就这么多,主要是为每一行的自定义布局提供数据
视图和类都准备好了,开始将自定义视图与listview建立联系,这才是我们的最终目的!
listview控件声明的事我就不提了
准备数据
实例化一个装载CustomMessageItems 的List数据集,用来收集数据
List<CustomMessageItems> mMessageItem = new ArrayList<CustomMessageItems>();
实例化适配器
将刚才自定义的适配器进行实例化,传入List数据集和当前Context
CustomAdapter myAdapter;//声明部分
myAdapter = new CustomAdapter(MainActivity.this, mMessageItem);
接着就是将Adapter装载进listview
listview.setAdapter(myAdapter);
以下是完整代码
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ListView;
import com.example.listview.R;
public class MainActivity extends Activity {
ListView listview;
List mMessageItem = new ArrayList();
CustomAdapter myAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listview = (ListView) findViewById(R.id.listView1);
bindDate();
}
private void bindDate() {
// TODO Auto-generated method stub
CustomMessageItems item = new CustomMessageItems();
item.Name = "李明";
item.Sex = "男";
item.Age = "20岁";
mMessageItem.add(item);
item = new CustomMessageItems();
item.Name = "小红";
item.Sex = "女";
item.Age = "12岁";
mMessageItem.add(item);
item = new CustomMessageItems();
item.Name = "张萌萌";
item.Sex = "女";
item.Age = "28岁";
mMessageItem.add(item);
item = new CustomMessageItems();
item.Name = "刘韬";
item.Sex = "男";
item.Age = "22岁";
mMessageItem.add(item);
myAdapter = new CustomAdapter(MainActivity.this, mMessageItem);
listview.setAdapter(myAdapter);
}
}
很清晰了吧,收工!
源码地址:http://download.csdn.net/download/qq_23931287/9944412
发现一个很严重的问题,我刚知道,资源下载至少一积分,这就有点尴尬了,老规矩,需要源码工程的留邮箱