回收者视图中的片段为空 [英] Recycler View is Empty in Fragment

查看:47
本文介绍了回收者视图中的片段为空的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试解析JSON数据,并使用RecyclerView将其显示在片段中.但是,当我运行该应用程序时,出现黑屏.我第一次使用了效果很好的Activity来完成了这段代码.然后,我将其转换为Fragment.在Fragment中显示空白屏幕.

I am trying to parse JSON data and display it in a fragment using RecyclerView. However, when I run that app, I am getting a blank screen. I have done this code first time using an Activity which worked perfectly. Then I converted it to a Fragment. In the Fragment it shows a blank screen.

这是我的Fragment

public class Tab1 extends Fragment {
    private RecyclerView mRecyclerView;
    private ExampleAdapter mExampleAdapter;
    private ArrayList<ExampleItem> mExampleList;
    private RequestQueue mRequestQueue;
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

        View rootView = inflater.inflate(R.layout.tab1, container, false);
        mRecyclerView = rootView.findViewById(R.id.recycler_view);
        mRecyclerView.setHasFixedSize(true);
        mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity(), LinearLayoutManager.HORIZONTAL, false));
        mExampleList = new ArrayList<>();
        mRequestQueue = Volley.newRequestQueue(requireActivity());
        parseJson();
        return rootView;
    }

    private void parseJson(){
        String url ="http://maranamassapp.cf/json_getdata.php";
        JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, url, null,
                new Response.Listener<JSONObject>() {
                    @Override
                    public void onResponse(JSONObject response) {
                        try {
                            JSONArray jsonArray = response.getJSONArray("server_response");
                            for(int i = 0; i < jsonArray.length(); i++){
                                JSONObject ser =jsonArray.getJSONObject(i);
                                String creatorname =  ser.getString("filmname");
                                String imageUrl = ser.getString("filmimage");
                                String cat = ser.getString("filmcat");

                                mExampleList.add(new ExampleItem(imageUrl,creatorname,cat));
                            }

                            mExampleAdapter = new ExampleAdapter(getContext(),mExampleList);
                            mRecyclerView.setAdapter(mExampleAdapter);
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                    }
                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                error.printStackTrace();
            }
        });

        mRequestQueue.add(request);
    }
}

以及适配器代码

public class ExampleAdapter extends RecyclerView.Adapter <ExampleAdapter.ExampleViewHolder>{
    private Context mContext;
    private ArrayList<ExampleItem> mExampleList;
    public ExampleAdapter(Context context, ArrayList<ExampleItem> examplelist){
        mContext =context;
        mExampleList = examplelist;
    }

    @NonNull
    @Override
    public ExampleViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(mContext).inflate(R.layout.example_item,parent,false);
        return new ExampleViewHolder(v);
    }

    @Override
    public void onBindViewHolder(@NonNull ExampleViewHolder holder, int position) {
        ExampleItem currentItem = mExampleList.get(position);
        String imageUrl = currentItem.getmImageUrl();
        String creatorName = currentItem.getmCreator();
        String cat =currentItem.getmCat();

        holder.mTextViewCreator.setText(creatorName);
        holder.mTextViewCat.setText(cat);
        Glide.with(mContext)
                .load(imageUrl)
                .into(holder.mImageView);
    }

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

    public class ExampleViewHolder extends RecyclerView.ViewHolder{
        public ImageView mImageView;
        public TextView mTextViewCreator;
        public TextView mTextViewCat;
        public ExampleViewHolder(View itemView) {
            super(itemView);
            mImageView = itemView.findViewById(R.id.image_view);
            mTextViewCreator = itemView.findViewById(R.id.text_view_creator);
            mTextViewCat = itemView.findViewById(R.id.text_view_cat);
        }
    }
}

有人可以帮忙吗?

推荐答案

我建议您像下面这样实现RecyclerView.

I would like to suggest you implement the RecyclerView like the following.

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

    View rootView = inflater.inflate(R.layout.tab1, container, false);
    mRecyclerView = rootView.findViewById(R.id.recycler_view);
    mRecyclerView.setHasFixedSize(true);
    mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity(), LinearLayoutManager.HORIZONTAL, false));
    mExampleList = new ArrayList<>();
    mRequestQueue = Volley.newRequestQueue(requireActivity());

    // Set the adapter here. 
    // Use getActivity() instead of getContext()
    mExampleAdapter = new ExampleAdapter(getContext(),mExampleList);

    parseJson();
    return rootView;
}

private void parseJson(){
    String url ="http://maranamassapp.cf/json_getdata.php";
    JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, url, null,
            new Response.Listener<JSONObject>() {
                @Override
                public void onResponse(JSONObject response) {
                    try {
                        JSONArray jsonArray = response.getJSONArray("server_response");
                        for(int i = 0; i < jsonArray.length(); i++){
                            JSONObject ser =jsonArray.getJSONObject(i);
                            String creatorname =  ser.getString("filmname");
                            String imageUrl = ser.getString("filmimage");
                            String cat = ser.getString("filmcat");

                            mExampleList.add(new ExampleItem(imageUrl,creatorname,cat));
                        }

                        // Just call notifyDataSetChanged here 
                        mExampleAdapter.notifyDataSetChanged();

                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            error.printStackTrace();
        }
    });

    mRequestQueue.add(request);
}

请注意,我将getActivity()而不是getContext作为上下文在onCreateView中设置了适配器.在parseJson函数中,当mExampleList用新添加的数据更新时,我只是在调用notifyDataSetChanged.

Note that, I set the adapter in the onCreateView passing getActivity() as context instead of getContext. In the parseJson function, I am just calling notifyDataSetChanged when the mExampleList is updated with newly added data.

此外,请检查是否正确从服务器获取了响应,并且在解析响应时是否没有任何异常.

Also, check if you are getting the response from your server correctly and you are not getting any exception while parsing the response.

希望这行得通!

这篇关于回收者视图中的片段为空的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