2016-11-14 3 views
0

Ich bin neu in Android-Entwicklung, also bitte bitte mit mir.ArrayList nicht nach der Verwendung von .clear() aktualisiert

Ich habe einen benutzerdefinierten ArrayAdapter, den ich aktualisieren möchte, indem Sie zum Aktualisieren nach unten wischen.

Ich verstehe, dass dies zu tun, um Ich muss:

  • klar die Arraylist, die meine Daten (mit .clear()) hält
  • Aktualisieren Sie die Arraylist mit den neuen Daten (unter Verwendung der getAbsentTeachers() -Methode)
  • Verwendung notifyDataSetChanged() auf dem ArrayAdapter

Nachdem ich die Arraylist zu löschen, ruft getAbsentTeachers() und notifyDataSetChanged() die Arraylist erscheinen leer e zu bleiben obwohl getAbsentTeachers() aufgerufen wird. Ich weiß das, weil in meinem ListView nichts angezeigt wird.

getAbsentTeachers() füllt die ArrayList-Strafe, wenn meine App zum ersten Mal gestartet wird, aber es scheint nicht zu funktionieren, wenn ich sie erneut aufrufen, um die ArrayList zu aktualisieren.

Irgendwelche Ideen, warum das Array nicht aktualisiert wird?

MainActivity.java: Paket uk.co.bobsmith.drawview.drawviewtest;

public class MainActivity extends AppCompatActivity 
     implements NavigationView.OnNavigationItemSelectedListener { 

    private ArrayList<Absent> absences = new ArrayList<>(); 
    private SwipeRefreshLayout swipeContainer; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 

     //---------------------INITIALISING PARSE------------------------------- 
     Parse.enableLocalDatastore(this); 

     // Add your initialization code here 
     Parse.initialize(new Parse.Configuration.Builder(getApplicationContext()) 
       //Information obscured for privacy - tested and working though. 
       .applicationId("") 
       .clientKey(null) 
       .server("") 
       .build() 
     ); 

     ParseUser.enableAutomaticUser(); 
     ParseACL defaultACL = new ParseACL(); 
     // Optionally enable public read access. 
     // defaultACL.setPublicReadAccess(true); 
     ParseACL.setDefaultACL(defaultACL, true); 

     ParseInstallation.getCurrentInstallation().saveInBackground(); 
     ParsePush.subscribeInBackground("Absent"); 

     //-----------------------CREATE ADAPTER OBJECT-------------------------------- 

     getAbsentTeachers(); 

     final ListView lv = (ListView)findViewById(R.id.listView); 
     final ArrayAdapter<Absent> adapter = new absenceArrayAdapter(this, 0, absences); 
     lv.setAdapter(adapter); 

     swipeContainer = (SwipeRefreshLayout) findViewById(R.id.swipeContainer); 
     // Setup refresh listener which triggers new data loading 
     swipeContainer.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { 
      @Override 
      public void onRefresh() { 
       // Code to refresh the list. 
       absences.clear(); 
       getAbsentTeachers(); 
       adapter.notifyDataSetChanged(); 
       swipeContainer.setRefreshing(false); 
       // Call swipeContainer.setRefreshing(false) when finished. 
      } 
     }); 

    } 

    // Populates absences ArrayList with absence data 
    public void getAbsentTeachers() { 

     ParseQuery<ParseObject> query = ParseQuery.getQuery("Absences"); 

     query.findInBackground(new FindCallback<ParseObject>() { 
      @Override 
      public void done(List<ParseObject> objects, ParseException e) { 
       if(e == null){ 

        for(ParseObject object : objects){ 

         String name = String.valueOf(object.get("name")); 
         Log.i("Name", name); 
         String desc = String.valueOf(object.get("description")); 
         Log.i("Description", desc); 

         absences.add(new Absent(name, desc, "employees")); 

        } 

       } else { 

        Log.i("Get data from parse", "There was an error getting data!"); 
        e.printStackTrace(); 

       } 
      } 
     }); 

    } 



    //custom ArrayAdapter 
    class absenceArrayAdapter extends ArrayAdapter<Absent> { 

     private Context context; 
     private List<Absent> absencesList; 

     public absenceArrayAdapter(Context context, int resource, ArrayList<Absent>     objects) { 
      super(context, resource, objects); 

      this.context = context; 
      this.absencesList = objects; 
     } 

     public View getView(int position, View convertView, ViewGroup parent) { 
      //get the property we are displaying 
      Absent teacher = absencesList.get(position); 

      //get the inflater and inflate the XML layout for each item 
      LayoutInflater inflater = (LayoutInflater)  context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE); 
      View view = inflater.inflate(R.layout.custom_listview, null); 

      TextView name = (TextView) view.findViewById(R.id.name); 
      TextView description = (TextView) view.findViewById(R.id.description); 
      ImageView teacherImage = (ImageView) view.findViewById(R.id.imageView); 

      String teacherName = teacher.getTeacherName(); 
      name.setText(teacherName); 

      int descriptionLength = teacher.getDescription().length(); 
      if(descriptionLength >= 75){ 
       String descriptionTrim = teacher.getDescription().substring(0, 75) + "..."; 
       description.setText(descriptionTrim); 
      }else{ 
       description.setText(teacher.getDescription()); 
      } 

      return view; 

     } 

    } 
} 

Antwort

1

bewegen sich diese beiden Linien nach dem if-else in der done des Anrufs Parse.

Sie warten derzeit nicht darauf, dass der Parse-Aufruf beendet wird, bevor der Adapter benachrichtigt wird.


Eine andere Lösung ist

absences.add(new Absent(name, desc, "employees")); 

zu

adapter.add(new Absent(name, desc, "employees")); 
+0

, dass berücksichtigen Passwort zu ändern - danke! –

Verwandte Themen