如果RecyclerView为空,则显示Toast消息

时间:2018-04-04 05:48:44

标签: android android-recyclerview progressdialog toast

我在Fragment中设置RecyclerView。当RecyclerView中没有项目时,我想显示消息No data。但我很困惑将它放在RecyclerView里面。如果没有项目RecyclerView progressbar保持正在加载。我想在recyclelerview中没有项目时关闭进度条。 这是设置RecyclerView

的代码
private void getData() {
        String restqueue_req = "restqueue_req";
        String url = "";
            progressDialog.show();
            JsonArrayRequest request = new JsonArrayRequest(Request.Method.GET, url, null, new Response.Listener<JSONArray>() {
                @Override
                public void onResponse(JSONArray response) {
                    try {
                        for (int i = 0; i < response.length(); i++) {
                            JSONObject object = response.getJSONObject(i);
                            final CurrentEntry entry = new CurrentEntry();
                            String id = object.getString("id");
                            url = "";
                            JsonObjectRequest foodie_request = new JsonObjectRequest(Request.Method.GET,url, null, new Response.Listener<JSONObject>() {
                                @Override
                                public void onResponse(JSONObject response) {
                                    try {
                                        String first_name = response.getString("firstname");
                                        String last_name = response.getString("lastname");
                                        entry.setName(first_name + "\t" + last_name);
                                        progressDialog.dismiss();
                                        adapter.notifyDataSetChanged();
                                    } catch (JSONException e) {
                                        e.printStackTrace();
                                    }

                                }
                            }, new Response.ErrorListener() {
                                @Override
                                public void onErrorResponse(VolleyError error) {

                                }
                            }) {
                                @Override
                                public Map<String, String> getHeaders() throws AuthFailureError {
                                    Map<String, String> headers = new HashMap<>();
                                    String auth = "JWT " + myToken;
                                    headers.put("Authorization", auth);
                                    headers.put("Content-Type", "application/json");
                                    return headers;
                                }
                            };
                            AppController.getInstance().addToRequestQueue(foodie_request, foodie_data_req);
                            String no_of_people = object.getString("people");
                            String t = object.getString("t");
                            entry.setPeople(people);
                            entry.setEstimate(t);
                            progressDialog.dismiss();
                            current.add(entry);
                            adapter = new CurrentAdapter(current, getActivity().getApplicationContext());
                                recyclerView.setAdapter(adapter);
                                adapter.notifyDataSetChanged();    
                        }

                    } catch (JSONException e) {
                        e.printStackTrace();
                    }  

在哪里处理Empty RecyclerView的这个条件?

9 个答案:

答案 0 :(得分:3)

您可以查看isEmpty()正在使用的Array List

isEmpty()如果list不包含任何元素,则返回true

current.add(entry);
if(current.isEmpty()){
  Toast.makeText(YourActivity.this,"No data", Toast.LENGTH_LONG).show();
}else{
  adapter = new CurrentAdapter(current, getActivity().getApplicationContext());
  recyclerView.setAdapter(adapter);
}

答案 1 :(得分:2)

这很简单,如果您选中length()

  

返回此数组中的值数。

public void onResponse(JSONArray response) 
 {
                    try {
                        if(response.length()== 0)
                        {
                            Toast.makeText(getActivity(),"Empty List", Toast.LENGTH_SHORT).show();
                        }
                        else
                        {
                         ...
                        }

答案 2 :(得分:1)

最简单的方法是registerAdapterDataObserver,如下所示:

adapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() {
            @Override
            public void onChanged() {
                super.onChanged();
                if(adapter.getItemCount()==0){
                    Toast.makeText(context, "No data available", Toast.LENGTH_SHORT).show();
                    //You can show toast or choose any other option
                }
            }
        });

这将使您的适配器代码变得干净,并允许您在不修改适配器的情况下自由修改演示文稿。

答案 3 :(得分:0)

检查适配器类,如果响应列表的大小为0,则显示祝酒词。

答案 4 :(得分:0)

试试这个

  current.add(entry);

  if(current.size()>0){
  adapter = new CurrentAdapter(current, 
                        getActivity().getApplicationContext());
                            recyclerView.setAdapter(adapter);
                            adapter.notifyDataSetChanged();
  }else{
   Toast.makeText(context, "RecycleView Empty", Toast.LENGTH_SHORT).show();
  }

答案 5 :(得分:0)

在recyclerview适配器类中有一个方法名称

   @Override
    public void onBindViewHolder(AdapterName.MyViewHolder holder, int position) {
      if(theArrayYourPassingName.size()==0)
       Toast.makeText(context,"Array is empty", Toast.LENGTH_LONG).show();
    }

答案 6 :(得分:0)

试试这段代码:

xml布局

<android.support.v7.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:visibility="visible"
android:layout_height="match_parent"
android:scrollbars="vertical" />

<TextView
android:id="@+id/empty_tv"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:visibility="gone"
android:text="no_data" />

java class

 recycler_view = (RecyclerView) rootView.findViewById(R.id.recycler_view);
 empty_tv = (TextView) rootView.findViewById(R.id.empty_tv);

if (no_data.isEmpty()) {
recycler_view.setVisibility(View.GONE);
empty_tv.setVisibility(View.VISIBLE);
  }
else {
recycler_view.setVisibility(View.VISIBLE);
empty_tv.setVisibility(View.GONE);
}

尝试此代码可以帮助您

答案 7 :(得分:0)

这是编辑答案并尝试许多方法之后的一种方法

尝试

在片段/活动类别中

recyclerView=(RecyclerView)view.findViewById(R.id.recycler_recent);
    emptytext = (TextView)view.findViewById(R.id.emptytext);
    adapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() {
        @Override
        public void onChanged() {
            super.onChanged();


            if (adapter.getItemCount() == 0) {
                recyclerView.setVisibility(View.GONE);
                emptytext.setVisibility(View.VISIBLE);
            }
            else {
                recyclerView.setVisibility(View.VISIBLE);
                emptytext.setVisibility(View.GONE);
            }


        }
    });

在布局xml中

   <android.support.v7.widget.RecyclerView
    android:visibility="visible"
    android:scrollbars="vertical"
    android:id="@+id/recycler_recent"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

</android.support.v7.widget.RecyclerView>

<TextView
    android:id="@+id/emptytext"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:visibility="gone"
    android:text="the activiy has no data" />

答案 8 :(得分:0)

以上所有答案均无法有效地处理我的案件。我有一个带有RecyclerView的主页片段,以显示用户已添加的设备列表。我的要求是在没有设备的情况下显示带有一些说明的背景图像。

设备列表存储为可观察的地图。映射位于单例对象中。我的RecyclerView.Adapter类直接引用此可观察的地图,并将其填充到UI。

这是我退货的方式,

@Override
public int getItemCount() {
    int size = DeviceDatabase.getList().size(); // gives size of the map
    return size;
}

我在片段类中实现了registerAdapterDataObserver来显示和隐藏背景图像,但是如果地图中没有任何设备,则不会被调用。

我通过在适配器类中添加接口以通知片段类(无论设备列表是否为空)解决了我的问题,我从getItemCount函数中对其进行了调用,如下所示。

public class DeviceListAdapter extends RecyclerView.Adapter<DeviceListAdapter.ViewHolder> {
    private DevListAdapterListener mListener;
    DeviceListAdapter(DevListAdapterListener devListAdapterListener) {
        mListener = devListAdapterListener;
    }

    public interface DevListAdapterListener {
        void onListEmpty(boolean isEmpty);
    }

    @Override
    public int getItemCount() {
        int size = DeviceDatabase.getList().size(); // gives size of the map
        if (size <= 0) {
            mListener.onListEmpty(true);
        } else {
            mListener.onListEmpty(false);
        }
        return size;
    }

    ...
    ...
}

home片段中的处理方式是

@Override
public void onListEmpty(boolean isEmpty) {
    requireActivity().runOnUiThread(new Runnable() {
        @Override
        public void run() {
            View view = requireView().findViewById(R.id.device_list_background); // Background image in home fragment XML
            if (isEmpty) {
                view.setVisibility(View.VISIBLE);
            } else {
                view.setVisibility(View.GONE);
            }
        }
    });
}

我只想在UI上填充列表时才显示/隐藏背景图像,从getItemCount调用接口可以帮助我做到这一点。希望这会有所帮助。

相关问题