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のアプローチは次のとおりです。

一度に4つの表示アイテムがあるとしますListView。で1000番目のアイテムまでスクロールしても、4回Viewと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

何してるの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 に答える
0

この質問を参照して、そこで私の答えを参照してください。カスタムアダプタクラスでコンポーネントを宣言する方法を示しています。ここで提案した質問にも同様の問題があったため、クラスにこれらの変更を加えると、問題は確実に解決されます。コスチューム化された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 に答える