Java 如何检测RecyclerView是否为空?

Java 如何检测RecyclerView是否为空?,java,android,android-recyclerview,Java,Android,Android Recyclerview,我有一个RecyclerView,从服务器上解析外部JSON数据。它工作得很好,但是JSON上的截击异步任务有时需要一段时间,当它完成时,片段显示一个空视图 如何创建一个测试来检查视图是否为空,如果为空,如何显示消息?我试图检查: if (recyclerView == null) if (jsonList == null) if (adapter.getItemCount() == 0) if (bundle == null) 但是这些测试要么什么都不做,要么每次都显示错误消息,即使Recy

我有一个RecyclerView,从服务器上解析外部JSON数据。它工作得很好,但是JSON上的截击异步任务有时需要一段时间,当它完成时,片段显示一个空视图

如何创建一个测试来检查视图是否为空,如果为空,如何显示消息?我试图检查:

if (recyclerView == null)
if (jsonList == null)
if (adapter.getItemCount() == 0)
if (bundle == null)
但是这些测试要么什么都不做,要么每次都显示错误消息,即使RecyclerView不是空的

这是片段上的代码:

public void onViewCreated(View view, Bundle savedInstanceState) {

    LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity());
    layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
    layoutManager.supportsPredictiveItemAnimations();
    recyclerView.setLayoutManager(layoutManager);
    recyclerView.setItemAnimator(new DefaultItemAnimator());
    recyclerView.setClickable(true);
    recyclerView.setHasFixedSize(true);
    recyclerView.addItemDecoration(new DividerItemDecoration(getActivity(), DividerItemDecoration.VERTICAL_LIST));
    NovaAdapter novaAdapter = new NovaAdapter(getActivity(),jsonList);
    if (novaAdapter.getItemCount() != 0) {
        recyclerView.setAdapter(novaAdapter);
    }else{
        pDialog = new ProgressDialog(getActivity());
        pDialog.setMessage("Retrieving data from Server");
        pDialog.show();            
    }
    super.onViewCreated(view, savedInstanceState);
以及适配器上的方法:

@Override
public int getItemCount() {
    return (null != novaList ? novaList.size() : 0);
}
按照现在的方式,“进度”对话框始终运行,无论视图是否为空

更新:以下是适配器代码:

public class NovaAdapter extends RecyclerView.Adapter<NovaListRowHolder> {

ArrayList<HashMap<String, String>> novaList = new ArrayList<HashMap<String, String>>();
public static final String STATUS = "status";
public static final String NAME = "name";
public static final String ID = "id";
private Context mContext;

public NovaAdapter(Context context, ArrayList<HashMap<String, String>> novaList) {
    this.novaList = novaList;
    this.mContext = context;
}

@Override
public NovaListRowHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
    View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.instances_list, null);
    NovaListRowHolder mh = new NovaListRowHolder(v);
    return mh;
}

@Override
public void onBindViewHolder(NovaListRowHolder novaListRowHolder, int i) {

    HashMap<String, String> e = novaList.get(i);
    novaListRowHolder.name.setText(e.get(NAME));
    novaListRowHolder.status.setText(e.get(STATUS));
    novaListRowHolder.setId(e.get(ID));


}


@Override
public int getItemCount() {
    return (null != novaList ? novaList.size() : 0);
}class NovaListRowHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
protected TextView name;
protected TextView status;
protected String id;

public String getId() {
    return id;
}

public void setId(String id) {
    this.id = id;
}

public NovaListRowHolder(View view) {
    super(view);
    view.setOnClickListener(this);
    this.name = (TextView) view.findViewById(R.id.nameInstance);
    this.status = (TextView) view.findViewById(R.id.statusInstance);

}

