2015-12-31 55 views
0

任何人都可以幫助我弄清楚爲什麼我的listview重複從數據庫中獲得的結果。我正在使用帶有複選框的Listview。以下是我的代碼如下。ListView顯示ArrayList數據兩次

public class AccessLevels extends Fragment { 

MyAdminAdapter adminAdapter = null; 
Guards guards; 

ListView listView; 

public ArrayList<Guards> guardsName; 

public String str_name; 
public boolean isAdmin; 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    View view = inflater.inflate(R.layout.fragment_access_levels, container, false); 

    listView = (ListView)view.findViewById(R.id.list_of_guards); 

    return view; 
} 

private class MyAdminAdapter extends ArrayAdapter<Guards>{ 

    private ArrayList<Guards> objectsList; 

    public MyAdminAdapter(Context context, int resource, ArrayList<Guards> objectsList) { 
     super(context, resource, objectsList); 
     this.objectsList = objectsList; 
     this.objectsList.addAll(objectsList); 
    } 

    private class ViewHolder{ 
     CheckBox chk_name; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 

     ViewHolder holder = null; 

     if (convertView == null){ 
      LayoutInflater vi = (LayoutInflater)getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      convertView = vi.inflate(R.layout.single_row_access, null); 

      holder = new ViewHolder(); 
      holder.chk_name = (CheckBox) convertView.findViewById(R.id.chk_guard); 
      convertView.setTag(holder); 
     } 
     else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 

     final Guards guards = objectsList.get(position); 
     holder.chk_name.setText(guards.getName()); 
     holder.chk_name.setChecked(guards.isChecked()); 
     holder.chk_name.setTag(guards); 

     holder.chk_name.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       CheckBox cb = (CheckBox) v; 
       Guards guards = (Guards) cb.getTag(); 
       guards.setChecked(cb.isChecked()); 
      } 
     }); 

     return convertView; 
    } 
} 

@Override 
public void onDestroy() { 
    super.onDestroy(); 
} 

@Override 
public void onDetach() { 
    super.onDetach(); 
} 
} 

我得到的數據是這樣的商店。

private void DisplayAllNames() { 

    guardsName = new ArrayList<Guards>(); 

    ParseQuery<ParseObject> guardsQuery = ParseQuery.getQuery("Guards"); 
    guardsQuery.whereExists("Name"); 
    guardsQuery.orderByAscending("Name"); 
    guardsQuery.findInBackground(new FindCallback<ParseObject>() { 
     @Override 
     public void done(List<ParseObject> list, ParseException e) { 
      if (e == null) { 
       if (list.size() > 0) { 
        for (int i = 0; i < list.size(); i++) { 
         ParseObject data = list.get(i); 
         str_name = data.getString("Name"); 
         isAdmin = data.getBoolean("admin"); 

         guards = new Guards(str_name, isAdmin); 
         guardsName.add(guards); 
        } 

        adminAdapter = new MyAdminAdapter(getActivity(), R.layout.single_row_access, guardsName); 
        listView.setAdapter(adminAdapter); 
       } else { 
       } 
      } else { 
      } 
     } 
    }); 
} 

在此先感謝。

+0

我會有助於發佈你得到的輸出。 – Vedda

回答

1

從刪除此行您MyAdminAdapter的構造:

this.objectsList.addAll(objectsList); 

您已經將您的項目在以前的指令:

this.objectsList = objectsList; 
1

在你MyAdminAdapter你兩次添加數據:

this.objectsList = objectsList; 
    this.objectsList.addAll(objectsList); 

你只需要刪除secon d線。

+0

謝謝。不知道我是怎麼錯過的。 –