我正在从远程数据库填充回收者视图。
recyclerview位于片段中。
第一次加载片段时,recyclerview显示所有项目。
当用户单击某个项目时,将加载另一个片段。
然后,如果用户单击“后退”按钮,则recyclerview显示所有项目,但现在显示两次。在最后一个项目之后,所有项目将再次显示。
我已经在从远程数据库加载数据的函数中包括了这两行:
marcas.clear();// public List<Marca> marcas;
adapter.notifyDataSetChanged();// private MarcaAdapter adapter;
但是我做错了吗?
编辑
在OnCreate中
/**
* Showing Swipe Refresh animation on activity create
* As animation won't start on onCreate, post runnable is used
*/
mSwipeRefreshLayout.post(new Runnable() {
@Override
public void run() {
mSwipeRefreshLayout.setRefreshing(true);
marcas.clear();
adapter.notifyDataSetChanged();
}
});
recyclerView = (RecyclerView) view.findViewById(R.id.recyclerview);
marcas = new ArrayList<>();
gridLayout = new GridLayoutManager(getActivity(), 2);
recyclerView.setLayoutManager(gridLayout);
adapter = new MarcaAdapter(getActivity(), marcas);
recyclerView.setAdapter(adapter);
// marcas.clear();
getDirectoriosFromDB(0);//LLAMADA 1
要加载数据:
private void getDirectoriosFromDB(int id) {
marcas.clear();
adapter.notifyDataSetChanged();
AsyncTask<Integer, Void, Void> asyncTask = new AsyncTask<Integer, Void, Void>() {
@Override
protected Void doInBackground(Integer... addressesIds) {
// Log.d("HOLA PERFIL", "UID REGISTRADO ANTES DE CARGAR REECYCLER: " + user_id);
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://...marcas_todas.php")
.build();
try {
Log.d("HOLA ADDRESSES", "DIRECCION LEIDA:cargando datos en getdirectorios INICIO ARRAY" );
okhttp3.Response response = client.newCall(request).execute();
JSONArray array = new JSONArray(response.body().string());
for (int i = 0; i < array.length(); i++) {
JSONObject object = array.getJSONObject(i);
Log.d("HOLA ADDRESSES", "DIRECCION LEIDA:cargando datos en getdirectorios " +array);
Log.d("HOLA ADDRESSES", "DIRECCION LEIDA: " + i);
Marca marca = new Marca(object.getInt("id_car_make"),
object.getString("name")
);
marcas.add(marca);
}
} catch (IOException e) {
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
adapter.notifyDataSetChanged();
mSwipeRefreshLayout.setRefreshing(false);
}
};
asyncTask.execute(id);
}
答案 0 :(得分:0)
基本上,您的列表在活动中是全局的,但在适配器中不是全局的,因此当您刷新列表时,该时间适配器已填充了arraylist实例,因此这是一个问题。您应该在刷新列表后重新填充适配器:像这样:
mSwipeRefreshLayout.post(new Runnable() {
@Override
public void run() {
mSwipeRefreshLayout.setRefreshing(true);
marcas.clear();
adapter = new MarcaAdapter(getActivity(), marcas);
adapter.notifyDataSetChanged();
}
});