2017-01-16 30 views
-3

我的RecyclerView跳過視圖和第一次加載時它使所有視圖成爲數組中的同一個對象,直到我向下滾動並備份,然後它們開始出現。我沒有看到問題,因爲它確實有效,但它不能正常工作。我正在使用Volley進行網絡通話。RecyclerView跳過前幾個視圖

public class ForecastActivity extends AppCompatActivity { 

    RecyclerView recyclerView; 
    ListAdapter listAdapter; 

    RequestQueue requestQueue; 
    JSONParser jsonParser = JSONParser.getJsonParser(); 
    ForecastListItem[] mArrayList; 


    TextView mForecastCityandCountyText; 
    String mForecastCityandContryString; 
    String mForecastCityNameString; 
    String mForecastCountryString; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_forcast); 
     initializeUI(); 
     requestQueue = Volley.newRequestQueue(this); 
     netWorkRequest(); 
    } 


    public void initializeUI() { 
     mForecastCityandCountyText = (TextView) findViewById(R.id.ForecastCityName); 
     recyclerView = (RecyclerView) findViewById(R.id.Recylerviewlayout); 
     listAdapter = new ListAdapter(); 
     recyclerView.setAdapter(listAdapter); 
     recyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext())); 
     mArrayList = new ForecastListItem[10]; 
     mArrayList[0] = new ForecastListItem(); 
     mArrayList[1] = new ForecastListItem(); 
     mArrayList[2] = new ForecastListItem(); 
     mArrayList[3] = new ForecastListItem(); 
     mArrayList[4] = new ForecastListItem(); 
     mArrayList[5] = new ForecastListItem(); 
     mArrayList[6] = new ForecastListItem(); 
     mArrayList[7] = new ForecastListItem(); 
     mArrayList[8] = new ForecastListItem(); 
     mArrayList[9] = new ForecastListItem(); 
    } 


    public void netWorkRequest() { 
     JsonObjectRequest JsonObjectRequest = new JsonObjectRequest(Request.Method.GET, jsonParser.getForecastUrl(), null, new Response.Listener<JSONObject>() { 
      @Override 
      public void onResponse(JSONObject response) { 

       try { 
        String UniverSalIconString; 
        Log.d(jsonParser.getForecastUrl(), ""); 

        JSONObject mJsonCityObject = response.getJSONObject("city"); 
        Log.d("here is the object", mJsonCityObject.toString()); 

        mForecastCityNameString = jsonParser.getString("name", mJsonCityObject); 
        mForecastCountryString = jsonParser.getString("country", mJsonCityObject); 
        mForecastCityandContryString = mForecastCityNameString + "," + mForecastCountryString; 
        mForecastCityandCountyText.setText(mForecastCityandContryString); 

        //********************************************************************************************************************************************* 
        // add all the information to arraylist so i can be processed by recycler view 
        // add refresh button 
        JSONArray JsonListArray = jsonParser.getJSONArray("list", response); 

        JSONObject Day1 = jsonParser.getJSONObject(0, JsonListArray); 
        JSONObject TempObj = jsonParser.getJSONObject("temp", Day1); 
        mArrayList[0].setmForecastTempDouble(jsonParser.getDouble("day", TempObj)); 
        JSONArray JsonDay1WeatherArray = jsonParser.getJSONArray("weather", Day1); 
        JSONObject Day1WeatherJsonObject = jsonParser.getJSONObject(0, JsonDay1WeatherArray); 
        UniverSalIconString = jsonParser.getString("icon", Day1WeatherJsonObject); 
        mArrayList[0].setmForecastDescriptionString(jsonParser.getString("description", Day1WeatherJsonObject)); 
        mArrayList[0].setmForecastIconUrl(jsonParser.getCurrentWeatherIconUrl(UniverSalIconString)); 
        mArrayList[0].setMYNUMBER(1); 
        UniverSalIconString = null; 


        JSONObject Day2 = jsonParser.getJSONObject(1, JsonListArray); 
        JSONObject TempObj2 = jsonParser.getJSONObject("temp", Day2); 
        mArrayList[1].setmForecastTempDouble(jsonParser.getDouble("day", TempObj2)); 
        JSONArray JsonDay2WeatherArray = jsonParser.getJSONArray("weather", Day2); 
        JSONObject Day2WeatherJsonObject = jsonParser.getJSONObject(0, JsonDay2WeatherArray); 
        UniverSalIconString = jsonParser.getString("icon", Day2WeatherJsonObject); 
        mArrayList[1].setmForecastDescriptionString(jsonParser.getString("description", Day2WeatherJsonObject)); 
        mArrayList[1].setmForecastIconUrl(jsonParser.getCurrentWeatherIconUrl(UniverSalIconString)); 
        mArrayList[1].setMYNUMBER(2); 
        UniverSalIconString = null; 


        JSONObject Day3 = jsonParser.getJSONObject(2, JsonListArray); 
        JSONObject TempObj3 = jsonParser.getJSONObject("temp", Day3); 
        mArrayList[2].setmForecastTempDouble(jsonParser.getDouble("day", TempObj3)); 
        JSONArray JsonDay3WeatherArray = jsonParser.getJSONArray("weather", Day3); 
        JSONObject Day3WeatherJsonObject = jsonParser.getJSONObject(0, JsonDay3WeatherArray); 
        UniverSalIconString = jsonParser.getString("icon", Day3WeatherJsonObject); 
        mArrayList[2].setmForecastDescriptionString(jsonParser.getString("description", Day3WeatherJsonObject)); 
        mArrayList[2].setmForecastIconUrl(jsonParser.getCurrentWeatherIconUrl(UniverSalIconString)); 
        mArrayList[2].setMYNUMBER(3); 
        UniverSalIconString = null; 


        JSONObject Day4 = jsonParser.getJSONObject(3, JsonListArray); 
        JSONObject TempObj4 = jsonParser.getJSONObject("temp", Day4); 
        mArrayList[3].setmForecastTempDouble(jsonParser.getDouble("day", TempObj4)); 
        JSONArray JsonDay4WeatherArray = jsonParser.getJSONArray("weather", Day4); 
        JSONObject Day4WeatherJsonObject = jsonParser.getJSONObject(0, JsonDay4WeatherArray); 
        UniverSalIconString = jsonParser.getString("icon", Day4WeatherJsonObject); 
        mArrayList[3].setmForecastDescriptionString(jsonParser.getString("description", Day4WeatherJsonObject)); 
        mArrayList[3].setmForecastIconUrl(jsonParser.getCurrentWeatherIconUrl(UniverSalIconString)); 
        mArrayList[3].setMYNUMBER(4); 
        UniverSalIconString = null; 


        JSONObject Day5 = jsonParser.getJSONObject(4, JsonListArray); 
        JSONObject TempObj5 = jsonParser.getJSONObject("temp", Day5); 
        mArrayList[4].setmForecastTempDouble(jsonParser.getDouble("day", TempObj5)); 
        JSONArray JsonDay5WeatherArray = jsonParser.getJSONArray("weather", Day5); 
        JSONObject Day5WeatherJsonObject = jsonParser.getJSONObject(0, JsonDay5WeatherArray); 
        UniverSalIconString = jsonParser.getString("icon", Day5WeatherJsonObject); 
        mArrayList[4].setmForecastDescriptionString(jsonParser.getString("description", Day5WeatherJsonObject)); 
        mArrayList[4].setmForecastIconUrl(jsonParser.getCurrentWeatherIconUrl(UniverSalIconString)); 
        mArrayList[4].setMYNUMBER(5); 
        UniverSalIconString = null; 


        JSONObject Day6 = jsonParser.getJSONObject(5, JsonListArray); 
        JSONObject TempObj6 = jsonParser.getJSONObject("temp", Day6); 
        mArrayList[5].setmForecastTempDouble(jsonParser.getDouble("day", TempObj6)); 
        JSONArray JsonDay6WeatherArray = jsonParser.getJSONArray("weather", Day6); 
        JSONObject Day6WeatherJsonObject = jsonParser.getJSONObject(0, JsonDay6WeatherArray); 
        UniverSalIconString = jsonParser.getString("icon", Day6WeatherJsonObject); 
        mArrayList[5].setmForecastDescriptionString(jsonParser.getString("description", Day6WeatherJsonObject)); 
        mArrayList[5].setmForecastIconUrl(jsonParser.getCurrentWeatherIconUrl(UniverSalIconString)); 
        mArrayList[5].setMYNUMBER(6); 
        UniverSalIconString = null; 


        JSONObject Day7 = jsonParser.getJSONObject(6, JsonListArray); 
        JSONObject TempObj7 = jsonParser.getJSONObject("temp", Day7); 
        mArrayList[6].setmForecastTempDouble(jsonParser.getDouble("day", TempObj7)); 
        JSONArray JsonDay7WeatherArray = jsonParser.getJSONArray("weather", Day7); 
        JSONObject Day7WeatherJsonObject = jsonParser.getJSONObject(0, JsonDay7WeatherArray); 
        UniverSalIconString = jsonParser.getString("icon", Day7WeatherJsonObject); 
        mArrayList[6].setmForecastDescriptionString(jsonParser.getString("description", Day7WeatherJsonObject)); 
        mArrayList[6].setmForecastIconUrl(jsonParser.getCurrentWeatherIconUrl(UniverSalIconString)); 
        mArrayList[6].setMYNUMBER(7); 
        UniverSalIconString = null; 


        JSONObject Day8 = jsonParser.getJSONObject(7, JsonListArray); 
        JSONObject TempObj8 = jsonParser.getJSONObject("temp", Day8); 
        mArrayList[7].setmForecastTempDouble(jsonParser.getDouble("day", TempObj8)); 
        JSONArray JsonDay8WeatherArray = jsonParser.getJSONArray("weather", Day8); 
        JSONObject Day8WeatherJsonObject = jsonParser.getJSONObject(0, JsonDay8WeatherArray); 
        UniverSalIconString = jsonParser.getString("icon", Day8WeatherJsonObject); 
        mArrayList[7].setmForecastDescriptionString(jsonParser.getString("description", Day8WeatherJsonObject)); 
        mArrayList[7].setmForecastIconUrl(jsonParser.getCurrentWeatherIconUrl(UniverSalIconString)); 
        mArrayList[7].setMYNUMBER(8); 
        UniverSalIconString = null; 


        JSONObject Day9 = jsonParser.getJSONObject(8, JsonListArray); 
        JSONObject TempObj9 = jsonParser.getJSONObject("temp", Day9); 
        mArrayList[8].setmForecastTempDouble(jsonParser.getDouble("day", TempObj9)); 
        JSONArray JsonDay9WeatherArray = jsonParser.getJSONArray("weather", Day9); 
        JSONObject Day9WeatherJsonObject = jsonParser.getJSONObject(0, JsonDay9WeatherArray); 
        UniverSalIconString = jsonParser.getString("icon", Day9WeatherJsonObject); 
        mArrayList[8].setmForecastDescriptionString(jsonParser.getString("description", Day9WeatherJsonObject)); 
        mArrayList[8].setmForecastIconUrl(jsonParser.getCurrentWeatherIconUrl(UniverSalIconString)); 
        mArrayList[8].setMYNUMBER(9); 
        UniverSalIconString = null; 


        JSONObject Day10 = jsonParser.getJSONObject(9, JsonListArray); 
        JSONObject TempObj10 = jsonParser.getJSONObject("temp", Day10); 
        mArrayList[9].setmForecastTempDouble(jsonParser.getDouble("day", TempObj10)); 
        JSONArray JsonDay10WeatherArray = jsonParser.getJSONArray("weather", Day10); 
        JSONObject Day10WeatherJsonObject = jsonParser.getJSONObject(0, JsonDay10WeatherArray); 
        UniverSalIconString = jsonParser.getString("icon", Day10WeatherJsonObject); 
        mArrayList[9].setmForecastDescriptionString(jsonParser.getString("description", Day10WeatherJsonObject)); 
        mArrayList[9].setmForecastIconUrl(jsonParser.getCurrentWeatherIconUrl(UniverSalIconString)); 
        mArrayList[9].setMYNUMBER(10); 
        UniverSalIconString = null; 

       } catch (JSONException e) { 
        e.printStackTrace(); 

       } 


      } 

     }, new Response.ErrorListener() { 
      @Override 
      public void onErrorResponse(VolleyError error) { 

      } 
     }); 

     requestQueue.add(JsonObjectRequest); 
    } 
    class ListHolder extends RecyclerView.ViewHolder { 
     TextView DescriptionText; 
     TextView TempText; 
     TextView DateText; 
     NetworkImageView ForecastIconImageView; 

     ImageLoader imageLoader = new ImageLoader(requestQueue, new ImageLoader.ImageCache() { 
      LruCache<String, Bitmap> cache = new LruCache<String, Bitmap>(10); 

      @Override 
      public Bitmap getBitmap(String url) { 
       return cache.get(url); 
      } 

      @Override 
      public void putBitmap(String url, Bitmap bitmap) { 
       cache.put(url, bitmap); 
      } 
     }); 


     public ListHolder(View itemView) { 
      super(itemView); 
      DescriptionText = (TextView) itemView.findViewById(R.id.ForcastWeatherDescriptionText); 
      TempText = (TextView) itemView.findViewById(R.id.ForecastWeatherTempText); 
      ForecastIconImageView = (NetworkImageView) itemView.findViewById(R.id.ForecastWeatherIconImageview); 

      // DateText = (TextView) itemView.findViewById(R.id.DateText); 
     } 


     void OnBind(ForecastListItem item) { 


      DescriptionText.setText(item.getmForecastDescriptionString()); 
      TempText.setText(Integer.toString(item.getmForecastTempDouble())); 
//   DateText.setText(item.getmForecastDateString()); 
      ForecastIconImageView.setImageUrl(item.getmForecastIconUrl(), imageLoader); 

     } 


    } 


    class ListAdapter extends RecyclerView.Adapter<ListHolder> { 


     @Override 
     public ListHolder onCreateViewHolder(ViewGroup parent, int viewType) { 

      ListHolder listHolder = new ListHolder(getLayoutInflater().inflate(R.layout.forecast_item_view, parent, false)); 
      return listHolder; 
     } 

     @Override 
     public void onBindViewHolder(ListHolder holder, int position) { 

      Log.d("ARRAY NUM", Integer.toString(mArrayList[position].getMYNUMBER())); 
      holder.OnBind(mArrayList[position]); 

      // send the array to ViewHolder to set up the UI 


     } 

     @Override 
     public int getItemCount() { 


      return mArrayList.length; 
     } 
    } 
