【问题标题】:Unable to display recyclerview contents in fragment class无法在片段类中显示 recyclerview 内容
【发布时间】:2017-06-16 17:53:04
【问题描述】:

我在扩展 Fragment 的类中使用 recyclerview。但是什么都没有显示。我在类中的 StringRequest onResponse 函数中调用 recyclerview。以下是我的代码。谁能帮我解决这个问题。

ChatMessageGroups 的构造函数被调用,但是 onCreateViewHolder() 和 onBindViewHolder() 没有。 getItemCount() 也返回大于 0。

ChatGroups.java

public class ChatGroups extends Fragment {

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        final View view = inflater.inflate(R.layout.activity_chat_groups, container, false);

        final RequestQueue queue = Volley.newRequestQueue(view.getContext());
        StringRequest strReq = new StringRequest(Request.Method.POST, URL,
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        try
                        {
                            JSONObject jsonResponse = new JSONObject(response);

                            RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.recycler_view_chat_groups);
                            ChatMessageGroups mAdapter = new ChatMessageGroups(jsonResponse.getString("groups"));

                            RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getActivity(),LinearLayoutManager.HORIZONTAL,false);
                            recyclerView.setLayoutManager(mLayoutManager);
                            recyclerView.setAdapter(mAdapter);
                        }
                        catch (Exception e)
                        {
                            e.printStackTrace();
                        }
                    }
                }, new Response.ErrorListener() {

            @Override
            public void onErrorResponse(VolleyError error) {
                Toast.makeText(getActivity(), error.getMessage(), Toast.LENGTH_LONG).show();
            }
        }) {

            @Override
            protected HashMap<String, String> getParams() {
                HashMap<String, String> details = new HashMap<String, String>();
                details.put("key", session.getKey());
                return details;
            }
        };
        queue.add(strReq);

        return inflater.inflate(R.layout.activity_chat_groups, container, false);
    }
}

ChatMessageGroups.java

public class ChatMessageGroups extends RecyclerView.Adapter<ChatMessageGroups.MyViewHolder> {

    private final JSONArray messages;

    class MyViewHolder extends RecyclerView.ViewHolder {
        TextView group_name;

        MyViewHolder(View view) {
            super(view);
        group_name = (TextView) view.findViewById(R.id.group_name);

        }
    }

    ChatMessageGroups(JSONArray messages) {
        this.messages = messages;

    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.activity_chat_groups_list, parent, false);
        return new MyViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, int position)
    {
        try
        {
            HashMap<String, String> maps = (HashMap<String, String>) messages.get(position);
            for(HashMap.Entry<String, String> v: maps.entrySet())
            {
                String key = String.valueOf(v.getKey());
                String value = String.valueOf(v.getValue());

holder.group_name.setText(value);
            }
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }

    @Override
    public int getItemCount() {
        return messages.length();
    }
}

activity_chat_groups_list.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">
    <TextView
        android:id="@+id/group_name"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center_horizontal"
        android:layout_margin="5dp"
        android:textColor="@color/black"
        android:visibility="gone"/>
</LinearLayout>

activity_chat_groups.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.RecyclerView
        android:id="@+id/recycler_view_chat_groups"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="55dp"
        android:scrollbars="vertical"/>
</LinearLayout>

【问题讨论】:

    标签: android android-recyclerview


    【解决方案1】:

    片段类中无法显示recyclerview内容

    在您的onBindViewHolder 中,没有设置显示。这就是为什么你什么都看不到的原因。

    【讨论】:

    • 如果我尝试在 onBindViewHolder 中打印任何内容,则不会打印任何内容。
    • 尝试调用adapter.notifyDatasetChanged(),在将适配器设置为recyclerview之后
    • 你的 onBindViewHolder 和 onCreateViewHolder 会被调用吗?
    • 不.. 他们没有被调用。如果我在这些函数中编写 System.out.println,它们不会打印。但在构造函数内部它正在打印。
    • 如果你有非零大小的列表,那么在你调用 notifyDataSetChanged() 后必须调用 onBindViewHolder
    【解决方案2】:

    在您的第一个代码中,有一个:

    StringRequest strReq = new StringRequest(Request.Method.POST
    

    应该是 GET,而不是 POST?

    【讨论】:

    • 您找到解决方案了吗?
    【解决方案3】:

    在适配器类中将消息变量设为静态。

    【讨论】:

    • 请问哪个变量?
    • 私有最终 JSONArray 消息; ChatMessageGroups 中的这个。
    • 在 ChatMessageGroups 方法中检查 null 并尝试显示 toast,同时尝试公开该方法。
    • 它不为空。如果我打印消息的大小,它显示为 1...
    • 嗯,我怀疑是适配器问题。
    【解决方案4】:

    做一些不同的事情:

    初始化onCreateView正文中的RecyclerViewAdapterLayoutManager等。

    以这种方式创建 RecyclerView 和 Adapter 成员变量,您将能够从侦听器引用适配器,而不会警告它不是最终的......

    当你创建适配器时,传递一个空的JSONArray

    所以所有初始化调用都在onCrateView() 中完成。

    第二次添加,一个方法

    public void changeMessages(JSONArray messages){
        this.messages = messages;
        this.notifyDataSetChanged();
    }
    

    到您的适配器。

    最后在VolleyResponse.Listener中,接收数据,通过调用上面的方法将适配器中的JSONArray替换为新的JSONArray

    【讨论】:

      【解决方案5】:

      知道了……

      改变了 return inflater.inflate(R.layout.activity_chat_groups, container, false);返回视图;

      它开始工作了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-08-18
        • 1970-01-01
        • 2018-07-18
        • 1970-01-01
        • 1970-01-01
        • 2023-03-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多