2012-06-20 16 views
5

この質問は、類似のタイトルの他の質問とは少し異なります。私はリストのデータを更新しようとしていません、私はのリストを参照してくださいを更新しようとしています。リストビューの再描画を強制するには?

私のアプリは、サポートライブラリを使用してフラグメントベースです。私はPreferenceActivityを持っています。ここでは、リスト内のテキストの色を設定することができます(アダプターは、プリファレンスを読み取り、色を設定します)。これは、ほとんどの場合、期待どおりに動作しています。

問題は次のとおりです。画面上にリスト(ListFragment)が表示され、メニューが表示されたら、「環境設定」を選択して色の設定を変更します。 PreferenceActivityからリストに戻ると、指定した新しい色でリストを再描画するようには思えません。

リストから離れて戻ってくると、新しい色で再生されます。

私はonResumeを使用して変更しようとしています。私は現在持っているコードは(それはリストに何かをするように見えるが、それは必要として、ヘッダーの色を変更しません):

@Override 
public void onResume() { 
    super.onResume(); 
    header.setTextColor(MyApplication.header); 
    line.setBackgroundColor(MyApplication.header_line); 
    subheader.setTextColor(MyApplication.header); 
    getListView().invalidateViews(); 
} 

私はinvalidateViewsinvalidateを試してみました。私は絶望的に、データ自体に変更がなくても、notifyDataSetChangedをアダプタで呼び出そうとしました。何も動作していないようです。

明らかなものがないか、これを行う方法はありませんか?

EDIT

私のアダプタから「getView`方法:

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    if (convertView == null) 
     convertView = View.inflate(context, layout, null); 
    View row = convertView; 
    c.moveToPosition(position); 
    TextView first = (TextView) convertView.findViewById(R.id.ListItem1); 
    TextView second = (TextView) convertView.findViewById(R.id.ListItem2); 
    TextView third = (TextView) convertView.findViewById(R.id.ListItem3); 
    TextView fourth = (TextView) convertView.findViewById(R.id.ListItem4); 

    DecimalFormat df = new DecimalFormat("0.00"); 
    Double hold = Double.valueOf(c.getString(3)); 
    Double qty = Double.valueOf(c.getString(1)); 
    Double total = hold * qty; 

    String color = "#FF00FF"; 
    first.setText(c.getString(2)); 
    first.setTextColor(MyApplication.shoplistitem_name); 
    second.setText(c.getString(4)); 
    second.setTextColor(MyApplication.shoplistitem_desc); 
    third.setText(c.getString(1)); 
    third.setTextColor(MyApplication.shoplistitem_qty); 
    fourth.setText("$" + df.format(total)); 
    fourth.setTextColor(MyApplication.shoplistitem_desc); 

    if (strikethroughState[position] == 1) { 
     first.setPaintFlags(first.getPaintFlags() 
       | Paint.STRIKE_THRU_TEXT_FLAG); 
     second.setPaintFlags(second.getPaintFlags() 
       | Paint.STRIKE_THRU_TEXT_FLAG); 
     third.setPaintFlags(third.getPaintFlags() 
       | Paint.STRIKE_THRU_TEXT_FLAG); 
     fourth.setPaintFlags(third.getPaintFlags() 
       | Paint.STRIKE_THRU_TEXT_FLAG); 
     row.setBackgroundColor(MyApplication.shoplistitem_checked); 
    } else { 
     first.setPaintFlags(first.getPaintFlags() 
       & ~Paint.STRIKE_THRU_TEXT_FLAG); 
     second.setPaintFlags(second.getPaintFlags() 
       & ~Paint.STRIKE_THRU_TEXT_FLAG); 
     third.setPaintFlags(third.getPaintFlags() 
       & ~Paint.STRIKE_THRU_TEXT_FLAG); 
     fourth.setPaintFlags(third.getPaintFlags() 
       & ~Paint.STRIKE_THRU_TEXT_FLAG); 
     row.setBackgroundResource(R.color.black); 
    } 
    return (row); 
} 

答えて

7

notifyDataSetChanged()は確かにあなたのために働いているはずです。どのように嗜好の変化を処理していますか? SharedPreferencesにプリファレンスをコミットするだけの場合は、静的なMyApplication変数を更新することはありません。あなたは設定を設定するために使用しているコードを投稿できますか?あなたがそれを使用していない場合は、その静的変数が変更されたときにそれを設定するために、色の優先度をonPreferenceChangedListener()に設定します。

+1

まあ...これは私の問題を見つけるのに向いていた...そして、私は信じられないほど馬鹿だと感じる。私は 'MyApplication.setPreferences'を呼び出していました。このメソッドは 'MyApplication.setPrefs'です。 *一口* – Barak

1

あなたのアダプタのnotifyDataSetChanged()を呼び出す必要があります。

+3

私はあなたが私がそれを試してみて、それはうまくいかないと言った私の記事の部分を欠場しましたか?もう一度試してみました。ビューの再描画はありません。 – Barak

+0

アダプタからgetView()メソッドを投稿できますか? – Gallal

+0

'getView'メソッドを追加するように編集されました。 – Barak

0

無効にする、無効にする、notifyDatasetChanged、nothin私のために働いた!

cur = db.rawQuery("SELECT * FROM ssnt WHERE mid = 1000"); //optional, initial query 
adapter.changeCursor(cur); // or swapCursor(), cur is the initial and the only cursor 

しかし、正しい背景色、描画可能を持っている、テキストに下線を引き、私はちょうど行います:

cur = db.rawQuery("SELECT * FROM ssnt WHERE mid = 1000"); 
adapter.changeCursor(cur); 
list.setAdapter(adapter); //just like I did oncreate 

私はバラク・ソリューションを好まない私はちょうど行う(cursoradapter付き)リストビューを更新するには それは重い重さのように見え、必要でないときはコードを実行します。

関連する問題