您的位置:首页 > 其它

复杂布局的ListView

2015-11-16 16:17 381 查看
一、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)方法来更新列表。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: