Android RecyclerView 什么都不显示

Android RecyclerView shows nothing

我想为我的学校提交 Android 申请。它应该显示教师缺席和菜单,但菜单不显示任何内容。它没有例外或我可以使用的任何东西。我从 url 和 JSON 数据中获取数据。很遗憾,由于个人原因,我不能给你 url。

enter image description here

不幸的是它看起来像这样。

enter image description here

我研究了很多页面试图自己解决这个问题,但并不是很有帮助。我正在使用两个 RecyclerViews、两个适配器 类 和 2 个片段。在我实现 http 请求和 JSON 解析器之前,它运行良好。有人可以帮我解决这个问题吗?

MainActivity.java

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

    FragAbsenz fragAbsenz = new FragAbsenz();
    android.app.FragmentManager manager = getFragmentManager();
    manager.beginTransaction().replace(R.id.contentLayout, fragAbsenz, 
    fragAbsenz.getTag()).commit();
    setTitle("Lehrerabsenzen");
    BottomNavigationView navigation = (BottomNavigationView) 
   findViewById(R.id.navigation);




  navigation.setOnNavigationItemSelectedListener
    (mOnNavigationItemSelectedListener);
    MainActivity.context = getApplicationContext();
}

public static Context getAppContext() {
    return MainActivity.context;
}

FragAbsenz.java: (I haven't implemented the http request and the JSON 
parser on this one yet, but it only displays the first Item from 20 and 
the others are gone.)

public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View view = inflater.inflate(R.layout.fragment_frag_absenz, 
container, false);

    mRecycler = (RecyclerView) view.findViewById(R.id.rv_absenz);
    mContacts = new ArrayList<>();
    mContacts.add("Michi \n Zi");
    mContacts.add("Michi Zi 2");
    mContacts.add("Michi \n Zi 3");

    for (int i = 4; i < 20; i++) {
        mContacts.add("Michi Zi" + i);
    }

    mRecycler.setHasFixedSize(true);
    mLayoutManager = new LinearLayoutManager(getActivity());
    mAdapter = new Abse_MainAdapter(mContacts);
    mRecycler.setLayoutManager(mLayoutManager);
    mRecycler.setAdapter(mAdapter);

    return view;
}

Abse_MainAdapter.java:

class Abse_MainAdapter extends 
RecyclerView.Adapter<Abse_MainAdapter.ViewHolder> {

ArrayList<String> mContacts;

public Abse_MainAdapter(ArrayList<String> Contacts) {
    mContacts = Contacts;
}

@Override
public Abse_MainAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, 
int viewType) {
    View view = 
LayoutInflater.from(parent.getContext()).inflate(R.layout.abse_row, 
parent, false);
    return new Abse_MainAdapter.ViewHolder(view);
}

@Override
public void onBindViewHolder(Abse_MainAdapter.ViewHolder holder, int 
position) {
    holder.mFullName.setText(mContacts.get(position));
}

@Override
public int getItemCount() {
    return mContacts.size();
}

public class ViewHolder extends RecyclerView.ViewHolder {

    public TextView mFullName;

    public ViewHolder(View itemView) {
        super(itemView);

        mFullName = (TextView) itemView.findViewById(R.id.full_name);
    }
}

FragMenu.java:

public class FragMenu extends Fragment {

ArrayList<String> mMenu;

RecyclerView mRv;
RecyclerView.LayoutManager mLm;
RecyclerView.Adapter mAd;

StringRequest stringRequest = null;
String result;

public FragMenu() {
    // Required empty public constructor
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View view = inflater.inflate(R.layout.fragment_frag_menu, 
container, false);

    mRv = (RecyclerView) view.findViewById(R.id.rv_menu);

    RequestQueue queue = 
Volley.newRequestQueue(MainActivity.getAppContext());
    String url = "Censored because of personal reasons";

    stringRequest = new StringRequest(Request.Method.GET, url,
            new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    result = response.substring(0);

                    try {
                        JSONObject JSONobj = new JSONObject(result);

                        String lastUpdate = 
JSONobj.getString("lastUpdate");
                        result = lastUpdate;

                        JSONArray WMenu = JSONobj.getJSONArray("data");

                        mMenu = new ArrayList<>();

                        for (int i = 0; i < WMenu.length(); i++) {
                            String Str = "";
                            JSONObject TMenu = WMenu.getJSONObject(i);
                            Str = Str + TMenu.getString("time") + "|";

                            JSONArray Menu = 
TMenu.getJSONArray("main");
                            String str = "";
                            for (int k = 0; k < Menu.length(); k++) {
                                str = str + Menu.getString(k) + "\n";
                            }
                            Str = Str + str + "|";

                            str = "";
                            JSONArray Hit = TMenu.getJSONArray("hit");
                            for (int k = 0; k < Menu.length(); k++) {
                                str = str + Hit.getString(k) + " \n";

                            }
                            Str = Str + str;

                            mMenu.add(Str);
                        }

                        mRv.setHasFixedSize(true);
                        mLm = new LinearLayoutManager(getActivity());
                        mAd = new Menu_MainAdapter(mMenu);
                        mRv.setLayoutManager(mLm);
                        mRv.setAdapter(mAd);

                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            //mText.setText("That didn't work!");
        }
    });
    queue.add(stringRequest);

