2012-04-03 24 views
1

Androidで奇妙な問題に苦しんでいます。AndroidでListViewが消えるListView

リスト要素のカスタムビューを持つListViewがあります。このカスタムビューには、ProgressBarとRadioButtonが含まれています。 Here's a nice screenshot

ラジオを確認してアクションモードを開始すると、すべてのプログレスバーが消えます。 Here's another screenshot

画面の向きが変わったり、キーパッドを開いたままにすると、すべて正常に戻ります。

アダプターのリサイクルビューに関連するこの種の問題について、多くの記事を見てきました。ただし、ListView.invalidateViewsを呼び出しても効果はありません。 ListView全体を完全にリフレッシュする方法はありますか?設定の変更があるたびに、あなたのActivityが破壊され、その後、再作成されるので、これが起こる

public class SimpleContactsCursorAdapter extends SimpleCursorAdapter { 

    public SimpleContactsCursorAdapter(Context context, int layout, Cursor c, String[] from, 
      int[] to, int flags) { 
     super(context, layout, c, from, to, flags); 
    } 

    @Override 
    public void bindView(View view, Context context, Cursor cursor) { 
     TextView nameView = (TextView) view.findViewById(R.id.contact_item_name); 
     TextView callView = (TextView) view.findViewById(R.id.contact_call_text); 
     ProgressBar progressBar = (ProgressBar) view.findViewById(R.id.contact_item_progress); 

     String name = cursor.getString(Contact.Columns.COLUMN_INDEX_NAME); 
     int delta = cursor.getInt(Contact.Columns.COLUMN_INDEX_DELTA); 
     String callString; 

     nameView.setText(name); 

     if (delta >= 0) { 
      callString = getString(R.string.call_in, delta); 
     } 
     else { 
      callString = getString(R.string.days_late, Math.abs(delta)); 
      progressBar.setProgressDrawable(mResources.getDrawable(R.drawable.late_progress_bar)); 
     } 
     callView.setText(callString); 

     progressBar.setProgress(Math.abs(delta)); 
    } 
}; 

答えて

1

は、ここに私のアダプタのコードです。たとえば、画面の向きが変更された場合、新しい画面の向きを表示する前にActivityが破棄され、再作成されます。問題は、Androidがあなたのアクティビティの状態を破壊する前に自動的に保存しないということです。デフォルトでは、Activityが破壊された場合、そのデータはすべて失われます。

アクティビティの状態を保存するには、onSaveInstanceState(Bundle savedInstanceState)をオーバーライドして手動でデータを保存する必要があります。保存したデータを取得するには、onRestoreInstanceState(Bundle savedInstanceState)を上書きする必要があります。実行時の変更を処理する方法に関する詳細情報については

、このリンクをご覧ください。http://developer.android.com/guide/topics/resources/runtime-changes.html

+0

ありがとうございます。しかし、これは私の質問に答えることはできません。なぜなら、「アクティビティ」が破壊されていないとき、プログレスバーが消えるのはなぜですか? –

2

これは、リサイクルの問題のように見えるが、それは実際にはそれよりもはるかに簡単です。何が起こるのかは、プログレスバーのドロウアブルがその範囲のトラックを失うと0に設定され、したがって消えます。境界線を保存して、次のようにリセットすることで回避することができます。

public class SimpleContactsCursorAdapter extends SimpleCursorAdapter { 

public SimpleContactsCursorAdapter(Context context, int layout, Cursor c, String[] from, 
     int[] to, int flags) { 
    super(context, layout, c, from, to, flags); 
} 

@Override 
public void bindView(View view, Context context, Cursor cursor) { 
    TextView nameView = (TextView) view.findViewById(R.id.contact_item_name); 
    TextView callView = (TextView) view.findViewById(R.id.contact_call_text); 
    ProgressBar progressBar = (ProgressBar) view.findViewById(R.id.contact_item_progress); 

    String name = cursor.getString(Contact.Columns.COLUMN_INDEX_NAME); 
    int delta = cursor.getInt(Contact.Columns.COLUMN_INDEX_DELTA); 
    String callString; 

    nameView.setText(name); 

    if (delta >= 0) { 
     callString = getString(R.string.call_in, delta); 
    } 
    else { 
     callString = getString(R.string.days_late, Math.abs(delta)); 

Rect bounds = progressBar.getProgressDrawable().getBounds(); //Save the drawable bound 
progressBar.setProgressDrawable(mResources.getDrawable(R.drawable.late_progress_bar)); 
progressBar.getProgressDrawable().setBounds(bounds); //Set the bounds to the saved value 
} 
    callView.setText(callString); 

    progressBar.setProgress(Math.abs(delta)); 
} }; 

希望します。

+0

まあ、私を大いに助けてくれました。本当にありがとうsooo ...私はこれが質問への受け入れられた答えだったはずだと思います。この行動はジンジャーブレッドで起こるようです。 JellyBeanは大丈夫だった。私はこれに非常に似た問題がありましたが、ユーザーがスクロールダウンしたときに消えていたリストビューのプログレスバーが基本的に同じでした – Hevski

+0

また、問題が発生していて、正しく設定されていない状態で0にリセットしてから、progressBarItemRating.setProgress ); \t \t \t \t progressBarItemRating.setProgress(Item.getRating()); – Hevski

+0

Gingerbread Android 2.3で動作する –