0

我创建了一个自定义列表视图,除了列表不能平滑滚动之外,它的效果很好。它波涛汹涌而缓慢。

这是我填充列表视图的代码:

@Override
        public View getView(int position, View convertView, ViewGroup parent) {
            View v = convertView;
            if (v == null) {
                LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            v = vi.inflate(R.layout.listitem, null);
        }

        FilmRecord film = films.get(position);
        if (film != null) {
            TextView filmTitle = (TextView) v.findViewById(R.id.filmtitle);
            TextView filmShowingDate = (TextView) v.findViewById(R.id.filmshowingtime);
            TextView filmAdded = (TextView) v.findViewById(R.id.filmadded);
            TextView filmLocations = (TextView) v.findViewById(R.id.filmlocations);
            TextView filmDescription = (TextView) v.findViewById(R.id.filmdescription);
            TextView filmProvider = (TextView) v.findViewById(R.id.filmprovider);
            TextView filmTicketUrl = (TextView) v.findViewById(R.id.filmticketurl);


            if (filmTitle != null) {
                filmTitle.setText(film.filmTitle);
            }

            if(filmDescription != null) {
                filmDescription.setText(film.filmDescription );
            }

            if(filmLocations != null) {
                filmLocations.setText(film.filmLocations );
            }

            if(filmShowingDate != null) {
                filmShowingDate.setText("Showing: " + film.filmShowingDate );
            }

            if(filmAdded != null) {
                filmAdded.setText("Added on: " + film.filmAdded );
            }

            if(filmProvider != null) {
                filmProvider.setText(film.filmProvider );
            }

            if(filmTicketUrl != null) {
                filmTicketUrl.setText(film.filmTicketUrl );
            }
        }

        //Check who the provider is and set the imageview to provider logo
        ImageView imageView = (ImageView) v.findViewById(R.id.providerImage);
        if(film.filmProvider.equals("Cineworld")) {
            Log.d("Provider", "Provider is Cineworld");
            imageView.setImageResource(R.drawable.cineworld);
        }
        else if(film.filmProvider.equals("Show Film Fist")){
            Log.d("Provider", "Provider is Show Film Fist");
            imageView.setImageResource(R.drawable.show_film_first);
        }

        return v;
    }

创建自定义列表视图时有人遇到过类似的问题吗?一如既往的任何帮助将不胜感激:)

4

5 回答 5

5

你需要使用ViewHolder方法。

因为通过 id 查找视图也需要时间来执行。

通过使用ViewHolder方法,您将能够通过缓存视图来最小化在通过 id 查找视图期间创建的负载:)

是很好的教程如何做到这一点。

编辑:

ViewHolder 方法的作用是:

假设您ListView一次有 4 个可见项目。即使您滚动到第 1000 个项目,您也必须充气View4 次和4 次。findViewById()ListView

但是如果你不使用ViewHolder并且你已经放了

if (v == null) {
   LayoutInflater vi = ...;
}else{
   //... other implementation 
}

您只需充气View4 次,但每次调用时findViewById()都会调用(通常是滚动时)。getView()ListView

快乐编码!

于 2012-02-20T10:00:39.663 回答
1

我今天遇到了同样的问题,在使用 viewHolder 模式时滚动仍然很慢,直到我想向同事展示这个问题并注意到滚动很流畅。所以我的问题是我连接到调试器并且减慢了速度。

于 2012-07-20T11:40:18.660 回答
0

请参考这个问题并在那里查看我的答案。它显示了您应该如何在自定义适配器类中声明您的组件。对您的类进行这些更改肯定会解决您的问题,因为我在这里建议的问题也有与您类似的问题:Scrolable带有定制化 BaseAdapter 的 ListView 非常慢

于 2012-02-20T10:07:50.720 回答
0

检查此链接 http://www.javacodegeeks.com/2012/06/android-smooth-list-scrolling.html

并将其添加到 Activity OnCreate() 方法中

protected void onCreate(Bundle savedInstanceState) {

    //StrictMode for smooth list scroll
    StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().detectDiskReads().detectDiskWrites().detectNetwork().penaltyLog().build());

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    /*----- 
        ListView 
        Custom Adapter set data....
    ------*/

}

于 2014-03-21T12:20:13.967 回答
0

你在做什么films.get(position)

如果您正在从数据库中读取,那么您的滚动可能真的很糟糕......

使用数据库时,您应该在 onCreate 期间将数据加载到适配器中,可能是这样的(但使用您以前的列表视图布局等)

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    List<FilmRecord> values = films.getAllFilms();


    ArrayAdapter<FilmRecord> adapter = new ArrayAdapter<FilmRecord>(this,
                your_list_item_layout_id, values);
    your_list_view.setListAdapter(adapter);
}

在该getView()方法中,您只需询问适配器:

FilmRecord film = getItem(position);
于 2012-02-20T09:58:03.127 回答