    return view;
}



Menu_MainAdapter.java:

class Menu_MainAdapter extends 
RecyclerView.Adapter<Menu_MainAdapter.ViewHolder> {

ArrayList<String> mMenu;

public Menu_MainAdapter(ArrayList<String> Menu) {

    mMenu = Menu;
}

@Override
public Menu_MainAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, 
int viewType) {
    View view = 
LayoutInflater.from(parent.getContext()).inflate(R.layout.menu_row, 
parent, false);
    return new ViewHolder(view);
}

@Override
public void onBindViewHolder(Menu_MainAdapter.ViewHolder holder, int 
position) {

    String date = ((mMenu.get(position)).split("|"))[0];
    String Menu = ((mMenu.get(position)).split("|"))[1];
    String Hit = ((mMenu.get(position)).split("|"))[2];

    holder.tDate.setText(date);
    holder.tDate.setText(Menu);
    holder.tDate.setText(Hit);
}

@Override
public int getItemCount() {
    return mMenu.size();
}

public class ViewHolder extends RecyclerView.ViewHolder {

    public TextView tDate;
    public TextView tMenu;
    public TextView tHit;

    public ViewHolder(View itemView) {
        super(itemView);

        tDate = (TextView) itemView.findViewById(R.id.tDate);
        tMenu = (TextView) itemView.findViewById(R.id.menu);
        tHit = (TextView) itemView.findViewById(R.id.hit);
    }
}

activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
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:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="systems.exygen.examp.MainActivity">

<FrameLayout
    android:id="@+id/contentLayout"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="1">

</FrameLayout>

<android.support.design.widget.BottomNavigationView
    android:id="@+id/navigation"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="bottom"
    android:background="?android:attr/windowBackground"
    app:menu="@menu/navigation" />

</LinearLayout>

fragment_frag_absenz.xml:

<LinearLayout 
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="systems.exygen.examp.FragAbsenz">

<!-- TODO: Update blank fragment layout -->

<android.support.v7.widget.RecyclerView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/rv_absenz">

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

</LinearLayout>

abse_row.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">

<android.support.v7.widget.CardView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="12dp">

    <TextView
        android:id="@+id/full_name"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="32sp"
        android:padding="12dp"
        />

</android.support.v7.widget.CardView>
</LinearLayout>

fragment_frag_menu.xml:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="systems.exygen.examp.FragMenu">

<!-- TODO: Update blank fragment layout -->

<android.support.v7.widget.RecyclerView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/rv_menu">

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

menu_row.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">

<android.support.v7.widget.CardView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="12dp"
    >


    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

            <TextView
                android:id="@+id/tDate"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="Time"
                android:layout_margin="12dp"
                android:textSize="24dp" />

            <TextView
                android:id="@+id/textView5"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="Tages-Menü"
                android:layout_margin="12dp"
                android:textSize="24dp"
                android:textStyle="bold"/>

            <TextView
                android:id="@+id/menu"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="Tages-Menü"
                android:layout_margin="12dp"
                android:textSize="16dp"/>

            <TextView
                android:id="@+id/textView3"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="Tages-Hit"
                android:layout_margin="12dp"
                android:textSize="24dp"
                android:textStyle="bold"/>

            <TextView
                android:id="@+id/hit"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="Tages-Hit"
                android:layout_margin="12dp"
                android:textSize="16dp"
                />

        </LinearLayout>


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

</LinearLayout>

abse_row.xml 中,您的顶级标签是 <LinearLayout>,它指定 android:layout_height="match_parent"。这将导致 RecyclerView 中的每个项目都是一个屏幕高;如果向下滚动,您应该可以看到更多卡片。

将属性更改为 android:layout_height="wrap_content",一切都会好起来的。