Android LazyList-ListView滞后于滚动

时间:2014-03-12 14:27:12

标签: android listview

我正在使用LazyList在列表视图中异步加载图片。来自github的例子效果很好,但是当我在我的应用程序中使用它时,一旦我滚动它就会大量滞后。

这是我的代码:

MainActivity:

    public class MainActivity extends Activity {

    public static List<EpisodeEntry> episodes;
    public static ImageLoader imageLoader;
    public ListView list;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        imageLoader = new ImageLoader(this);
        list = (ListView) findViewById(R.id.mainList);
    }

    @Override
    public void onStart() {
        super.onStart();
        new GetXmlTask().execute();
    }


    private class GetXmlTask extends AsyncTask<Boolean, Void, List<String>> {

        private List<EpisodeEntry> episodes = new ArrayList<EpisodeEntry>();

        @Override
        protected List<String> doInBackground(Boolean... booleans) {
           //xml gets parsed into ArrayList episodes
        }


        @Override
        protected void onPostExecute(List<String> xml) {
            if (xml != null) {
                ItemAdapter adapter = new ItemAdapter(getApplicationContext(), episodes);
                list.setAdapter(adapter);
            }
        }

    }

ItemAdapter:     公共类ItemAdapter扩展了ArrayAdapter {

    private final Context context;
    private final List<EpisodeEntry> values;

    public ItemAdapter(Context context, List<EpisodeEntry> values) {
        super(context, R.layout.rowlayout, values);
        this.context = context;
        this.values = values;
    }


    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View rowView = inflater.inflate(R.layout.rowlayout, parent, false);
        ImageView pic = (ImageView) rowView.findViewById(R.id.list_image);
        MainActivity.imageLoader.DisplayImage("...", seriesPic);

        return rowView;
    }
}

FileCache,ImageLoader和MemoryCache类与here完全相同。

图像(50)仅为64x64,大小为几KB。在我的应用程序中滚动而不是在示例应用程序中滚动时为什么会滞后?

1 个答案:

答案 0 :(得分:1)

出现性能问题的原因可能是您的适配器。

如果可用,您应该使用convertView,否则您的适配器将为列表中的每个项目为新视图充气。

View rowView = convertView;
if (rowView == null) {
    rowView = inflater.inflate(R.layout.rowlayout, parent, false);
}

向下滚动列表时,保留可见的视图可以作为convertView重用。使用该代码,您的列表将在列表的可见部分中填充尽可能多的视图,并在滚动时重用这些视图。

同时阅读View Holder以进一步提高列表性能。