【发布时间】:2011-01-17 11:04:21
【问题描述】:
我有一个列表视图,其中每个数据都是从列表适配器获取的。 列表视图中的每个项目都包含一个文本视图和切换按钮。 但是当我滚动列表时出现问题。切换按钮的选中状态发生了变化,即如果我在索引 4 处选择了一个切换按钮,那么在滚动后我发现除了第四个之外的任何随机按钮都被选中。
【问题讨论】:
我有一个列表视图,其中每个数据都是从列表适配器获取的。 列表视图中的每个项目都包含一个文本视图和切换按钮。 但是当我滚动列表时出现问题。切换按钮的选中状态发生了变化,即如果我在索引 4 处选择了一个切换按钮,那么在滚动后我发现除了第四个之外的任何随机按钮都被选中。
【问题讨论】:
如果你仍然没有得到任何解决方案,请试试这个 getview 方法.. // switchState[] 是一个布尔数组。
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = new ViewHolder();
// mSwitchButton = (ToggleButton) findViewById(R.id.switchButton);
if(convertView == null) {
convertView = mInflator.inflate(R.layout.settings_item_cell, parent, false);
holder.categoryName =
(TextView) convertView.findViewById(R.id.categoryType);
convertView.setTag(holder);
holder.switchButton = (ToggleButton) convertView.findViewById(R.id.switchButton);
}
else {
holder = (ViewHolder) convertView.getTag();
}
holder.switchButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
int index = (Integer) v.getTag();
Log.v("tag of switch============",""+index);
if(((ToggleButton) v).isChecked()) {
switchState[index] = true;
((ToggleButton) v).setButtonDrawable(R.drawable.item_selected);
}
else {
((ToggleButton) v).setButtonDrawable(R.drawable.item_deselected);
switchState[index] =false;
}
isToggleButtonClicked = true;
}
});
if(switchState[position])
holder.switchButton.setButtonDrawable(R.drawable.item_selected);
else
holder.switchButton.setButtonDrawable(R.drawable.item_deselected);
holder.categoryName.setText(categories[position]);
holder.switchButton.setTag(new Integer(position));
return convertView;
}
【讨论】:
由于行被回收,您需要维护自己的状态,在修改时保存和恢复您的ToggleButton 状态。 Here is a sample project 演示在行中使用 RatingBar; ToggleButton 也应遵循相同的基本流程。
【讨论】:
我知道这是一个非常古老的线程,但我找到的问题答案并不是很好。我花了一些时间从两个答案中得到一个可行的解决方案。我只是想分享工作代码,如果有其他菜鸟试图弄清楚在滚动时如何保持切换按钮的状态。
private class MyListAdapter extends ArrayAdapter<Product> {
boolean [] switchState= new boolean[100] ;
public MyListAdapter() {
super(ProductSelectActivity.this, R.layout.item_view, myProducts);
}
public View getView( int position, View convertView, ViewGroup parent) {
// Make sure we have a view to work with (may have been given null)
ViewHolder holder;
View itemView = convertView;
if (itemView == null) {
itemView = getLayoutInflater().inflate(R.layout.item_view, parent, false);
View row= itemView;
holder= new ViewHolder(row);
itemView.setTag(holder);
holder.switchButton = (ToggleButton) itemView.findViewById(R.id.favorite_button);
}
else
{
holder = (ViewHolder) itemView.getTag();
}
holder.switchButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
int index = (Integer) v.getTag();
if(((ToggleButton) v).isChecked()) {
switchState[index] = true;
((ToggleButton) v).setBackgroundResource(android.R.drawable.btn_star_big_on);
}
else {
((ToggleButton) v).setBackgroundResource(android.R.drawable.btn_star_big_off);
switchState[index] =false;
}
}
});
if(switchState[position])
holder.switchButton.setBackgroundResource(android.R.drawable.btn_star_big_on);
else
holder.switchButton.setBackgroundResource(android.R.drawable.btn_star_big_off);
//holder.categoryName.setText(categories[position]);
holder.switchButton.setTag(Integer.valueOf(position));
ViewHolder.class
public class ViewHolder {
ToggleButton switchButton=null;
ViewHolder(View base) {
this.switchButton=(ToggleButton)base.findViewById(R.id.favorite_button);
}
}
此代码编译。
【讨论】: