2016-11-14 16 views
0

私はAndroid開発の初心者ですので、私にご負担ください。ArrayListが.clear()を使用した後で更新されない

私は更新するためにスワイプして更新したいカスタムArrayAdapterを持っています。

は、私がこれを行うためには、私は必要なことを理解すること:

  • クリア(.clear()と)私のデータを保持しているのArrayList
  • 更新getAbsentTeachersを使用して、新しいデータでのArrayList(私はArrayListのをクリアした後()メソッド)
  • notifyDataSetChanged使用()ArrayAdapter

に、(getAbsentTeachersを呼び出す)とnotifyDataSetChanged()ArrayListのは、空の電子ままに表示されますgetAbsentTeachers()は呼び出されますが、呼び出されます。私はListViewに何も表示されないので、これを知っています。

getAbsentTeachers()は、私のアプリが最初に起動されたときにArrayListを細かく設定しますが、ArrayListを更新するためにもう一度呼び出すと動作しないようです。

なぜ配列が更新されていないのかについてのアイデアはありますか?

MainActivity.java: パッケージ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; 

     } 

    } 
} 

答えて

1

Parseコールのdone内のif-elseの後にこれらの2行を移動します。

あなたは現在、アダプタに通知する前にParseコールが終了するのを待っていません。


別の解決策

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

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

を変更することで、アカウントにそれを取るために忘れた - 感謝を! –

関連する問題