public void onClick(View view){
    Dialog dialog = new Dialog(view.getContext());
    dialog.setContentView(R.layout.instances_listdetail);
    dialog.setTitle("Details " + name.getText() + " " + getPosition());
    dialog.show();
}
公共类NovaAdapter扩展了RecyclerView.Adapter{
ArrayList novaList=新的ArrayList();
公共静态最终字符串STATUS=“STATUS”;
公共静态最终字符串NAME=“NAME”;
公共静态最终字符串ID=“ID”;
私有上下文;
公共NovaAdapter(上下文上下文,ArrayList novaList){
this.novaList=novaList;
this.mContext=上下文;
}
@凌驾
public NovaListRowHolder onCreateViewHolder(视图组视图组,int i){
View v=LayoutInflater.from(viewGroup.getContext()).flate(R.layout.instances_list,null);
NovaListRowHolder mh=新的NovaListRowHolder(v);
返回mh;
}
@凌驾
BindViewHolder上的公共无效(NovaListRowHolder NovaListRowHolder,int i){
HashMap e=novaList.get(i);
novaListRowHolder.name.setText(e.get(name));
novaListRowHolder.status.setText(e.get(status));
novaListRowHolder.setId(e.get(ID));
}
@凌驾
public int getItemCount(){
返回值(null!=novaList?novaList.size():0);
}类NovaListRowHolder扩展了RecyclerView.ViewHolder实现了View.OnClickListener{
受保护的文本视图名称;
受保护的文本视图状态;
受保护的字符串id;
公共字符串getId(){
返回id;
}
公共无效集合id(字符串id){
this.id=id;
}
公共列表行持有人(视图){
超级(视图);
view.setOnClickListener(这个);
this.name=(TextView)view.findViewById(R.id.nameInstance);
this.status=(TextView)view.findViewById(R.id.statusInstance);
}
公共void onClick(视图){
Dialog=新建对话框(view.getContext());
setContentView(R.layout.instances\u listdetail);
setTitle(“详细信息”+name.getText()+“”+getPosition());
dialog.show();
}
更新2:

我更新了另一个类,该类与上面的一个类几乎相同,具有回调接口,但是现在recyclerView显示1秒,然后变为空白。该对话框甚至没有显示。以下是代码:

public class SubnetsFragment extends Fragment implements OnJSONLoaded{
    /**
     * The fragment argument representing the section number for this
     * fragment.
     */
    private static final String ARG_SECTION_NUMBER = "section_number";
    private OnFragmentInteractionListener mListener;
    public ArrayList<HashMap<String, String>> jsonList;
    public RecyclerView recyclerView;
    public ProgressDialog pDialog;
        /**
     * Returns a new instance of this fragment for the given section
     * number.
     */
    public static SubnetsFragment newInstance(int sectionNumber) {
        SubnetsFragment fragment = new SubnetsFragment();
        Bundle args = new Bundle();
        args.putInt(ARG_SECTION_NUMBER, sectionNumber);
        fragment.setArguments(args);
        return fragment;
    }


    public SubnetsFragment() {
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        Bundle extras = getArguments();
        Serializable parsedList = extras.getSerializable("SubnetsParsed");
        jsonList = (ArrayList<HashMap<String, String>>)parsedList;
        if (extras == null){
            AlertDialog.Builder alert = new AlertDialog.Builder(getActivity());
            alert.setTitle("Token Expired");
            alert.setMessage("Authentication Token expired! Please login again.")
                    .setNeutralButton("Connect", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialogInterface, int i) {
                            Intent intent = new Intent(getActivity(), Login.class);
                            startActivity(intent);
                            getActivity().finish();
                            getFragmentManager().beginTransaction().remove(SubnetsFragment.this).commit();
                        }
                    });
            AlertDialog alertDialog = alert.create();
            alertDialog.show();
        }
        View rootView = inflater.inflate(R.layout.fragment_subnets, container, false);
        recyclerView = (RecyclerView)rootView.findViewById(R.id.subnetsRV);
        return rootView;
    }

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity());
        layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
        layoutManager.supportsPredictiveItemAnimations();
        recyclerView.setLayoutManager(layoutManager);
        recyclerView.setItemAnimator(new DefaultItemAnimator());
        recyclerView.setClickable(true);
        recyclerView.setHasFixedSize(true);
        recyclerView.addItemDecoration(new DividerItemDecoration(getActivity(), DividerItemDecoration.VERTICAL_LIST));

        onJsonLoaded(jsonList);

    }

    @Override
    public void onJsonLoaded(ArrayList<HashMap<String, String>> list) {

        SubnetsParser.setOnJSONLoadedListener(new OnJSONLoaded() {
            @Override
            public void onJsonLoaded(ArrayList<HashMap<String, String>> list) {
                if (list.size() != 0){
                    SubnetsAdapter subnetsAdapter = new SubnetsAdapter(getActivity(),jsonList);
                    recyclerView.setAdapter(subnetsAdapter);
                }else {
                    pDialog = new ProgressDialog(getActivity());
                    pDialog.setMessage("Retrieving data from Server");
                    pDialog.show();
                }
            }
        });

    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        ((Stackerz) activity).onSectionAttached(
                getArguments().getInt(ARG_SECTION_NUMBER));
        //try {
        //    mListener = (OnFragmentInteractionListener) activity;
        //} catch (ClassCastException e) {
        //    throw new ClassCastException(activity.toString()
        //            + " must implement OnFragmentInteractionListener");
        //}
    }

    @Override
    public void onDetach() {
        super.onDetach();
        mListener = null;
    }




    /**
     * This interface must be implemented by activities that contain this
     * fragment to allow an interaction in this fragment to be communicated
     * to the activity and potentially other fragments contained in that
     * activity.
     * <p>
     * See the Android Training lesson <a href=
     * "http://developer.android.com/training/basics/fragments/communicating.html"
     * >Communicating with Other Fragments</a> for more information.
     */
    public interface OnFragmentInteractionListener {
        // TODO: Update argument type and name
        public void onFragmentInteraction(Uri uri);
    }
}
公共类子网片段扩展了JSONLoaded上的片段实现{
/**
*表示此文件节号的片段参数
*碎片。
*/
私有静态最终字符串ARG\u SECTION\u NUMBER=“SECTION\u NUMBER”;
私有OnFragmentInteractionListener mListener;
公共ArrayList jsonList;
公共回收视图回收视图;
公共对话;
/**
*返回给定节的此片段的新实例
*号码。
*/
公共静态子网片段newInstance(int sectionNumber){
SubnetsFragment片段=新的SubnetsFragment();
Bundle args=新Bundle();
参数Putin(参数段号,段号);
fragment.setArguments(args);
返回片段;
}
公共子网碎片(){
}
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
Bundle extras=getArguments();
Serializable parsedList=extras.getSerializable(“SubnetsParsed”);
jsonList=(ArrayList)parsedList;
如果(附加==null){
AlertDialog.Builder alert=新建AlertDialog.Builder(getActivity());
alert.setTitle(“令牌已过期”);
alert.setMessage(“身份验证令牌已过期!请重新登录。”)
.setNeutralButton(“连接”,新的DialogInterface.OnClickListener(){
@凌驾
公共void onClick(DialogInterface,inti){
Intent Intent=新的Intent(getActivity(),Login.class);
星触觉(意向);
getActivity().finish();
getFragmentManager().beginTransaction().remove(SubnetsFragment.this.commit();
}
});
AlertDialog AlertDialog=alert.create();
alertDialog.show();
}
视图根视图=充气机。充气(R.layout.fragment\u子网,容器,false);
recyclerView=(recyclerView)rootView.findViewById(R.id.subnetsRV);
返回rootView;
}
@凌驾
已创建视图上的公共void(视图,捆绑保存状态){
super.onViewCreated(视图,savedInstanceState);
LinearLayoutManager布局管理器=新的LinearLayoutManager(getActivity());
layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
layoutManager.supportsPredictiveItemAnimations();
recyclerView.setLayoutManager(layoutManager);
setItemAnimator(新的DefaultItemAnimator());
recyclerView.setClickable(真);
recyclerView.setHasFixedSize(true);
addItemDecoration(新的DividerItemDecoration(getActivity(),DividerItemDecoration.VERTICAL_LIST));
onjsonload(jsonList);
}
@凌驾
onJsonLoaded上的公共无效(ArrayList列表){
SubnetsParser.setOnJSONLoadedListener(新的OnJSONLoaded(){
@凌驾
onJsonLoaded上的公共无效(ArrayList列表){
如果(list.size()!=0){
SubnetsAdapter SubnetsAdapter=新的SubnetsAdapter(getActivity(),jsonList);
recyclerView.setAdapter(子网适配器);
}否则
public class SubnetsParser extends Activity{
    public static final String NAME = "name";
    public static final String GW = "gw";
    public static final String CIDR = "cidr";
    public static final String ID = "id";

    public String authToken;
    public String neutronURL;

    public static SubnetsParser parser = null;

    public static OnJSONLoaded mListener;

    public static void setOnJSONLoadedListener(OnJSONLoaded listener) {
        mListener = listener;
    }

    public interface OnJSONLoaded {
        void onJsonLoaded(ArrayList<HashMap<String, String>> list);
    }

    public static SubnetsParser shared(){
        if (parser  == null){
            parser  = new SubnetsParser();
        }
        return parser ;
    }

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





    public static ArrayList<HashMap<String, String>> parseJSON(String subnetsJSON){
        ArrayList<HashMap<String, String>> jsonList = new ArrayList<HashMap<String, String>>();
        try {
            Subnets subnets = new Subnets();
            JSONObject subnet = new JSONObject(subnetsJSON);
            JSONArray subnetobj = subnet.getJSONArray("subnets");
            for (int i = 0; i < subnetobj.length(); i++) {
                JSONObject objsrv = subnetobj.getJSONObject(i);
                subnets.setName(objsrv.getString("name"));
                subnets.setGw(objsrv.getString("gateway_ip"));
                subnets.setCidr(objsrv.getString("cidr"));
                subnets.setId(objsrv.getString("id"));
                HashMap<String, String> map = new HashMap<String, String>();
                map.put(NAME, subnets.getName());
                map.put(GW, subnets.getGw());
                map.put(CIDR, subnets.getCidr());
                map.put(ID, subnets.getId());
                jsonList.add(map);
            }
        } catch (JSONException e) {
            Log.d("ErrorInitJSON", e.toString());
            e.printStackTrace();
        }

        Collections.sort(jsonList, new Comparator<HashMap<String, String>>() {
            @Override
            public int compare(HashMap<String, String> lhs, HashMap<String, String> rhs) {
                return (lhs.get("name")).compareToIgnoreCase(rhs.get("name"));
            }
        });

        if (mListener != null) {
            mListener.onJsonLoaded(jsonList);
        }

        return jsonList;

    }


}
if (adapter.getItemCount() == 0)
@Override
public int getItemCount() {
    return mDataSet.size(); // Where mDataSet is the list of your items
}
public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity());
    layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
    layoutManager.supportsPredictiveItemAnimations();
    recyclerView.setLayoutManager(layoutManager);
    recyclerView.setItemAnimator(new DefaultItemAnimator());
    recyclerView.setClickable(true);
    recyclerView.setHasFixedSize(true);
    recyclerView.addItemDecoration(new DividerItemDecoration(getActivity(), DividerItemDecoration.VERTICAL_LIST));

    pDialog = new ProgressDialog(getActivity());
    pDialog.setMessage("Retrieving data from Server");
    pDialog.show();   
}
private OnJsonLoaded mListener;

public void setOnJsonLoadedListener(OnJsonLoaded listener) {
    mListener = listener;
}

public interface OnJsonLoaded {
    void onJsonLoaded(ArrayList<HashMap<String, String>> list);
}
if (mListener != null) {
    mListener.onJsonLoaded(jsonList);
}
classThatParseJson.setOnJsonLoadedListener(new OnJsonLoaded() {
        @Override
        public void onJsonLoaded(ArrayList<HashMap<String, String>> list) {
            if (list.size() != 0) {
                NovaAdapter novaAdapter = new NovaAdapter(getActivity(),jsonList); 
                recyclerView.setAdapter(novaAdapter);
            } else {
                // Show something like a dialog that the json list is 0 or do whatever you want... here the jsonlist have a count of 0 so it's empty!
            }  
        }
});
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragment_subnets, container, false);
    recyclerView = (RecyclerView)rootView.findViewById(R.id.subnetsRV);
    return rootView;
}

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity());
    layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
    layoutManager.supportsPredictiveItemAnimations();
    recyclerView.setLayoutManager(layoutManager);
    recyclerView.setItemAnimator(new DefaultItemAnimator());
    recyclerView.setClickable(true);
    recyclerView.setHasFixedSize(true);
    recyclerView.addItemDecoration(new DividerItemDecoration(getActivity(), DividerItemDecoration.VERTICAL_LIST));

    // start json parser here instead of passing to fragment as a bundle
    SubnetsParser.parseJSON(yourparams);
}

