我已经尝试了一切,但没有任何效果。 我有一个像这样的listView:
[ checkbox ] | [textview] | [button]
我要做的是仅在选中[复选框]行时更改[按钮]的文本。 这是有问题的代码块:
public View getView(int position, View convertView, ViewGroup parent){
final ViewHolder vh;
final View conv;
if(convertView == null){
LayoutInflater vi=(LayoutInflater)pContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView=vi.inflate(R.layout.rest_dishes_item, null);
conv=convertView;
final Button b[];
b=new Button[itens.size()];
vh=new ViewHolder();
vh.txt=(TextView)convertView.findViewById(R.id.dish_name);
vh.checkBox=(CheckBox) convertView.findViewById(R.id.dish_item);
vh.qnt=(Button) convertView.findViewById(R.id.qnt);
vh.quantidade=new Quantidade[itens.size()];
for(int i=0;i<itens.size();i++){
b[i]=(Button)conv.findViewById(R.id.qnt);
vh.quantidade[i].quantidade=1;
vh.quantidade[i].order=i;
}
vh.qnt.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
for(int i=0;i<itens.size();i++){
Titem item=itens.get(i);
if(item.isCheck()){
vh.quantidade[i].quantidade++;
//Log.d("teste",i+""+vh.quantidade[i].quantidade);
b[i].setText(String.valueOf(vh.quantidade[i].quantidade));
}
else if(!item.isCheck()){
Log.d("teste",i+"1");
b[i].setText(String.valueOf(1));
}
}
}
});
//(Button) convertView.findViewById(R.id.qnt);
convertView.setTag(vh);
vh.checkBox.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
CheckBox box=(CheckBox) arg0;
Titem item=(Titem)box.getTag();
item.setCheck(box.isChecked());
}
});
}else{
vh=(ViewHolder)convertView.getTag();
}
Titem item=itemList.get(position);
vh.txt.setText(item.getName());
vh.checkBox.setText(item.getName());
vh.checkBox.setChecked(item.isCheck());
vh.checkBox.setTag(item);
//Log.d("teste","chegou aqui");
return convertView;
}
使用此代码,按钮的文本根本不会改变,无论哪个按钮,我点击他的文本仍为“1”。
没有这条线:
b[i].setText(String.valueOf(1));
选中行的按钮使其文本改变为我想要的。但是当我单击未选中行的按钮时,单击的按钮的文本已更改。
也许我正在做一些愚蠢的事情,或者只是在算法中遗漏了一些东西,此刻我被卡住了。
请帮忙。 感谢。
答案 0 :(得分:0)
听起来很困惑,每个可见项目执行getView()
一次。这是你的代码:
vh.qnt=(Button) convertView.findViewById(R.id.qnt);
vh.quantidade=new Quantidade[itens.size()];
for(int i=0;i<itens.size();i++){
b[i]=(Button)conv.findViewById(R.id.qnt);
vh.quantidade[i].quantidade=1;
vh.quantidade[i].order=i;
}
vh.qnt
并且b[i]
的所有实例在正在呈现的行中引用完全相同的Button(R.id.qnt
) 。
在更新剩余的vh
视图时,您还需要在if / else之后更新按钮的文本。
答案 1 :(得分:0)
我做到了!! 我使用了setTag()和getTag(),它允许我对不同的按钮使用相同的id(R.id.qnt)。这是代码:
int aux=0; //before onCreate()
。 。
vh.qnt.setTag(aux);//set a tag for each button in row
aux++; //this will be the number of rows
vh.qnt.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View arg0) {
int index=(Integer)vh.qnt.getTag();
Titem item=itens.get(index);
if(item.isCheck()){
vh.qnt.setText(String.valueOf(vh.quantidade[index]++));
}
}
});
感谢@dmon的提示,你睁开眼睛看着“同样的id”事实。