我在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();
}
}
...my 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);
}
}
}
.....and我的项目模型类:
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
发布于 2019-08-21 17:38:34
您需要通知适配器数据集在onResponse()
代码下面更改了onResponse()
mListAdapter.notifyDataSetChanged();
发布于 2019-08-21 17:32:00
移除这一行:
mRecyclerView.setHasFixedSize(true);
由于是异步加载数据,所以设置适配器时数据大小为0。因为您将其设置为固定大小,所以当项目更改时,RecyclerView不会更新其大小。
RecyclerView仍然可以根据其他因素(例如父级的大小)更改其大小,但这种大小计算不能取决于其子节点的大小或适配器的内容(适配器中的项目数除外)。
还可以在加载数据后设置适配器。它也应该能起作用。
https://stackoverflow.com/questions/57596565
复制相似问题