我在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的这个条件?
答案 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调用接口可以帮助我做到这一点。希望这会有所帮助。