一、介绍
ListView展示的内容,都是有Adapter来适配的。Adapter负责将数据填充到View中,然后由ListView一个一个地显示出来。你可以自定义xml布局来填充数据,ListView展示的效果就是你自定义xml布局的效果。
二、代码实现
2.1 MainActivity.java
public class MainActivity extends Activity {
private ListView mListView;
private PersonAdapter mAdapter;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mListView = (ListView) findViewById(R.id.listview);
mAdapter = new PersonAdapter(MainActivity.this);
mListView.setAdapter(mAdapter);
// 监听列表项的点击事件
mListView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// 获取点击项position的数据
Person p = mAdapter.getItem(position);
}
});
// 构造数据,用于测试
List<Person> persons = new ArrayList<Person>();
for (int i = 0; i < 10; i++) {
Person person = new Person();
person.mName = "测试姓名";
person.mAge = 15;
person.mWeight = 65.2f;
persons.add(person);
}
mAdapter.addData(persons);
}
}
2.2 Person.java
public class Person {
public String mName;
public int mAge;
public float mWeight;
}
2.2 PersonAdapter.java
public class PersonAdapter extends BaseAdapter {
private Context mContext;
private List<Person> mPersons;
public PersonAdapter(Context context) {
mContext = context;
mPersons = new ArrayList<Person>();
}
public void setData(List<Person> persons) {
mPersons.clear();
mPersons.addAll(persons);
// 刷新列表
notifyDataSetChanged();
}
public void addData(List<Person> persons) {
mPersons.addAll(persons);
// 刷新列表
notifyDataSetChanged();
}
@Override
public int getCount() {
return mPersons.size();
}
@Override
public Person getItem(int position) {
return mPersons.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
// 如果view为null,实例化view
convertView = View.inflate(mContext, R.layout.listitem_person, null);
// 将view中的组件用holder保存
holder = new ViewHolder();
holder.mNameTextView = (TextView) convertView.findViewById(R.id.textview_name);
holder.mAgeTextView = (TextView) convertView.findViewById(R.id.textview_age);
holder.mWeightTextView = (TextView)convertView.findViewById(R.id.textview_weight);
// 将holder设置为view的tag,用于复用
convertView.setTag(holder);
} else {
// view不为null,复用之前的holder,此holder保存了view中的组件,不需要再次实例化view,填充新的数据即可
holder = (ViewHolder) convertView.getTag();
}
// 填充数据
holder.setData(getItem(position));
// 返回view,由ListView显示
return convertView;
}
public static class ViewHolder {
public TextView mNameTextView;
public TextView mAgeTextView;
public TextView mWeightTextView;
public void setData(Person person) {
mNameTextView.setText(person.mName);
mAgeTextView.setText(String.valueOf(person.mAge));
mWeightTextView.setText(String.valueOf(person.mWeight));
}
}
}
3、listitem_person.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/textview_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/textview_age"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/textview_weight"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
三、扩展
由上述代码实现可知,如果需要自定义布局,只需要在xml中实现你想要的布局,在Adapter中创建ViewHolder来管理xml中的组件,最后给Adapter传入数据即可。
同时,刷新列表后,可以调用PersonAdapter的setData(List persons)和addData(List persons)方法来更新列表。
四、广告
- 手机如何连电脑?
- 如何与电脑互发文件?
- 如何与电脑互发文字?
- 如何推送通知到电脑?
- 电脑如何远程控制手机的相机?
快牙网传——全部搞定!
不想试试吗?
在豌豆荚等应用商店搜索“快牙网传“,或立即下载 Apk,也可以扫码下载。