我有一个应用程序,它将天气信息存储在SQLite数据库中,并将其显示在RecyclerView中。我正在尝试实现一个更新数据库的函数,并使用表中更新的内容刷新RecyclerView。
当用户点击“刷新”按钮时,我已经实现了这一点。但是,RecyclerView仅在第二次单击按钮时更新,我无法弄清楚为什么第一次单击时没有更新。
以下类是Async任务,它从API获取天气数据并成功解析它。 “onPostExecute”语句是我更新数据库值的地方。
public class UpdateWeather extends AsyncTask<String, Void, CurrentWeather> {
@Override
protected CurrentWeather doInBackground(String... strings) {
//CONNECTION CLASS
//connect to API and download JSON data
String data = ((new HTTPClient()).getForecastData(strings[0]));
currentWeather = CurrentWeatherParser.getCurrentWeather(data); //Use the Parser class to get relevant data from the JSON
return currentWeather;
}
@Override
protected void onPostExecute(CurrentWeather currentWeather) {
super.onPostExecute(currentWeather);
ContentValues cv = new ContentValues();
cv.put(CurrentWeatherContract.CurrentWeatherEntry.COL_0, currentWeather.currentCondtion.getCityName());
cv.put(CurrentWeatherContract.CurrentWeatherEntry.COL_1, "countrycodetest");
cv.put(CurrentWeatherContract.CurrentWeatherEntry.COL_7, "test3");
cv.put(CurrentWeatherContract.CurrentWeatherEntry.COL_5, "sunrisetest");
cv.put(CurrentWeatherContract.CurrentWeatherEntry.COL_6, currentWeather.currentCondtion.getSunset());
cv.put(CurrentWeatherContract.CurrentWeatherEntry.COL_8, "test4");
cv.put(CurrentWeatherContract.CurrentWeatherEntry.COL_2, "test2");
cv.put(CurrentWeatherContract.CurrentWeatherEntry.COL_3, 2.33);
cv.put(CurrentWeatherContract.CurrentWeatherEntry.COL_4, 23.3);
//update table
myDB.update(CurrentWeatherContract.CurrentWeatherEntry.TABLE_NAME, cv, "City_Name = ?",new String[] {currentWeather.currentCondtion.getCityName()});
}
}
//execute the async task based on a city name.
public void updateCurrentWeather(String city) {
FavouritesActivity.UpdateWeather updateWeather = new FavouritesActivity.UpdateWeather();
updateWeather.execute(Utilities.BASEURL_CR + city + Utilities.APIKEY);
}
我的点击监听器:
refresh.setOnClickListener(
new View.OnClickListener() {
@Override
public void onClick(View v) {
updateCurrentWeather("Madrid");
recyclerView.setLayoutManager(new LinearLayoutManager(FavouritesActivity.this));
mAdapter = new CurrentWeatherAdapter(FavouritesActivity.this, getAllItems());
recyclerView.setAdapter(mAdapter);
getAllItems();
}
}
);
GetAllItems()方法:
private Cursor getAllItems()
{
return myDB.query(
CurrentWeatherContract.CurrentWeatherEntry.TABLE_NAME,
null,
null,
null,
null,
null,
CurrentWeatherContract.CurrentWeatherEntry._ID + " DESC"
);
}
答案 0 :(得分:0)
不要在点击adapter
按钮时添加refresh
,而是在onclick的外侧设置适配器并更新list
和notify
adapter
按钮单击。
List list = getAllItems();
recyclerView.setLayoutManager(new LinearLayoutManager(FavouritesActivity.this));
mAdapter = new CurrentWeatherAdapter(FavouritesActivity.this, list);
recyclerView.setAdapter(mAdapter);
并在onClick()内部
list = getAllItem();
adapter.notifyDataSetChanged();
希望这会有所帮助。
答案 1 :(得分:0)
问题是您将旧数据输入recylerView,因为您检索数据异步,新数据在点击时无法使用。因此,在将新数据保存到数据库之后,应该调用刷新方法。