[英]Android RecyclerView not updating items
我的tabview片段Activity上有一个RecyclerView 。 我使用arrayList填充recyclerview上的项目。 这些JSON数据是通过凌空库从此URL中获取的。
这是我的代码
public class EditorsChoiceFragment extends Fragment {
private RecyclerView mRecyclerView;
private RecyclerView.Adapter mAdapter;
private RecyclerView.LayoutManager mLayoutManager;
private static String LOG_TAG = "EditorsChoiceFragment";
private String urlJsonArry = "http://checkthisphone.com/black.apps/get_apps/editor.php";
private ProgressDialog pDialog;
private String jsonResponse;
private static String TAG = EditorsChoiceFragment.class.getSimpleName();
private String appTitle;
private String appDescription;
private JSONArray appDetails=null;
ArrayList<DataObject> results = new ArrayList<DataObject>();
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.editor_choice_layout, container, false);
makeJsonArrayRequest();
pDialog = new ProgressDialog(getContext());
pDialog.setMessage("Please wait...");
pDialog.setCancelable(false);
mRecyclerView = (RecyclerView)view.findViewById(R.id.my_recycler_view);
mRecyclerView.setHasFixedSize(true);
mLayoutManager = new LinearLayoutManager(getContext());
mRecyclerView.setLayoutManager(mLayoutManager);
// mAdapter.notifyDataSetChanged();
makeJsonArrayRequest();
mAdapter = new MyRecyclerViewAdapter(results);
mAdapter.notifyDataSetChanged();
mRecyclerView.setAdapter(mAdapter);
mAdapter.notifyDataSetChanged();
return view;
}
@Override
public void onResume() {
super.onResume();
/*((MyRecyclerViewAdapter) mAdapter).setOnItemClickListener(new MyRecyclerViewAdapter
.MyClickListener() {
@Override
public void onItemClick(int position, View v) {
Log.i(LOG_TAG, " Clicked on Item " + position);
}
});*/
}
private void makeJsonArrayRequest() {
// showpDialog();
JsonArrayRequest req = new JsonArrayRequest(urlJsonArry,
new Response.Listener<JSONArray>() {
@Override
public void onResponse(JSONArray response) {
Log.d(TAG, response.toString());
try {
for (int i = 0; i < response.length(); i++) {
JSONObject person = (JSONObject) response.get(i);
String title = person.getString("title");
String description = person.getString("description");
DataObject obj = new DataObject(title, description);
results.add(i, obj);
}
} catch (JSONException e) {
e.printStackTrace();
Toast.makeText(getContext(),
"Error: " + e.getMessage(),
Toast.LENGTH_LONG).show();
Log.d(TAG, e.getMessage());
}
hidepDialog();
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
VolleyLog.d(TAG, "Error: " + error.getMessage());
Toast.makeText(getContext(),
error.getMessage(), Toast.LENGTH_SHORT).show();
hidepDialog();
}
});
// Adding request to request queue
AppController.getInstance().addToRequestQueue(req);
}
private void showpDialog() {
if (!pDialog.isShowing())
pDialog.show();
}
private void hidepDialog() {
if (pDialog.isShowing())
pDialog.dismiss();
}
}
日志文件指示数据正确接收,但是recyclerview未更新。 我用过.notifyDataSetChanged();
但仍然显示空白。 请我找出错误..
我没有逐行查看您的代码,但是我建议将这些代码重构为如下所示的方法
public void setAdapter(ArrayList<DataObject> results){
mAdapter = new MyRecyclerViewAdapter(results);
mRecyclerView.setAdapter(mAdapter);
mAdapter.notifyDataSetChanged();
}
在检索结果之后再次在onCreateView
调用此onResponse
,这意味着在onResponse
方法内部,例如此处
try {
for (int i = 0; i < response.length(); i++) {
JSONObject person = (JSONObject) response.get(i);
String title = person.getString("title");
String description = person.getString("description");
DataObject obj = new DataObject(title, description);
results.add(i, obj);
}
}
catch (JSONException e) {
e.printStackTrace();
Toast.makeText(getContext(),
"Error: " + e.getMessage(),
Toast.LENGTH_LONG).show();
Log.d(TAG, e.getMessage());
}
//Call method here
setAdapter(results)
请从以下位置删除notifyDataSetChanged。
makeJsonArrayRequest();
mAdapter = new MyRecyclerViewAdapter(results);
mAdapter.notifyDataSetChanged();
mRecyclerView.setAdapter(mAdapter);
mAdapter.notifyDataSetChanged();
当您更改了适配器中的数据并希望适配器知道数据已更改时,应该调用notifyDataSetChanged。 因此,在这种情况下,您将称其为一些添加到结果数组列表中的数据。
因此,一旦您在makeJsonArrayRequest()调用中将数据添加到结果中
mAdapter.notifyDataSetChanged();
在for循环之后。
另外,在适配器构造函数中,请确保不创建新的数组列表,并按以下方式重用结果。
ArrayList<DataObject> results;
MyRecyclerViewAdapter(results){
this.results = results;
}
让我知道这个是否奏效。 如果没有,请发布您的适配器代码,以便我进一步调试。
try {
for (int i = 0; i < response.length(); i++) {
JSONObject person = (JSONObject) response.get(i);
String title = person.getString("title");
String description = person.getString("description");
DataObject obj = new DataObject(title, description);
results.add(i, obj);
mAdapter.notifyItemInserted(i);
}
您应该在凌空的onRequestFinished方法中通知DatasetChanged。
在MainActivity.java中
RequestListener listener;
listener = new RequestListener();
volley_queue.addRequestFinishedListener(listener);
RequestListner类
class RequestListener implements RequestQueue.RequestFinishedListener {
@Override
public void onRequestFinished(Request request) {
mAdapter.notifyDataSetChanged();
}
}
try
{
for (int i = 0; i < response.length(); i++)
{
JSONObject person = (JSONObject) response.get(i);
String title = person.getString("title");
String description = person.getString("description");
DataObject obj = new DataObject(title, description);
results.add(i, obj);
}
}
catch (JSONException e)
{
e.printStackTrace();
Toast.makeText(getContext(),"Error: " + e.getMessage(),Toast.LENGTH_LONG).show();
Log.d(TAG, e.getMessage());
}
mAdapter.notifyDataSetChanged();
hidepDialog();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.