Java 无法在具有动态数据的RecyclerView中显示项目
我试图显示从服务器获取的一些数据,但无法在Java 无法在具有动态数据的RecyclerView中显示项目,java,android,json,android-recyclerview,adapter,Java,Android,Json,Android Recyclerview,Adapter,我试图显示从服务器获取的一些数据,但无法在recyclerView中显示获取的数据。数据是有效的,解析(JSON解析)工作正常,但我的活动仅显示一个白色屏幕。 当我使用一些虚拟数据运行应用程序时,当我试图设置从服务器解析的数据时,问题就出现了。 这是我的主课 public class JSONDataViewer extends AppCompatActivity { Context context; // private List<Movie> movieL
recyclerView
中显示获取的数据。数据是有效的,解析(JSON解析)工作正常,但我的活动仅显示一个白色屏幕。
当我使用一些虚拟数据运行应用程序时,当我试图设置从服务器解析的数据时,问题就出现了。
这是我的主课
public class JSONDataViewer extends AppCompatActivity {
Context context;
// private List<Movie> movieList
private RecyclerView mRecyclerView;
private CustomAdapter mAdapter;
private List<MyData> dataList = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_jsondata_viewer);
this.context = this;
AndroidNetworking.initialize(getApplicationContext());
mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);
// mRecyclerView.setHasFixedSize(true);
// loadDummyData();
loadData();
Log.e("DataListPopulated", "Data list populated");
mAdapter = new CustomAdapter(dataList);
RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getApplicationContext());
mRecyclerView.setLayoutManager(mLayoutManager);
mRecyclerView.setItemAnimator(new DefaultItemAnimator());
Log.e("SettingAdapter", "Setting Adapter");
mRecyclerView.setAdapter(mAdapter);
Log.e("AdapterSet", "Adapter Set Success");
}
private void loadDummyData() {
String question = "Question ";
int qNo = 1;
for (int i = 0; i < 10; i++) {
qNo++;
MyData data = new MyData("" + qNo, question + qNo);
Log.e("Question" + " " + qNo,
"\nQuestion id = " + data.getQuestionId() +
" Question text = " + data.getQuestionText());
dataList.add(data);
}
}
private void loadData() {
AndroidNetworking.post("http://www.skafs.com/survey/api/index.php")
.addBodyParameter("tag", "getquestion")
.addBodyParameter("category_id", "2")
.setPriority(Priority.MEDIUM)
.build()
.getAsJSONObject(new JSONObjectRequestListener() {
@Override
public void onResponse(JSONObject response) {
Log.i("LoadingData", "" + "Successful" + response);
Toast.makeText(context, "Response:\n" + "Loading Data" + response,
Toast.LENGTH_LONG).show();
boolean success = response.optBoolean("success");
if (success) {
Log.e("InsideSuccess", "Success = " + success);
try {
JSONArray questions =
response.optJSONArray("questions");
Log.e("Questions", questions.toString());
for (int i = 0; i < questions.length(); i++) {
JSONObject obj = questions.getJSONObject(i);
MyData data = new MyData(
obj.getString("question_id"),
obj.getString("question_text"));
Log.e("Question" + " " + i,
"\nQuestion id = " + data.getQuestionId() +
" Question text = " + data.getQuestionText());
dataList.add(data);
}
Log.e("ListData", "List Size is = "+dataList.size());
} catch (JSONException e) {
e.printStackTrace();
}
}
}
@Override
public void onError(ANError anError) {
anError.printStackTrace();
Log.e("ParsingJSON", "" + "Failed getting json");
}
});
}
}
请给我指出我做错事情的方向
我没有得到任何例外。这是我的CustomAdapter
类
public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.MyViewHolder> {
private List<MyData> dataList;
public CustomAdapter(List<MyData> dataList) {
this.dataList = dataList;
Log.e("Constructor", "Working");
Log.e("Constructor", "DataList Size = " + dataList.size());
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.card_lay, parent, false);
Log.e("LayoutInflated", "Working");
return new MyViewHolder(itemView);
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
Log.e("OnBIndMethod", "OnBind Working");
MyData data = dataList.get(position);
holder.questionId.setText(data.getQuestionId());
holder.questionText.setText(data.getQuestionText());
}
@Override
public int getItemCount() {
return dataList.size();
}
public class MyViewHolder extends RecyclerView.ViewHolder {
public TextView questionId, questionText;
public MyViewHolder(View itemView) {
super(itemView);
questionId = (TextView) itemView.findViewById(R.id.question_id);
questionText = (TextView) itemView.findViewById(R.id.question_text);
Log.e("FindViewById", "Working");
}
}
}
公共类CustomAdapter扩展了RecyclerView.Adapter{
私有列表数据列表;
公共CustomAdapter(列表数据列表){
this.dataList=dataList;
Log.e(“建造商”、“工作”);
Log.e(“构造函数”、“数据列表大小=“+DataList.Size());
}
@凌驾
公共MyViewHolder onCreateViewHolder(视图组父级,int-viewType){
View itemView=LayoutInflater.from(parent.getContext())
.充气(R.layout.card_lay,父级,假);
Log.e(“平放”、“工作”);
返回新的MyViewHolder(itemView);
}
@凌驾
公共无效onBindViewHolder(MyViewHolder,int位置){
Log.e(“OnBind方法”、“OnBind工作”);
MyData data=dataList.get(位置);
holder.questionId.setText(data.getQuestionId());
holder.questionText.setText(data.getQuestionText());
}
@凌驾
public int getItemCount(){
返回dataList.size();
}
公共类MyViewHolder扩展了RecyclerView.ViewHolder{
公共文本查看问题ID,问题文本;
公共MyViewHolder(查看项目视图){
超级(项目视图);
questionId=(TextView)itemView.findViewById(R.id.question\u id);
questionText=(TextView)itemView.findViewById(R.id.question\u text);
Log.e(“findviewbyd”,“Working”);
}
}
}
MyData
类有两个字符串类型的字段及其getter/setter方法。for(int i=0;ifor (int i = 0; i < questions.length(); i++) {
JSONObject obj = questions.getJSONObject(i);
MyData data = new MyData(
obj.getString("question_id"),
obj.getString("question_text"));
Log.e("Question" + " " + i,
"\nQuestion id = " + data.getQuestionId() +
" Question text = " + data.getQuestionText());
dataList.add(data);
}
// notify data set change call missing
mAdapter.notifyDataSetChanged();
JSONObject obj=questions.getJSONObject(i);
MyData数据=新的MyData(
obj.getString(“问题id”),
obj.getString(“问题文本”);
Log.e(“问题”+”+i,
“\n查询id=“+data.getQuestionId()+
“问题文本=“+data.getQuestionText());
dataList.add(数据);
}
//通知数据集更改调用丢失
mAdapter.notifyDataSetChanged();
for(int i=0;i
或任何适当的通知方法@谢谢你救了我一天。好奇的是,如果我们加载虚拟值,乳清回收器视图没有这个方法能工作吗?只是一个小小的转储错误让我的日子很难过。oh@InzimamTariqIT“只是好奇的乳清回收器,没有这种方法,它是可以工作的”-不,它不会工作。您应该为dataList提供大于零的大小(列表中的所有项目都将显示),或者对列表执行任何添加、删除、更新操作,并调用“notifyDataSetChanged”方法来反映数据items@Sush嗯,我想知道它是在我的情况下找到的。除了我的loadDummyData(),我什么也没做代码>工作正常,无需在上述代码中调用数据更改。或任何适当的通知方法@谢谢你救了我一天。好奇的是,如果我们加载虚拟值,乳清回收器视图没有这个方法能工作吗?只是一个小小的转储错误让我的日子很难过。oh@InzimamTariqIT“只是好奇的乳清回收器,没有这种方法,它是可以工作的”-不,它不会工作。您应该为dataList提供大于零的大小(列表中的所有项目都将显示),或者对列表执行任何添加、删除、更新操作,并调用“notifyDataSetChanged”方法来反映数据items@Sush嗯,我想知道它是在我的情况下找到的。除了我的loadDummyData(),我什么也没做代码>工作正常,无需在上述代码中调用数据更改。
for (int i = 0; i < questions.length(); i++) {
JSONObject obj = questions.getJSONObject(i);
MyData data = new MyData(
obj.getString("question_id"),
obj.getString("question_text"));
Log.e("Question" + " " + i,
"\nQuestion id = " + data.getQuestionId() +
" Question text = " + data.getQuestionText());
dataList.add(data);
}
// notify data set change call missing
mAdapter.notifyDataSetChanged();