ListViewが一貫してスクロールしないのはなぜですか?

私は現在、約80〜100項目( TextViews )を含む ListView を取り組んでいます。私は内容が多すぎるとは思わないが、(指で)スクロールするときに ListView がボブかレギングしている。しかし、 ListView の右側にある「高速スクロールボタン」を使用すると、スクロールが非常に一貫性とスムーズに見えます。

誰も同じ問題を抱えていましたか? HTC Sensationで ListView をテストしました。

ここに私のListViewコードです:




そして、Javaコード:

adptr = new ArrayAdapter(iF, R.layout.list_item, showing) {

        @Override
        public View getView(int position, View convertView, ViewGroup grp) {

            LinearLayout lin = new LinearLayout(this.getContext());
            lin.setOrientation(LinearLayout.HORIZONTAL);

           //Icon
            ImageView v = new ImageView(this.getContext());
           //v.setBackgroundDrawable(iF.getResources().getDrawable(R.drawable.cube_icon));

           //Text
            TextView txt = new TextView(this.getContext());
            txt.setTextSize(Float.valueOf(prefs.getString("pref_txtSize", "12")));
            txt.setPadding(10, 10, 10, 10);
            txt.setText(this.getItem(position));
            txt.setTextColor(getLineColor(position));

           //Shortcut
            LinearLayout shortLin = new LinearLayout(this.getContext());
            shortLin.setGravity(Gravity.RIGHT);

            LayoutParams par = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
            shortLin.setLayoutParams(par);

            TextView s = new TextView(this.getContext());
            s.setTextSize(Float.valueOf(prefs.getString("pref_txtSize", "12")));
            s.setWidth(iF.getResources().getDimensionPixelSize(R.dimen.shortcutWidth));
            s.setPadding(10, 10, 10, 10);

            s.setText(getShortcut(position));

            shortLin.addView(s);

           //Return
            txt.invalidate();
            v.invalidate();
            s.invalidate();

            lin.addView(v);
            lin.addView(txt);
            lin.addView(shortLin);

            return lin;
        }
    };

ご覧のとおり、カスタマイズした ListView を作成しました。 ArrayAdapter は別の方法で追加されます(ここには表示されません)。

前もって感謝します

エイドリアン

0
getView()で常にtextviewsを無効にする必要があるかどうかわからない
追加された 著者 Sergey Benner,
はい。これはおそらくネセサリーではありません。私はそれが何をしているのか本当にわからない。いくつかのGoogleの研究でこれを発見:)
追加された 著者 aeduG,

3 答え

キャッシュについて覚えていますか?

    public View getView(int position, View convertView, ViewGroup parent) {

    View view = convertView;
    ViewHolder holder;

    if (view == null) {

        LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        view = inflater
                .inflate(R.layout.list_view_home_item, parent, false);

        holder = new ViewHolder();
        holder.title = (TextView) view
                .findViewById(R.id.textView);

        holder.title.setText("blah");
        view.setTag(holder);            
    } else {        
        holder = (ViewHolder) view.getTag();
    }

    return view;

そして

    static class ViewHolder {
    TextView title;
}

4
追加された
この回答に追加するには、ListViewでのGoogle IOイベントの素晴らしいスクリーンキャストを見るのがよいでしょう。 youtube.com/watch?v=wDBM6wVEO70 の助けになりました
追加された 著者 hooked82,
このサイトの良い答えをチェックすることを忘れないでください! ;-)私は昨日同じ問題を抱えている
追加された 著者 Damian Piwowarski,
設定テキスト(holder.title.setText( "blah"))のように使用しますが、cachcingについては覚えておいてください(あなたはそれを無駄に保存しないと、あなたはそれを失ってしまいます)ので、hold.s.setTextSize(Float.valueOf (prefs.getString( "pref_txt‌ Size"、 "12")));とか、ぐらい
追加された 著者 Damian Piwowarski,
答えてくれてありがとう。私はLayoutInflaterについて聞いたことがありません。私はandroid devのページに行き、そのことについてもっと読んでみましょう。
追加された 著者 aeduG,
OK。私はInflaterについての穴のことを研究しました!今、最後の質問:私はどこで私のsetTextSize()をやるのですか?私はそれを更新する必要がありますので、ユーザーは設定で変更することができますので、xmlで作成することはできません。
追加された 著者 aeduG,
はい、私はあなたが意味するものを参照してください。下にスクロールすると、前のすべてが削除されます。私がもう一度上がると、何か他のものが置かれています。
追加された 著者 aeduG,

