2012-02-06 11 views
0

私は現在、約80から100のアイテム(TextViews)を含むListViewに取り組んでいます。私はそれがあまりにも多くの内容だとは思わないが、私は(指で)スクロールするとListViewはボビングやレイジングです。しかし、私がListViewの右側にある「高速スクロールボタン」を使用すると、スクロールが非常に一貫して滑らかに見えます。ListViewが一貫してスクロールしないのはなぜですか?

誰も同じ問題がありましたか? HTC SensationでListViewをテストしました。ここで

は私のListViewコードです:

<ListView 
    android:id="@+id/list_view" 
    android:layout_height="match_parent" 
    android:layout_width="match_parent" 
    android:scrollingCache="true"> 

</ListView> 

とJavaコード:

adptr = new ArrayAdapter<String>(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メソッド() –

+0

そうであなたのtextviewsすべての時間を無効にしている場合ではないことを確認。これはおそらくネセサリーではありません。私はそれが何をしているのか本当にわからない。いくつかのGoogleの研究でこれを見つけた:) – aeduG

答えて

4

あなたがキャッシュについて覚えていますか?

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; 
} 

+0

答えをありがとう。私はLayoutInflaterについて聞いたことがありません。私はandroid devのページに行き、そのことについてもっと読んでみましょう。 – aeduG

+0

この回答に追加するには、ListViewのGoogle IOイベントをスクリーンキャストするのは良いことです。それは私を助けたhttp://www.youtube.com/watch?v=wDBM6wVEO70 – hooked82

+0

このサイトで良い答えをチェックすることについて忘れないでください! ;-) 私は昨日同じ問題を抱えています –

2

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

最初の手順として、ビューを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; 
} 

また、最良の方法ではなく、ベストプラクティスですが、これはうまくいくはずです。

+0

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

0

最後に、私はこの解決策を考え出した:

@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なので、今私は寝ると思う。今日のための十分な作業(昨日:)すべてのサポートのための

おかげ

関連する問題