4

如果 ListView 适配器中没有数据,我想显示一个刷新按钮和一个 TextView。我还希望能够将单击侦听器添加到将重新加载列表的按钮。这是我定义当前活动的方式:

 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.foods);

    arrList=new ArrayList<FoodsData>();

    listView=(ListView)findViewById(R.id.list_foods);

    this.listView.setEmptyView(findViewById(R.id.emptyView));

    .....
    .....
}

这是我的xml文件:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:orientation="vertical"
    android:layout_height="match_parent">
<LinearLayout 
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:orientation="vertical"
    android:layout_centerInParent="true"
    android:id="@+id/emptyView">
    <TextView
        android:layout_width="wrap_content"
        android:textColor="@android:color/white"
        android:layout_height="wrap_content"
        android:textSize="20sp"
        android:text="Click Refresh to load data"/>
   <Button 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/btn_retry"
        android:textColor="@android:color/white"
        android:background="@drawable/orange_button_selecter"
        android:layout_gravity="center"
        android:textSize="25sp"
        android:text="@string/retry"/>
</LinearLayout>
<ListView 
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:dividerHeight="2dp"
    android:id="@+id/list_foods"/>

我将在哪里为我的刷新按钮设置点击侦听器?

4

4 回答 4

10

如下更改您的 xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="fill_parent"
    android:orientation="vertical"
    android:layout_height="fill_parent">
    <FrameLayout 
        android:layout_height="fill_parent"
        android:layout_width="fill_parent"
        android:layout_centerInParent="true"
        android:id="@+id/emptyView">
        <TextView
            android:layout_width="wrap_content"
            android:textColor="@android:color/white"
            android:layout_height="wrap_content"
            android:textSize="20sp"
            android:text="Click Refresh to load data"/>
       <Button 
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/btn_retry"
            android:textColor="@android:color/white"
            android:background="@drawable/orange_button_selecter"
            android:layout_gravity="center"
            android:textSize="25sp"
            android:text="@string/retry"/>
    </FrameLayout>
<ListView 
    android:layout_height="fill_parent"
    android:layout_width="fill_parent"
    android:dividerHeight="2dp"
    android:id="@+id/list_foods"/>
</RelativeLayout>

把这些行放在java中

    View empty = findViewById(R.id.emptyView);
    btn_retry=(Button)empty.findViewById(R.id.btn_retry);
    listView.setEmptyView(empty);

现在你可以在同一个 Activity 中编写 onClickListener() ,因为它属于同一个 xml 布局。

btn_retry.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                //Do the refresh thing or verify with Toast.
            }
        });

在这里,如果列表视图为空,它将显示按钮刷新。否则它将显示填充列表。

于 2013-04-22T11:09:44.227 回答
0

据我所知,无需清除适配器并将 notifyDataSetChanged() 设置为适配器。您已将 List、ArrayList 用于项目或数组。先清空,再重新初始化,将数据传给服装适配器后,清空使用的数组/列表。它会正常工作的!

于 2014-12-04T02:50:09.217 回答
0

您需要通过扩展BaseAdapter以下列方式为列表视图创建自定义适配器

    public class ListViewAdapter extends BaseAdapter {
    LayoutInflater layoutInflater;
    Context mContext;
    ArrayList<String> slist_name;
    ArrayList<String> list_deviceId;

    /** constructor is initializing */

    public ListViewAdapter(Context c, ArrayList<String> name,ArrayList<String> devId) {
        mContext = c;
        layoutInflater = (LayoutInflater) mContext
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        slist_name = name;
        list_deviceId=list_deviceId;

    }

    public int getCount() {


         return slist_name.size();
    }

    public Object getItem(int position) {

        return null;
    }

    public long getItemId(int position) {

        return 0;
    }

    public View getView(int position, View convertView, ViewGroup parent) {

        View vi = null;
        convertView = null;
        vi = convertView;

        if (convertView == null) {

            vi = layoutInflater.inflate(R.layout.listview_item, null);

            TextView name_textview = (TextView) vi
                    .findViewById(R.id.textEmp_id);

            name_textview.setText(slist_name.get(position));

            Button btn = (Button) vi
                    .findViewById(R.id.btn_id);
                        btn.setOnClickListener(this);
                        //add relevent code in onclickListner


        }
        return vi;

    }

}

在您的活动中,通过以下方式将自定义适配器添加到 listView:

        listView = (ListView) findViewById(R.id.listview_employee_id);
        adapter = new ListViewAdapter(this, listarray, listarrayDev);
        listView.setAdapter(adapter);
于 2013-04-22T09:38:07.830 回答
0

首先必须将 Adapter 设置为 ListView,然后如果需要刷新 listView 内容,请使用:adapter.notifyDataSetChanged();

如果您需要删除所有项目,请使用:

adapter.clear();
adapter.notifyDataSetChanged();

例如 :

    String[] items = new String[] { "Item1", "Item2", "Item3", "Item4" };
    final ListView listView = (ListView)findViewById(R.id.listView1);
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_single_choice, android.R.id.text1, items);
    listView.setAdapter(adapter);

    Button refreshButton = (Button)findViewById(R.id.button1);
    refreshButton.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View arg0) {
           ArrayAdapter<String> adapter = (ArrayAdapter<String>)listview.getAdapter();
           if(adapter!= null)
              {
                  adapter.clear();
                  adapter.notifyDataSetChanged();
                 //here you can write your listView.setEmptyView(findViewById(R.id.emptyView)); code
              }
    });
于 2013-04-22T10:26:47.053 回答