@Override
public void onJsonLoaded(ArrayList<HashMap<String, String>> list) {

    SubnetsParser.setOnJSONLoadedListener(new OnJSONLoaded() {
        @Override
        public void onJsonLoaded(ArrayList<HashMap<String, String>> list) {
            if (list.size() != 0){
                SubnetsAdapter subnetsAdapter = new SubnetsAdapter(getActivity(),jsonList);
                recyclerView.setAdapter(subnetsAdapter);
            }else {
                //pDialog = new ProgressDialog(getActivity());
                //pDialog.setMessage("Retrieving data from Server");
                //pDialog.show();
                //Instead of a progressdialog, put here a dialog informing that the list is empty!
            }
        }
    });

}
// Return the size of your dataset (invoked by the layout manager)
@Override
public int getItemCount() {
    return mDataset.length;
}
if( mLayoutManager.getItemCount() == 0 ){
    //Do something
}
public interface OnAdapterCountListener {
    void onAdapterCountListener(int count);
}
private OnAdapterCountListener onAdapterCountListener; 
    public void setOnAdapterCountListener(OnAdapterCountListener l) { 
        onAdapterCountListener = l; 
    }
onAdapterCountListener.onAdapterCountListener(getItemCount());
listAdapter.setOnAdapterCountListener(new OnAdapterCountListener() {
    @Override 
    public void onAdapterCountListener(int count) { 
        if (count > 0) 
            adapterEmptyText.setVisibility(View.GONE); 
    }
});
public class RecyclerviewEmpty extends RecyclerView {

private View emptyView;

private final AdapterDataObserver observer = new AdapterDataObserver() {
    @Override
    public void onChanged() {
        checkIfEmpty();
    }

    @Override
    public void onItemRangeInserted(int positionStart, int itemCount) {
        checkIfEmpty();
    }

    @Override
    public void onItemRangeRemoved(int positionStart, int itemCount) {
        checkIfEmpty();
    }
};

public RecyclerviewEmpty(@NonNull Context context) {
    super(context);
}

public RecyclerviewEmpty(@NonNull Context context, @Nullable AttributeSet attrs) {
    super(context, attrs);
}

public RecyclerviewEmpty(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
}


private void checkIfEmpty() {
    if (emptyView != null && getAdapter() != null) {
        final boolean emptyViewVisible = getAdapter().getItemCount() == 0;
        emptyView.setVisibility(emptyViewVisible ? VISIBLE : GONE);
        setVisibility(emptyViewVisible ? GONE : VISIBLE);
    }
}

@Override
public void setAdapter(@Nullable Adapter adapter) {
    final Adapter oldAdapter = getAdapter();
    if (oldAdapter != null) {
        oldAdapter.unregisterAdapterDataObserver(observer);
    }
    super.setAdapter(adapter);
    if (adapter != null) {
        adapter.registerAdapterDataObserver(observer);
    }

    checkIfEmpty();
}

public void setEmptyView(View emptyView) {
    this.emptyView = emptyView;
    checkIfEmpty();
}
    <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/bg_main"
    tools:context=".Ui.FavouriteActivity">


    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

        <view
            android:id="@+id/rv_fav_activity"
            class="com.kumar.random.quotes.Views.RecyclerviewEmpty"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />

        <TextView
            android:id="@+id/list_empty1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:gravity="center"
            android:text="Empty Favourite"
            android:textSize="14sp" />
    </FrameLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
    private RecyclerviewEmpty rvFavourite;
private void setUpRv() {
        rvFavourite.setEmptyView(emptyView);
        LinearLayoutManager layoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
        MainQuotesAdapter adapter = new MainQuotesAdapter(this, favouriteItem);
        rvFavourite.setLayoutManager(layoutManager);
        rvFavourite.setAdapter(adapter);
    }
 rvFavourite.setEmptyView(emptyView);
public void setEmptyView(View emptyView) {
    this.emptyView = emptyView;
    checkIfEmpty();
}
 <view
        android:id="@+id/rv_fav_activity"
        class="com.kumar.random.quotes.Views.RecyclerviewEmpty"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />