与ListView战斗

时间:2015-07-09 12:23:19

标签: android checkbox android-listview

我的应用中的一个片段中有一个ListView,还有一个按钮。

该按钮显示一个对话框,显示一些CheckBoxes,供用户选择他/她希望添加到ListView的那些。

没问题,当用户点击checkBox时,该项目会添加到列表中,但是如果我点击checkBoxes上的所有ListViewpublic class ListaTributosAdapter extends BaseAdapter { private ArrayList<ListaTributosBean> data; private LayoutInflater inflater=null; public ListaTributosAdapter(Context c, ArrayList<ListaTributosBean> data){ this.data=data; inflater=LayoutInflater.from(c); } @Override public int getCount() { return data.size(); } @Override public Object getItem(int position) { return data.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { convertView=inflater.inflate(R.layout.celda_listview_tributos, null); TextView texto=(TextView)convertView.findViewById(R.id.textView4); texto.setText(data.get(position).getTexto()); } return convertView; } } 中的最后一项得到第一个的文本。

这是我的适配器:

ListaTributosBean

TextView是一个仅包含ImageViewStrings的课程,目前尚未使用。

这是我设置适配器的方式,我有一个ArrayList数组和一个private String[] opciones={"A", "B", "C", "D", "E"}; private ArrayList<ListaTributosBean> datos; 来存储用户使用

选择的项目

复选框:

adapter=new ListaTributosAdapter(c, datos);
listView.setAdapter(adapter);

我将适配器设置为ListView:

datos.add(new ListaTributosBean("Mandatory1"));
datos.add(new ListaTributosBean("Mandatory2"));

我在ArrayList中添加了两个强制项:

button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
            builder.setTitle(getString(R.string.selectcheckboxes));
            builder.setMultiChoiceItems(opciones, null, new DialogInterface.OnMultiChoiceClickListener() {


                @Override
                public void onClick(DialogInterface dialog, int which, boolean isChecked) {

                    for (int i = 0; i < datos.size(); i++) {

                        if (datos.get(i).getTexto().equals(opciones[which])) {
                            Toast.makeText(c, getString(R.string.contains1) + " " + opciones[which] + " " + getString(R.string.contains2), Toast.LENGTH_LONG).show();
                            repe = true;
                        } 


                    }
                    if (repe == true) {

                        repe = false;

                    } else {
                        if (isChecked) {
                            datos.add(new ListaTributosBean(opciones[which]));

                        }
                    }

                }
            });

            builder.setPositiveButton(getString(R.string.ok), new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {

                    adapter.notifyDataSetChanged();
                    try {
                        dialog.dismiss();
                    } catch (Exception e) {

                    }
                }
            }).create().show();
        }
    });

当用户点击一个按钮时,会显示带复选框对话

checkBox

如果我点击一个ListView,没问题。我点击两个 checkBoxes ,没问题。

但是,如果我检查所有五个复选框String selected = ((ListaTributosBean) parent.getItemAtPosition(position)).getTexto(); 中的最后一项将获得第一项,尽管我点击它,然后

ListView

它返回正确的值。

{{1}}中的其他项目看起来很好,点击时响应正常。

为什么会这样?

有人可以帮助我吗?

谢谢。

1 个答案:

答案 0 :(得分:0)

此错误是因为您未遵循ViewHolder中的Adapter设计模式。现在执行以下操作 将以下类添加为Adapter

的内部类
static class ViewHolder {
        public TextView texto;
}

并使用以下

替换适配器的getView()方法
 @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        if (convertView == null) {
            convertView = inflater.inflate(R.layout.celda_listview_tributos, null);
            holder = new ViewHolder();
            holder.texto = (TextView) convertView.findViewById(R.id.textView4);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }
        holder.texto.setText(data.get(position).getTexto());
        return convertView;
    }