+0

大部分的代碼是一樣的,我只是希望有人來看看我viewholder類和適配器,看看他們是否看到任何錯誤 –

+0

它可能有一些做與你設置你的'RecyclerView'適配器的事實在進行網絡通話之前。 – Pztar

+0

歡迎來到Stack Overflow!請查看我們的[SO問題清單](http://meta.stackoverflow.com/questions/260648/stack-overflow-question-checklist)來幫助你提出一個好問題,從而得到一個很好的答案。 –

回答

0

從我所看到的,你初始化適配器一些佔位數據(mArrayList),那麼你揭開序幕網絡請求獲取數據和更新數據的原始數組列表。

更好的方法是首先顯示一個空列表,然後才能下載實際顯示在列表中的數據。

另外,當您下載數據時,您應該在ListAdapter上撥打notifyDataSetChanged以通知它原始數據已更改。

您的Web服務是異步的,調用不會馬上返回,直到它完成。

您仍然可以將mArrayList變量傳遞給ListAdapter的構造函數,並在那裏引用它。然後在適配器中添加一個方法,例如

public void updateForcastData(ArrayList<ForecastListItem> newData) { 
    //insert new data into your field here 
    notifyDataSetChanged(); //consider using one of the other methods like notifyItemInserted() etc either 
} 
+0

好吧,那麼我會填充陣列,因爲我使用的是一個字段變量,這是普遍的類文件 –

+0

你有一個自定義的ListAdapter構造函數? – FrankR

+0

不,我沒有創建一個 –