8

この質問は、同様のタイトルの他の質問とは少し異なります。リスト内のデータを更新しようとしているのではなく、リストの外観を更新しようとしています。

私のアプリは、サポート ライブラリを使用したフラグメント ベースです。ユーザーがリスト内のテキストに希望する色を設定できるようにする 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();
}

私は試してみinvalidateViewsましinvalidateた。notifyDataSetChangedデータ自体に変更はありませんでしたが、必死になってアダプターを呼び出してみました。何も機能していないようです。

明らかな何かが欠けていますか、それともこれを行う方法はありませんか?

編集

私のアダプターからの「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);
}
4

3 に答える 3

10

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

于 2012-06-20T18:10:52.880 に答える
3

アダプターでnotifyDataSetChanged()を呼び出す必要があります。

于 2012-06-20T16:12:50.210 に答える