如何优化Android ListView?

时间:2013-04-24 19:53:27

标签: android listview

我已经自定义了我的ListAdapter,并在一行中显示了3个不同的图像(项目)。 它完美地工作(根据它的功能)。 但是,无法顺利滚动ListView。

我在ImageViews上使用setBackgroundImage,我使用HashMap来缓存resourceId;所以我不必使用

resId=getContext().getResources().getIdentifier(resName, "drawable",appContext.getPackageName());

一次又一次。

我认为我错过了一些东西,因为ListView不能很好地滚动。此外,如果我在平板电脑上尝试,我的代码会连续自动填充超过3个项目,平板电脑的列表视图几乎不可滚动。

我在这里做错了什么?

更新

我在我的Flags(国家标志)中以编程方式创建ListView Activity的onCreate方法:

root=(ViewGroup)this.findViewById(R.id.root);

    listView=new ListView(this);
    listView.setLayoutParams(new LayoutParams(
        LayoutParams.MATCH_PARENT,
        LayoutParams.MATCH_PARENT));

    /*
    ArrayList<Country> dataList=new ArrayList<Country>(){{
        add(new Country("jp"));
        add(new Country("de"));
        add(new Country("it"));
    }};*/

    CountryListAdapter countryListAdapter=new CountryListAdapter(this);


    countryListAdapter.setDataSource(allCountries);


    listView.setAdapter(regionListAdapter);
    listView.setBackgroundColor(0xFF000000);
    listView.setDividerHeight(0);

    root.addView(listView);

listView=new ListView(this); listView.setLayoutParams(new LayoutParams( LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); /* ArrayList<Country> dataList=new ArrayList<Country>(){{ add(new Country("jp")); add(new Country("de")); add(new Country("it")); }};*/ CountryListAdapter countryListAdapter=new CountryListAdapter(this); countryListAdapter.setDataSource(allCountries); listView.setAdapter(regionListAdapter); listView.setBackgroundColor(0xFF000000); listView.setDividerHeight(0); root.addView(listView);

3 个答案:

答案 0 :(得分:9)

学习,研究和学习; - )

我的提示是使用 ViewHolder 模式,用于大量相同布局的项目(即使它是最简单的项目,例如单个TextView)

还有这个ViewHolder实现示例/库

此外,如果您在ListView项目布局中使用图像,则可以使用某些库异步下载图像,例如:

答案 1 :(得分:3)

  1. 使用静态ViewHolder模式

  2. 充气布局是一项昂贵的任务,所以尽量避免给布局充气
    替换

    LayoutInflater mInflater = LayoutInflater.from(context);
    convertView = mInflater.inflate(R.layout.listview_item, null);
    

    。通过

    if (convertView == null) {
    
        LayoutInflater mInflater = LayoutInflater.from(context);
        convertView = mInflater.inflate(R.layout.listview_item, null);
    }
    
  3. 在单独的线程中执行图像加载任务,以便getView只关注查看图纸

  4. 在您的活动主题中添加<item name="android:windowNoTitle">true</item>

  5. 在ListView中添加属性android:animationCache="false"

  6. 在ListView中添加属性android:scrollingCache="false"

答案 2 :(得分:2)

你应该使用View Holder模式,如果没有连接调试器,滚动是否很慢,也要测试。