2016-11-14 79 views
0

我是Android开发新手,请耐心等待。ArrayList在使用后不会更新.clear()

我有一个自定义ArrayAdapter,我想通过向下刷新进行更新。

我明白,为了做到这一点,我需要:

  • 明确表示对我的数据(与.clear())ArrayList的
  • 更新与新数据的ArrayList(使用getAbsentTeachers ()上一个ArrayAdapter

后我清除ArrayList中,调用getAbsentTeachers方法)

  • 使用notifyDataSetChanged()()和notifyDataSetChanged()该ArrayList似乎保持为空è尽管getAbsentTeachers()是beeing调用。我知道这是因为我的ListView中没有显示任何内容。

    getAbsentTeachers()在我的应用程序首次启动时填充ArrayList,但当我再次调用它来更新ArrayList时,它似乎不工作。

    有关数组为何不更新的任何想法?

    MainActivity.java: package 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之后。

    adapter.notifyDataSetChanged(); 
    swipeContainer.setRefreshing(false); 
    

    您目前没有在通知适配器之前等待Parse调用完成。


    另一种解决方案是改变

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

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

    忘了考虑到这一点 - 谢谢! –