复杂布局的ListView
2015-11-16 16:17
381 查看
一、ListView展示的内容,都是有Adapter来适配的。Adapter负责将数据填充到View中,然后由ListView一个一个地显示出来。你可以自定义xml布局来填充数据,ListView展示的效果就是你自定义xml布局的效果。
二、代码实现
2.1 MainActivity.java
2.2 Person.java
2.2 PersonAdapter.java
3、listitem_person.xml
三、扩展
由上述代码实现可知,如果需要自定义布局,只需要在xml中实现你想要的布局,在Adapter中创建ViewHolder来管理xml中的组件,最后给Adapter传入数据即可。
同时,刷新列表后,可以调用PersonAdapter的setData(List persons)和addData(List persons)方法来更新列表。
二、代码实现
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)方法来更新列表。
相关文章推荐
- jquery前言
- VLC搭建RTSP服务器的过程
- Redis总结(一)Redis安装
- 站长不能一味发外链 而要构成网站整体外链建设战略
- 第十二周项目(1):图基本算法库
- 第9周项目3 稀疏矩阵的三元组表示的实现及应用
- 日志实时分析统计平台一 ----- 简介
- 简单理解JSP(二)
- os.path
- Android 侧滑菜单
- Fresco(展示图片)、EventBus(事件传递)
- netstat指令及端口
- substr,substring,slice 的区别
- initWithFrame方法的理解
- universal image loader
- Android Studio 集成SVN
- SpringMVC保存文件工具类--FileUtil
- Android ScrollView嵌套ListView/GridView 导致进入界面定位到ListView/GridView的问题
- Lync 小技巧-9-Lync 2013-手动更新-KB
- 第十二周项目二~~操作用邻接表实现的图