2016-07-10 2 views
0

Я не могу найти рабочее решение для этой проблемы, и я не знаю, как правильно формулировать проблему. Я использую API OpenWeather для получения прогноза на следующие семь дней. Я определил отдельный класс для всей работы, связанной с сетью, и сохранение результата в базе данных sqlite, а затем прикрепление результирующей строки к просмотру recycler. Я использовал модификацию для превращения моего HTTP API в интерфейс Java. Я передал адаптер вида recycler в этот класс конструктор из моего MainFragment class.I может правильно получить данные из API, но следующий код не работает должным образомАдаптер RecyclerView не может удалить все элементы

@Override 
    public void onResponse(Call<OpenWeather> call, Response<OpenWeather> response) { 
     int code = response.code(); 
     if (code == 200) { 
      OpenWeather openWeather = response.body(); 
      String []result = getWeatherDataFromRetrofit(openWeather,postal); 
      if (mForecastAdapter != null) { 
       Log.e(LOG_TAG,""+mForecastAdapter.getItemCount()); 
       for(int i=0;i<mForecastAdapter.getItemCount();i++){ 
        mForecastAdapter.remove(i); 
       } 
       for(int i=0;i<result.length;i++) { 
        String dayForecastStr = result[i]; 
        mForecastAdapter.add(i,dayForecastStr); 
       } 
       // New data is back from the server. Hooray! 

      } 

     } else { 
      Toast.makeText(mContext, "Did not work: " + String.valueOf(code), Toast.LENGTH_LONG).show(); 
     } 
    } 

Эта функция называется асинхронна в retrofit.The е или петля, которая используется для удаления элементов в mForecastAdapter не работает полностью, которая вызывает список, чтобы содержать дубликат

Heres в удалить и добавить функцию я использовал Ресайклер Посмотреть адаптер

public void add(int position, String item) { 
     mDataset.add(position, item); 
     Log.e("Add element:", item); 
     notifyItemInserted(position); 
    } 

    public void remove(int position) { 
     Log.e("Remove element:",mDataset.get(position)); 
     mDataset.remove(position); 
     notifyItemRemoved(position); 
    } 

Ниже Записывать запись, которая показывает, что цикл я использую для очистки mForecastAdapter не работает полностью

Когда приложение начинает

E/FetchWeatherTask: 0 
E/Add element:: Sun, Jul 10 - Rain - 35/27 
E/Add element:: Mon, Jul 11 - Rain - 32/27 
E/Add element:: Tue, Jul 12 - Rain - 32/27 
E/Add element:: Wed, Jul 13 - Rain - 35/27 
E/Add element:: Thu, Jul 14 - Rain - 32/26 
E/Add element:: Fri, Jul 15 - Rain - 33/27 
E/Add element:: Sat, Jul 16 - Rain - 32/27 

Когда я обновить приложение для впервые

E/FetchWeatherTask: 7 
E/Remove element:: Sun, Jul 10 - Rain - 35/27 
E/Remove element:: Tue, Jul 12 - Rain - 32/27 
E/Remove element:: Thu, Jul 14 - Rain - 32/26 
E/Remove element:: Sat, Jul 16 - Rain - 32/27 
E/Add element:: Sun, Jul 10 - Rain - 35/27 
E/Add element:: Mon, Jul 11 - Rain - 32/27 
E/Add element:: Tue, Jul 12 - Rain - 32/27 
E/Add element:: Wed, Jul 13 - Rain - 35/27 
E/Add element:: Thu, Jul 14 - Rain - 32/26 
E/Add element:: Fri, Jul 15 - Rain - 33/27 
E/Add element:: Sat, Jul 16 - Rain - 32/27 

Когда я освежил приложение для второго раза

E/FetchWeatherTask: 10 
E/Remove element:: Sun, Jul 10 - Rain - 35/27 
E/Remove element:: Tue, Jul 12 - Rain - 32/27 
E/Remove element:: Thu, Jul 14 - Rain - 32/26 
E/Remove element:: Sat, Jul 16 - Rain - 32/27 
E/Remove element:: Wed, Jul 13 - Rain - 35/27 
E/Add element:: Sun, Jul 10 - Rain - 35/27 
E/Add element:: Mon, Jul 11 - Rain - 32/27 
E/Add element:: Tue, Jul 12 - Rain - 32/27 
E/Add element:: Wed, Jul 13 - Rain - 35/27 
E/Add element:: Thu, Jul 14 - Rain - 32/26 
E/Add element:: Fri, Jul 15 - Rain - 33/27 
E/Add element:: Sat, Jul 16 - Rain - 32/27 

Я не может понять, почему цикл используется для удаления элемента не работает правильно .THANKS в передовых

Решение: -

int count = mForecastAdapter.getItemCount() 
for(int i=0;i<count;i++){ 
        mForecastAdapter.remove(i); 
       } 

Или я могу очистить список в один присест в отдалении()

public void remove() { 
      mDataset.clear(); 
      notifyItemRemoved(position); 
     } 
+0

Вы можете попробовать notifyDataSetChanged вместо notifyItemRemoved пожалуйста? – Swag

+1

как насчет 'int i = mForecastAdapter.getItemCount() - 1; i> = 0; i -' при удалении данных. Или просто вызовите очистить все элементы. – LordRaydenMK

+0

Thats seem weird, но больше кода, который вы написали, необходимо найти проблему, возможно, вы можете просто попробовать «очистить», чтобы очистить массив, и просто использовать функцию добавления, а call notifydatas выбрано, когда это будет сделано?или попробуйте отладить, если элемент действительно удаляется в первую очередь. – Roee

ответ

0

Ваша проблема здесь:

for(int i=0;i<mForecastAdapter.getItemCount();i++){ 
    mForecastAdapter.remove(i); 
} 

В основном, mForecastAdapter.getItemCount() возвращает другой размер каждой итерацию для цикла, так как вы удаление предметов и изменение их размера. Это означает, что для 10 элементов вы оба увеличиваете i и уменьшаете количество ваших счетчиков, эффективно выполняя цикл в два раза больше, чем вам хотелось бы.

Вторая проблема: вы удаляете элемент ith на каждой итерации, но списки в Java повторно индексируются при удалении элементов.

Попробуйте это:

int count = mForecastAdapter.getItemCount(); 
for (int i = 0; i < count; ++i) { 
    mForecastAdapter.remove(0); 
} 
+0

ohh спасибо thomas, а также я думаю изменить функцию удаления, чтобы я мог очистить список напрямую, а не цикл –