复杂布局的ListView

一、介绍

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 persons = new ArrayList();
        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 mPersons;

    public PersonAdapter(Context context) {
        mContext = context;
        mPersons = new ArrayList();
    }

    public void setData(List persons) {
        mPersons.clear();
        mPersons.addAll(persons);
        // 刷新列表
        notifyDataSetChanged();
    }

    public void addData(List 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


<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,也可以扫码下载。
这里写图片描述

你可能感兴趣的:(Android)