具有自定义布局的ListFragment:始终显示空消息

per*_*ssf 3 android android-arrayadapter android-listfragment

ListFragment使用默认设置创建了一个自定义布局ArrayAdapter。我的问题是,当列表不为空时,每行上都会显示空消息(当列表为空时,该消息仅按预期显示一次)。

headline_list.xml(即我的自定义布局文件)

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <ListView
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:id="@id/android:list" />

    <TextView android:id="@+id/my_text"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

    <TextView android:id="@id/android:empty"
        android:text="There are no data"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/> 

</LinearLayout>
Run Code Online (Sandbox Code Playgroud)

HeadlineFragment.java

public class HeadlineFragment extends ListFragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
        return inflater.inflate(R.layout.headline_list, container, false);
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        List<String> headlines = ...;          // populate headlines list

        setListAdapter(new ArrayAdapter<String>(getActivity(),
                R.layout.headline_list, R.id.my_text, headlines));
    }
}
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

Mik*_* M. 5

您的布局有些混乱。

new ArrayAdapter<String>(getActivity(),
    R.layout.headline_list, R.id.my_text, headlines)
Run Code Online (Sandbox Code Playgroud)

ArrayAdapter构造函数中的第二个参数是单个行的布局的ID,而不是整个Fragment布局的ID 。第三个参数TextView在行布局中引用a 以显示项目的数据。

您可以提供自己的行布局,也可以使用SDK提供的行布局。后者的示例:

new ArrayAdapter<String>(getActivity(),
    android.R.layout.simple_list_item_1, headlines)
Run Code Online (Sandbox Code Playgroud)

在此示例中,android.R.layout.simple_list_item_1本身仅仅是一个TextView,因此我们不需要提供一个的ID。

另外,如果以后需要对其进行修改,则应考虑保留对适配器的引用。


看来您的意思是将my_text TextView其作为自定义行布局。如果是这样,请将其从Fragment的布局中删除headline_list,并将其放在自己的布局文件中;例如list_row.xml。这样,您的布局文件将如下所示:

headline_list.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <ListView android:id="@id/android:list"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <TextView android:id="@id/android:empty"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="There are no data" /> 

</LinearLayout>
Run Code Online (Sandbox Code Playgroud)

list_row.xml

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/my_text"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"/>
Run Code Online (Sandbox Code Playgroud)

然后,您将像这样实例化您的适配器:

new ArrayAdapter<String>(getActivity(), R.layout.list_row, headlines)
Run Code Online (Sandbox Code Playgroud)

同样,由于行布局只是一个TextView,我们不需要在构造函数中传递一个ID。