【问题标题】:ListView displays arraylist data twiceListView 显示 arraylist 数据两次
【发布时间】:2016-04-05 14:50:42
【问题描述】:

谁能帮我弄清楚为什么我的列表视图会重复它从数据库中获得的结果。我正在使用带有复选框的列表视图。下面是我的代码。

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

提前致谢。

【问题讨论】:

  • 我会帮助你发布你得到的输出。

标签: java android android-listview listadapter


【解决方案1】:

MyAdminAdapter 的构造函数中删除这一行:

this.objectsList.addAll(objectsList);

您已经在前面的说明中添加了您的项目:

this.objectsList = objectsList;

【讨论】:

    【解决方案2】:

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

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

    你只需要删除第二行。

    【讨论】:

    • 谢谢。不知道我是怎么错过的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-07
    • 2013-03-10
    • 1970-01-01
    • 1970-01-01
    • 2020-12-30
    • 2018-07-12
    • 2017-08-15
    相关资源
    最近更新 更多