Android UI之最优ListView写法
发布日期:2021-05-07 19:00:41 浏览次数:20 分类:精选文章

本文共 5640 字,大约阅读时间需要 18 分钟。

ListView的经典实现方法展示:动态添加、删除行的例子

作为Android开发人员,ListView是最常用的列表控件,其实现动态添加和删除行的功能至关重要。本节将详细介绍ListView的实现方法,并探讨优化策略。

首先,ListView的基本功能实现。通过自定义Adapter类,可以实现数据源与ListView的绑定。Adapter类负责将数据转换为View组,确保ListView能够正确显示数据。

其次,优化 ListView 的性能至关重要。以下优化策略可以帮助提升ListView的运行效率:

  • convertView判空优化。在获取convertView时,首先检查其是否为空。如果为空,则加载对应的布局,避免重复创建View。这种优化可以显著提升性能。

  • 使用 ViewHolder缓存控件。通过将ViewHolder作为View的标签存储,减少了findViewById操作的开销,这也是提高ListView效率的重要方法。

  • 采用分页加载和图片异步加载。在数据量较大的场景下,分页加载可以减少一次性加载过多数据的压力,而图片异步加载则避免了UI卡顿。

  • 代码示例

    以下是一个完整的实现代码示例,展示了从数据模型到ListView展示的完整流程:

    数据模型类:

    public class Data {
    private int id;
    private ImageView image;
    private int num;
    public Data(int id, ImageView image, int num) {
    this.id = id;
    this.image = image;
    this.num = num;
    }
    public int getId() {
    return id;
    }
    public void setId(int id) {
    this.id = id;
    }
    public String getImage() {
    return image;
    // ...
    }
    public void setName(String image) {
    this.image = image;
    }
    public int getNum() {
    return num;
    }
    public void setNum(int num) {
    this.num = num;
    }
    }

    Adapter类:

    public class ShowAdapter extends BaseAdapter {
    private Context mContext;
    private List mList;
    public ShowAdapter(Context context, List list) {
    this.mContext = context;
    this.mList = list;
    }
    @Override
    public int getCount() {
    if (mList != null && !mList.isEmpty()) {
    return mList.size();
    } else {
    return 0;
    }
    }
    @Override
    public Object getItem(int position) {
    if (mList != null && !mList.isEmpty()) {
    return mList.get(position);
    } else {
    return null;
    }
    }
    @Override
    public long getItemId(int position) {
    return position;
    }
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder;
    if (convertView != null) {
    holder = (ViewHolder) convertView.getTag();
    } else {
    convertView = LayoutInflater.from(mContext).inflate(R.layout.adater_line, null);
    holder = new ViewHolder(convertView);
    convertView.setTag(holder);
    }
    Data data = (Data) getItem(position);
    holder.textView.setText(String.valueOf(data.getNum()));
    return convertView;
    }
    static class ViewHolder {
    @InjectView(R.id.imageView)
    ImageView imageView;
    @InjectView(R.id.textView)
    TextView textView;
    ViewHolder(View view) {
    ButterKnife.inject(this, view);
    }
    }
    }

    主界面布局文件:

    Activity类:

    public class MainActivity extends AppCompatActivity {
    @InjectView(R.id.btn_add)
    Button btnAdd;
    @InjectView(R.id.btn_remove)
    Button btnRemove;
    @InjectView(R.id.lv_show)
    ListView lvShow;
    private List list;
    private ShowAdapter showAdapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ButterKnife.inject(this);
    Init();
    }
    private void Init() {
    list = new ArrayList();
    for (int i = 0; i < 3; i++) {
    list.add("123");
    }
    showAdapter = new ShowAdapter(this, list);
    lvShow.setAdapter(showAdapter);
    }
    @OnClick({R.id.btn_add, R.id.btn_remove})
    public void pickDoor(View view) {
    if (view == btnAdd) {
    list.add("123");
    showAdapter.notifyDataSetChanged();
    } else {
    list.remove(0);
    showAdapter.notifyDataSetChanged();
    }
    }
    }

    通过以上代码示例,可以实现一个功能完善的ListView,支持动态添加和删除行。优化策略的实施能够显著提升ListView的性能表现,适用于各种复杂场景。

    ListView优化策略

  • convertView判空优化:在获取convertView时,首先检查其是否为空。如果为空,则加载对应的布局,避免重复创建View,这可以提高200%的效率。

  • 使用ViewHolder缓存控件:通过将ViewHolder作为View的标签存储,减少了findViewById操作的开销,这是提高ListView效率的重要方法,效率提升50%。

  • 分页加载和图片异步加载:当ListView加载数据量较大时,可以采用分页加载和图片异步加载方法,显著减少一次性加载过多数据的压力。

  • Adapter类实现:

    public class ShowAdapter extends BaseAdapter {
    private Context mContext;
    private List mList;
    public ShowAdapter(Context context, List list) {
    this.mContext = context;
    this.mList = list;
    }
    @Override
    public int getCount() {
    if (mList != null && !mList.isEmpty()) {
    return mList.size();
    } else {
    return 0;
    }
    }
    @Override
    public Object getItem(int position) {
    if (mList != null && !mList.isEmpty()) {
    return mList.get(position);
    } else {
    return null;
    }
    }
    @Override
    public long getItemId(int position) {
    return position;
    }
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder;
    if (convertView != null) {
    holder = (ViewHolder) convertView.getTag();
    } else {
    convertView = LayoutInflater.from(mContext).inflate(R.layout.adater_line, null);
    holder = new ViewHolder(convertView);
    convertView.setTag(holder);
    }
    Data data = (Data) getItem(position);
    holder.textView.setText(String.valueOf(data.getNum()));
    return convertView;
    }
    static class ViewHolder {
    @InjectView(R.id.imageView)
    ImageView imageView;
    @InjectView(R.id.textView)
    TextView textView;
    ViewHolder(View view) {
    ButterKnife.inject(this, view);
    }
    }
    }

    通过上述优化策略和代码实现,可以有效提升ListView的性能表现,使其在复杂场景下也能流畅运行。

    上一篇:android代码实现tint,代码View,Model层设计的思考
    下一篇:Android设置某个窗口常亮和最大亮度

    发表评论

    最新留言

    哈哈,博客排版真的漂亮呢~
    [***.90.31.176]2025年04月07日 16时19分13秒

    关于作者

        喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
    -- 愿君每日到此一游!

    推荐文章