2016-07-10 3 views
0

이 문제에 대한 해결 방법을 찾을 수 없으며 문제점을 정확하게 표현하는 방법을 모릅니다. OpenWeather API를 사용하여 향후 7 일간 예측을합니다. 모든 네트워크 관련 작업을위한 별도의 클래스 및 결과를 sqlite 데이터베이스에 저장 한 다음 결과 문자열을 리사이클 뷰에 연결합니다. HTTP API를 자바 인터페이스로 바꾸기 위해 retrofit을 사용했습니다. 리사이클 뷰 어댑터를이 클래스에 전달했습니다. 내 MainFragment 군 수업에서 생성자는 정확하게 API에서 데이터를 얻을 수 있어요하지만, 다음 코드는이 기능은 비동기 retrofit.The f를 호출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(); 
     } 
    } 

제대로 작동하지 않습니다 또는 mForecastAdapter 요소를 제거하기 위해 사용되는 루프는 다음

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); 
    } 

휴지통보기 어댑터 기능을 중복 항목을 Heres

에게 제거를 포함하고 추가 할 목록을 완전히 실행되지 로그되어 내가 사용의 원인이되는 앱이

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 
을 시작하면 내가 mForecastAdapter을 지우기 위해 사용하고 for 루프가 완전히

를 실행하지 않는 것을 보여주는 항목 내가 두 번째로 응용 프로그램을 갱신 처음

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 

나는 요소를 제거하기 위해 사용 for 루프가 제대로 작동하지 않는 이유를 이해할 수 없습니다입니다 고급

솔루션에 .Thanks : -

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

아니면이 제거에서 한 가지의 목록을 지울 수 있습니다()

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

가 대신 notifyItemRemoved의하십시오 notifyDataSetChanged 사용해 볼 수 있습니까? – Swag

+1

데이터를 삭제할 때'int i = mForecastAdapter.getItemCount() - 1; i> = 0; i -'가됩니다. 아니면 모든 항목을 지우라고 부르세요. – LordRaydenMK

+0

그게 이상하지만 더 많은 코드가 문제를 찾으려면 필요합니다. 어쩌면 단지 배열을 비우고 "add"함수와 호출 할 때 notifydatasetchanged를 사용하여 "clear"를 사용할 수 있습니다.또는 항목이 실제로 처음부터 삭제되고 있는지 디버그하려고 시도하십시오. – 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 그리고 또한 내가 루핑 대신 목록을 지울 수 있도록 제거 기능을 변경하려고 생각 중입니다 –

관련 문제