ビューを取得するたびに、リストのすべての View 要素が動的に作成されます。おそらく最も非効率的なメカニズムです:)。

最初のステップとして、ビューをXMLでレイアウトできるかどうかを確認します。物事の管理を容易にします。

それをしなくても、 convertView パラメータを使用します。その存在の唯一の理由は、可能であれば、ビューを再割り当てする必要がないようにすることです。 convertView がnullでない場合、前回の getView()の呼び出しで作成したすべてのビューがあります。それぞれのビュー(基本的には、あなたの場合は、 setText()呼び出し)に適切な情報を入力するだけです。 convertView がnullの場合、ビューを作成します。

また、 invalidate()しないでください。少なくとも、XMLレイアウトがなければ、少し速いはずの書き換えバージョンがあります。

@Override
public View getView(int position, View convertView, ViewGroup grp) {
    if(convertView == null) {
        LinearLayout lin = new LinearLayout(this.getContext());
        lin.setOrientation(LinearLayout.HORIZONTAL);

       //Icon
        ImageView v = new ImageView(this.getContext());
       //v.setBackgroundDrawable(iF.getResources().getDrawable(R.drawable.cube_icon));

       //Text
        TextView txt = new TextView(this.getContext());
        txt.setId(1);
        txt.setTextSize(Float.valueOf(prefs.getString("pref_txtSize", "12")));
        txt.setPadding(10, 10, 10, 10);
        txt.setTextColor(getLineColor(position));

       //Shortcut
        LinearLayout shortLin = new LinearLayout(this.getContext());
        shortLin.setGravity(Gravity.RIGHT);

        LayoutParams par = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
        shortLin.setLayoutParams(par);

        TextView s = new TextView(this.getContext());
        s.setId(2);
        s.setTextSize(Float.valueOf(prefs.getString("pref_txtSize", "12")));
        s.setWidth(iF.getResources().getDimensionPixelSize(R.dimen.shortcutWidth));
        s.setPadding(10, 10, 10, 10);

        shortLin.addView(s);
        lin.addView(v);
        lin.addView(txt);
        lin.addView(shortLin);
    }

    TextView txt = (TextView)convertView.findViewById(1);
    txt.setText(this.getItem(position));
    TextView txt = (TextView)convertView.findViewById(2);
    txt.setText(getShortcut(position));


    return lin;
}

再び、最良の方法やベストプラクティスではありませんが、これはうまくいくはずです。

2
追加された
どうもありがとうございました。できるだけ早くこのコードをテストします。しかし、このコードでは、ダミアンが推奨するような膨らみはありません。しかし、サポートのおかげで
追加された 著者 aeduG,

最後に、私はこの解決策を思いついた:

@Override
        public View getView(int position, View convertView, ViewGroup parent) {

            View view = convertView;
            ViewHolder holder;

            if (view == null) {

                LayoutInflater inflater = (LayoutInflater) iF.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                view = inflater.inflate(R.layout.list_item, parent, false);

                holder = new ViewHolder();
                holder.title = (TextView) view.findViewById(R.id.item_text);
                holder.shortcut = (TextView) view.findViewById(R.id.item_short);

                holder.title.setId(1);
                holder.shortcut.setId(2);

                holder.title.setText(getItem((position)));
                holder.shortcut.setText(getShortcut(position));

                holder.title.setTextSize(Float.valueOf(prefs.getString("pref_txtSize", "12")));
                holder.shortcut.setTextSize(Float.valueOf(prefs.getString("prefs_txtSize", "12")));

                view.setTag(holder);
            } else {
                holder = (ViewHolder) view.getTag();

                TextView title = (TextView) convertView.findViewById(1);
                title.setText(getItem(position));

                TextView shortcut = (TextView) convertView.findViewById(2);
                shortcut.setText(getShortcut(position));
            }

            return view;
        }

私はそれがうまくいきました。 00:33なので、今私は寝ると思う。今日のための十分な仕事(昨日:)

すべてのサポートありがとう

0
追加された