我的应用中的一个片段中有一个ListView
,还有一个按钮。
该按钮显示一个对话框,显示一些CheckBoxes
,供用户选择他/她希望添加到ListView
的那些。
没问题,当用户点击checkBox
时,该项目会添加到列表中,但是如果我点击checkBoxes
上的所有ListView
,public 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
是一个仅包含ImageView
和Strings
的课程,目前尚未使用。
这是我设置适配器的方式,我有一个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}}中的其他项目看起来很好,点击时响应正常。
为什么会这样?
有人可以帮助我吗?
谢谢。
答案 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;
}