0

アプリでリストビューを使用しています。カスタム アダプターを作成し、ビューホルダーのデザイン パターンを使用しました。問題は、スクロールをスムーズにスワイプしてリストビューをスクロールするときですが、fastscroll サムをドラッグしてスクロールすると遅延が大きすぎることです。頻繁に一瞬フリーズします。デフォルトの音楽プレーヤー、どのようにスクロールしても風のようにリストビューがスクロールするなど、携帯電話の他のアプリケーションを確認しました。リストでイメージビューを使用していません。行ごとに 3 つのテキストビューのみです。

完全なコードは次のとおりです。

public class CustomListViewSongs extends BaseAdapter{


    private Context context;

    private ArrayList songs, artist, songduration;


    private static LayoutInflater inflater = null;

    public CustomListViewSongs(Context context, ArrayList songs, ArrayList artist, ArrayList songDuration){
        this.context = context;
        this.songs = songs;
        this.artist = artist;
        this.songduration = songDuration;



    }

    @Override
    public int getCount() {
        return songs.size();
    }

    @Override
    public Object getItem(int position) {
        return songs.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }



    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        Holder holder;
        inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View rowView = convertView;
        if(rowView == null){
            rowView = inflater.inflate(R.layout.customlistviewsongssinglerow, null);
            holder = new Holder();
            holder.songTitle = (TextView) rowView.findViewById(R.id.songTitle);
            holder.songTitleArtist = (TextView) rowView.findViewById(R.id.songTitleArtist);
            holder.songDuration = (TextView) rowView.findViewById(R.id.songDuration);
            rowView.setTag(holder);
        }else{
            holder = (Holder) rowView.getTag();
        }
        holder.songTitle.setText("" + songs.get(position));
        holder.songTitleArtist.setText("" + artist.get(position));
        long duration = Long.parseLong("" + songduration.get(position));
        int seconds = (int) ((duration / 1000) % 60);
        long minutes = ((duration - seconds) / 1000) / 60;
        if (seconds < 10) {
            holder.songDuration.setText("" + minutes + ":0" + seconds);
        } else {
            holder.songDuration.setText("" + minutes + ":" + seconds);
        }
        return rowView;
    }

    public class Holder {
        TextView songTitle, songTitleArtist, songDuration;
        int position;

    }


}

およびリストビュー xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="match_parent"
    android:layout_height="match_parent">
        <ListView
            android:fastScrollEnabled="true"
            android:fastScrollAlwaysVisible="false"
            android:background="@android:color/transparent"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/listView"/>
</RelativeLayout>

そしてそれを呼び出す:

    public class f1 extends Fragment {

    private MainActivity f = new MainActivity();
    private ListView lv;
    private View view;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        view = inflater.inflate(R.layout.f1, container, false);
        populate();
        return view;
    }
    private void populate() {
        lv = (ListView) view.findViewById(R.id.listView);
        lv.setAdapter(new CustomListViewSongs(getActivity(), f.songs, f.artist, f.songsDuration));
    }

}
4

2 に答える 2

1

この行を移動してみてください

inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

内の場合rowView == null。ビューがリサイクルされているため、不必要に何度も呼び出されており、使用されている唯一の場所はその if 条件内です。

それが主な問題かどうかはわかりません。

textViewデフォルト値をに設定し、計算をコメントアウトするだけで、曲の長さの計算が遅れを引き起こしているかどうかをテストすることもできます。改善が見られる場合は、バックグラウンド スレッドで計算を行う必要があります。

編集:ビュー ホルダー パターンを として実装する必要があることに気付きましたstatic class。コードをこれに置き換えます

static class Holder {
        TextView songTitle, songTitleArtist, songDuration;
        int position;
}
于 2015-03-01T13:35:04.417 に答える