簡體   English   中英

即使填充了我的RecyclerView片段,它也保持空白

[英]My RecyclerView in fragment stays blank even when it's populated

我在Android上使用RecyclerView存在以下問題:

每當我嘗試使用RecyclerView打開片段時,它都保持空白。 我的ArrayList mList不為空,它包含數據(我對其進行了測試)。

我嘗試了很多方法來解決此問題,但是我是一個初學者,所以我真的不知道問題出在哪里。

RecyclerView應該顯示產品列表。 我認為我的適配器有問題,或者xml文件fragment_list無法正確顯示? 我真的不知道

我的ListAdaper類:

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.cardview.widget.CardView;
import androidx.recyclerview.widget.RecyclerView;
import java.util.ArrayList;

public class ListAdapter extends 
RecyclerView.Adapter<ListAdapter.ListViewHolder> {

private Context mContext;
private ArrayList<Item> mList;

public ListAdapter(Context context, ArrayList<Item> list) {

    mContext = context;
    mList = list;

}

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

@Override
public void onBindViewHolder(@NonNull ListViewHolder holder, int position) {
    Item currentItem = mList.get(position);

    holder.textViewName.setText(currentItem.getName());
    holder.textViewRegion.setText(currentItem.getRegion());
}

@Override
public void onAttachedToRecyclerView(@NonNull RecyclerView recyclerView) {
    super.onAttachedToRecyclerView(recyclerView);
}

public static class ListViewHolder extends RecyclerView.ViewHolder {

    public CardView cardView;
    public TextView textViewName;
    public TextView textViewRegion;

    public ListViewHolder(@NonNull View itemView) {
        super(itemView);
        cardView = itemView.findViewById(R.id.cardview);
        textViewName = itemView.findViewById(R.id.item_name);
        textViewRegion = itemView.findViewById(R.id.item_region);
    }
}

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

...我的ListFragment類:

import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.DefaultItemAnimator;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonObjectRequest;
import com.android.volley.toolbox.Volley;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.Iterator;


public class ListFragment extends Fragment {

private RecyclerView mRecyclerView;
private ListAdapter mListAdapter;
private ArrayList<Item> mList;
private RequestQueue mRequestQueue;
private Context mContext;


@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View rootview = inflater.inflate(R.layout.fragment_list, container, false);

    mRecyclerView = rootview.findViewById(R.id.recycler_view);
    mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
    mRecyclerView.setHasFixedSize(true);
    parseJSON();
    mRecyclerView.setAdapter(mListAdapter);
    mRecyclerView.setItemAnimator(new DefaultItemAnimator());
    return rootview;
}

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
}

@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
}

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    mContext = context;
}

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mList = new ArrayList<>();
    mListAdapter = new ListAdapter(mContext, mList);
    mRequestQueue = Volley.newRequestQueue(mContext);

}


private void parseJSON() {

    JsonObjectRequest request = new JsonObjectRequest("http://my_ip/sestavsisvujsvetweb/api/seznammagnetek", null, new Response.Listener<JSONObject>() {

        @Override
        public void onResponse(JSONObject response) {
            JSONObject magnetky = response;
            try {

                Iterator keys = magnetky.keys();
                while (keys.hasNext()) {
                    Object key = keys.next();
                    JSONObject value = magnetky.getJSONObject((String) key);
                    String monumentnumber = value.getString("monumentid");
                    String monumentname = value.getString("name");
                    String monumentregion = value.getString("region");
                    mList.add(new Item(monumentnumber, monumentname, monumentregion));
                }

            } catch (JSONException e) {
                e.printStackTrace();
            }

        }
    }

            , new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            error.printStackTrace();
        }
    });
    if (request != null) {
        mRequestQueue.add(request);
    }

}

}

.....和我的Item模型類:

public class Item {

private String name;
private String number;
private String region;

public Item(String number, String name, String region) {
    this.name = name;
    this.number = number;
    this.region = region;
}
public String getName() {
    return name;
}
public String getRegion() {
    return region;
}
public String getNumber() { return number; }
}

感謝您的幫助,如果我沒有提供重要信息,請告訴我:)

更新:我嘗試添加mListAdapter.notifyDataSetChanged(); 似乎很有效,但我在日志中收到此錯誤:

2019-08-21 19:46:16.947 5542-5542/com.example.app E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.app, PID: 5542
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference
    at com.example.app.ListAdapter.onBindViewHolder(ListAdapter.java:38)
    at com.example.app.ListAdapter.onBindViewHolder(ListAdapter.java:15)

........and some other stuff

刪除此行:

    mRecyclerView.setHasFixedSize(true);

由於要異步加載數據,因此在設置適配器時,數據大小為0。 因為您將其設置為固定大小,所以RecyclerView不會在項目更改時更新其大小。

setHasFixedSize()文檔中

RecyclerView仍然可以基於其他因素(例如其父級的大小)來更改其大小,但是此大小計算不能取決於其子級的大小或適配器的內容(適配器中的項目數除外)。

您還可以在加載數據后設置適配器。 它也應該工作。

您需要通知適配器有關數據集更改的信息。請在onResponse()onResponse()以下代碼

mListAdapter.notifyDataSetChanged();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM