ListView刷新主题

时间:2014-07-15 16:06:09

标签: android listview android-listview

上个星期我遇到困扰我的问题。我有一个与ArrayAdapter连接的listView

@Override
protected void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    chkSendMe=(CheckBox)findViewById(R.id.chkSendMe);
    lv = (ListView) findViewById(R.id.outputList);
    res = getResources();
    SelectedUsersAdapter = new ArrayAdapter<String>(this,
        android.R.layout.simple_list_item_1);
    lv.setAdapter(SelectedUsersAdapter);
}

这是活动xml文件

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE LinearLayout>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity" >

<RelativeLayout
    android:id="@+id/TopLayout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:focusable="true"
    android:focusableInTouchMode="true"
    android:paddingBottom="4dp"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin" >

    <Button
        android:id="@+id/btnSelectUsers"
        style="?android:attr/buttonStyleSmall"
        android:layout_width="95dp"
        android:layout_height="wrap_content"
        android:onClick="ShowSelection"
        android:text="@string/select_recipients" />

    <CheckBox
        android:id="@+id/chkSendMe"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:layout_toRightOf="@+id/btnSelectUsers"
        android:onClick="onSendMeClick"
        android:text="@string/send_myself"
        android:textSize="13sp" />
</RelativeLayout>

<RelativeLayout
    android:id="@+id/ListLayout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:focusable="true"
    android:focusableInTouchMode="true"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="2dp" >

    <ListView
        android:id="@+id/outputList"
        android:layout_width="match_parent"
        android:layout_height="110dp"
        android:textSize="12sp" />
</RelativeLayout>

<RelativeLayout
    android:id="@+id/MessageLayout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:focusable="true"
    android:focusableInTouchMode="true"
    android:paddingBottom="1dp"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="1dp" >

    <TextView
        android:id="@+id/lblMessage"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_marginLeft="17dp"
        android:text="@string/w_message" />

    <EditText
        android:id="@+id/txtMessage"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/btnEmoticon"
        android:ems="10"
        android:height="70dp"
        android:inputType="textMultiLine"
        android:maxHeight="100dp"
        android:scrollbars="vertical"
        android:textSize="12sp" >

        <requestFocus />
    </EditText>

    <ImageButton
        android:id="@+id/btnEmoticon"
        android:layout_width="32dp"
        android:layout_height="32dp"
        android:layout_alignRight="@+id/txtMessage"
        android:layout_alignTop="@+id/lblMessage"
        android:layout_marginRight="16dp"
        android:background="@android:color/transparent"
        android:contentDescription="@string/emoticonButton"
        android:cropToPadding="false"
        android:onClick="OnbtnEmoticonsClick"
        android:src="@drawable/emoticons01" />

    <ImageButton
        android:id="@+id/btnImportDoc"
        android:layout_width="32dp"
        android:layout_height="32dp"
        android:layout_alignParentTop="true"
        android:layout_marginRight="24dp"
        android:layout_toLeftOf="@+id/btnEmoticon"
        android:background="@android:color/transparent"
        android:contentDescription="@string/import_doc_button"
        android:cropToPadding="false"
        android:onClick="onbtnImportDocClick"
        android:src="@drawable/attach_icon" />
</RelativeLayout>

<RelativeLayout
    android:id="@+id/BottomLayout"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="0.41"
    android:focusable="true"
    android:focusableInTouchMode="true"
    android:paddingBottom="0dp"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin" >

    <Button
        android:id="@+id/btnSend"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/btnServiceHandle"
        android:layout_alignParentTop="true"
        android:minHeight="35dp"
        android:onClick="onSendClick"
        android:text="@string/send"
        android:textSize="13sp" />

    <ToggleButton
        android:id="@+id/btnServiceHandle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:minHeight="50dp"
        android:onClick="onServiceToggleClicked"
        android:text="@string/service_handle"
        android:textOff="@string/service_handle_off"
        android:textOn="@string/service_handle_on"
        android:textSize="12sp" />

</RelativeLayout>

</LinearLayout>

问题是当我更改ArrayAdapter的内容时,listView不会反映更改。

以下是更改ArrayAdapter

的click事件的代码
public void onSendMeClick(View view)
{
    if(chkSendMe.isChecked())
    {
        SelectedUsersAdapter.clear();
        SelectedUsersAdapter.add("test String");
        SelectedUsersAdapter.notifyDataSetChanged();
    }
    else
    {
        SelectedUsersAdapter.clear(); 
        SelectedUsersAdapter.notifyDataSetChanged();
    }

这一切都始于我更新到Android sdk工具23.0.2并构建工具20.在以前的sdk工具中没有问题(22.6)。 为了使事情变得更糟,有时(很少)问题消失(列表正确地改变其内容)。 但是,如果我触摸editText字段并出现虚拟键盘,那么当我关闭键盘时,列表会反映ArrayAdapter中的每个更改。那我永远没有问题。 我试图使一切无效。没有。问题出在那里。我还更改了整个xml文件并将所有内容放在RelativeLayout下。没有了。当然,没有任何错误表现出来。 我的代码出了什么问题?

的解决方案的。我发现了这个问题。我在这里写它是为了万一有人遇到这样的事情。我在MainActivity函数中使用了一个静态的引用,而所做的只是在主视图的textview中写一段文本。但我注意到该服务正在调用主视图的view.RequestLayout。所以我认为这就像服务控制主视图一样。当我将其更改为从UI线程运行时,一切正常。 谢谢大家。

1 个答案:

答案 0 :(得分:0)

在为列表视图设置适配器之前,您是否尝试过SelectedUsersAdapter.setNotifyOnDataChanged(true);。这是我一直使用的,从来没有遇到任何问题。

ArrayAdapter.setNotifyOnChange(boolean)

编辑: notifyDataSetChanged()仅通知ListView数据已更改,而不是重绘自身。在您更改数据后尝试添加refreshDrawableState