Android 如何强制重新绘制listview?

Android 如何强制重新绘制listview?,android,android-widget,android-listview,android-adapter,Android,Android Widget,Android Listview,Android Adapter,这个问题与其他类似的问题有点不同。我不是在尝试更新列表中的数据,我是在尝试更新列表的外观 我的应用程序使用支持库基于片段。我有一个PreferenceActivity,允许用户为列表中的文本设置他们想要的颜色(适配器读取首选项并设置颜色)。这在很大程度上是按预期进行的 我遇到的问题如下。当我在屏幕上看到列表(它是一个ListFragment)并打开菜单时,选择Preferences并更改颜色首选项。从PreferenceActivity返回列表后,我似乎无法让列表用指定的新颜色重新绘制自己 如果

这个问题与其他类似的问题有点不同。我不是在尝试更新列表中的数据,我是在尝试更新列表的外观

我的应用程序使用支持库基于片段。我有一个PreferenceActivity,允许用户为列表中的文本设置他们想要的颜色(适配器读取首选项并设置颜色)。这在很大程度上是按预期进行的

我遇到的问题如下。当我在屏幕上看到列表(它是一个ListFragment)并打开菜单时,选择Preferences并更改颜色首选项。从PreferenceActivity返回列表后,我似乎无法让列表用指定的新颜色重新绘制自己

如果我离开列表并返回到它,它将使用新颜色重新生成

我正在尝试使用
onResume
进行更改。我当前拥有的代码(它似乎对列表没有任何作用,但会改变标题颜色):

我尝试了
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);
}

您应该调用您的适配器。

notifyDataSetChanged()
肯定可以为您工作。你是如何处理偏好变化的?如果您只是将首选项提交给SharedReferences,那么它永远不会更新静态MyApplication变量。你能发布你用来设置偏好的代码吗?如果您不使用它,请为颜色首选项设置一个
onPreferenceChangedListener()
,以便在更改时设置该静态变量。

无效、无效视图、notifyDatasetChanged,对我来说没有任何作用! 要更新listview(使用cursoradapter),我只需执行以下操作:

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
但要获得正确的背景颜色、可绘制、下划线文本,我只需:

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

我不喜欢Barak解决方案,因为它看起来很重,而且在不需要的时候执行代码。

你错过了我在帖子中说我尝试过但没有成功的那部分吗?只是又试了一次,还是一样。没有重新绘制视图。能否从适配器发布getView()方法?在getView()中的何处设置文本颜色为首选项中的颜色?
first.setTextColor(MyApplication.shoplistitem_name)。当PreferenceActivity退出时,它从
MyApplication
调用一个方法,该方法将所有首选项读入整个应用程序中使用的静态变量。HassTableId()是否返回false?如果不是,那么在HassTableId()中返回false时会发生什么情况呢。。。这为我找到问题指明了方向。。。我觉得自己非常愚蠢。我正在调用
MyApplication.setPreferences
。方法是
MyApplication.setPrefs
。叹息