ListView显示两次arraylist数据

时间:2015-12-31 17:31:27

标签: java android android-listview listadapter

任何人都可以帮我弄清楚为什么我的listview会重复从数据库中获取的结果。我正在使用带Checkbox的Listview。以下是我的代码。

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 {
            }
        }
    });
}

提前致谢。

2 个答案:

答案 0 :(得分:1)

MyAdminAdapter的构造函数中删除此行:

this.objectsList.addAll(objectsList);

您已在上一条指令中添加项目:

this.objectsList = objectsList;

答案 1 :(得分:1)

在您的MyAdminAdapter中,您要添加两次数据:

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

你只需删除第二行。