2017-01-16 8 views
-3

Meine RecyclerView überspringt Ansichten und wenn es zuerst geladen wird Es macht alle Ansichten das gleiche Objekt im Array, bis ich nach unten und wieder nach oben blättern, dann beginnen sie zu erscheinen. Ich sehe das Problem nicht, weil es funktioniert, es funktioniert einfach nicht so, wie es sollte. Ich verwende Volley, um die Netzwerkanrufe zu tätigen.RecyclerView überspringt die ersten paar Ansichten

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

Großteil des Codes ist das gleiche ich gerade jemand an meinem viewholder Klasse und Adapter aussehen wollen und sehen, ob sie etwas sehen falsch –

+0

Es könnte etwas mit der Tatsache zu tun haben, dass Sie Ihren 'RecyclerView' Adapterset bevor Sie das Netzwerk anrufen. – Pztar

+0

Willkommen bei Stack Overflow! Bitte lesen Sie unsere [SO Fragen-Checkliste] (http://meta.stackoverflow.com/questions/260648/stack-overflow-question-checklist), um Ihnen zu helfen, eine gute Frage zu stellen und somit eine gute Antwort zu erhalten. –

Antwort

0

Von dem, was ich sehen kann, initialisieren Sie Ihren Adapter mit einigen Platzhalter-Daten (mArrayList), dann treten Sie eine Netzwerkanforderung aus, die Daten zu holen und Sie die ursprüngliche Arraylist von Daten aktualisieren.

Ein besserer Weg wäre, zuerst eine leere Liste zu zeigen und erst dann, wenn Sie die Daten herunterladen, diese in der Liste anzuzeigen.

Auch wenn Sie die Daten herunterladen, sollten Sie notifyDataSetChanged auf Ihrem ListAdapter anrufen, um es zu informieren, dass sich die Originaldaten geändert haben.

Ihr Webdienst ist asynchron, der Anruf wird nicht sofort zurückgegeben, bis er beendet ist.

Sie können die Variable mArrayList immer noch in den Konstruktor Ihres ListAdapters übergeben und dort einen Verweis darauf haben. Fügen Sie dann Ihrem Adapter eine Methode hinzu, z.

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

Ok also wo würde ich das Array bevölkern, da ich eine Feldvariable benutzte, die universell für die Klassendatei –

+0

war ein benutzerdefinierter Konstruktor für Ihren ListAdapter? – FrankR

+0

Nein ich nicht schaffen ein –

Verwandte Themen