RecyclerView更新第二个按钮而不是第一个按钮

时间:2017-12-10 17:56:48

标签: android sqlite android-recyclerview

我有一个应用程序,它将天气信息存储在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"
    );
}

2 个答案:

答案 0 :(得分:0)

不要在点击adapter按钮时添加refresh,而是在onclick的外侧设置适配器并更新listnotify 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,因为您检索数据异步,新数据在点击时无法使用。因此,在将新数据保存到数据库之后,应该调用刷新方法。