android listview 切换,Android:在ListView适配器中切换OnCheckedChangeListener

在Android应用中,作者遇到了ListView中Switch组件的问题。当用户滑动Switch时,onClickListener无法触发,而onCheckedChangeListener虽然解决了这个问题,但在ListView滚动后,已选择的Switch状态会丢失。通过在设置新状态前将onCheckedChangeListener设为null,然后重新设置监听器,作者解决了这个问题。然而,这导致了数据源与视图状态不同步。经过进一步测试和修正,作者发现应该在数据源中正确更新状态,并使用isChecked参数,避免使用findViewById。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我在我的应用程序中有一个listView。对于listView中的每个元素,它都有一个Switch。以前我在listView Adapter的getView方法中为Switch实现了一个onClickListener。但是,我发现虽然它在用户单击交换机时工作,但当用户在交换机上滑动时,它不起作用。然后我尝试将onClickListener更改为onCheckedChangeListener。当用户在Switch上单击或滑动时,它可以工作,但是,当我滚动ListView以使元素消失时,我发现最初选中的Switch未被选中。Android:在ListView适配器中切换OnCheckedChangeListener

你能帮忙吗?下面是我的getView方法在ListView适配器代码:

@Override

public View getView(final int position, View convertView, final ViewGroup parent) {

class viewHolder {

public TextView tvSceneName;

public Switch swSelectSwitch;

}

final viewHolder holder;

final View v = convertView;

// Use ViewHolder to avoid findViewById each time the user scroll

if (convertView == null) {

holder = new viewHolder();

convertView = mInflater.inflate(R.layout.scene_list_element, parent, false);

holder.tvSceneName = (TextView) convertView.findViewById(R.id.tvSceneName);

holder.swSelectSwitch = (Switch) convertView.findViewById(R.id.swScene);

convertView.setTag(holder);

} else {

holder = (viewHolder) convertView.getTag();

}

if(holder.swSelectSwitch != null) {

// Set the switch to correct on/off status

holder.swSelectSwitch.setChecked(mDataSource.get(position).get_isOn());

// Set up On checked change listener for the switch

holder.swSelectSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

@Override

public void onCheckedChanged(CompoundButton toggleButton, boolean isChecked) {

// Set the new status to arraylist

Switch sw = (Switch) v.findViewById(R.id.swScene);

MainActivity.sceneArrayList.get(position).set_isOn(sw.isChecked());

});

}

}

编辑: 在进一步的测试中,我发现有错误在我的新增onCheckChangedListener(因为我从复制的一些代码onClickListener)。另外我找到了一个解决方案,它是在我通过代码设置Switch之前将onCheckChangedListener设置为null。

if(holder.swSelectSwitch != null) {

// Set the switch to correct on/off status

holder.swSelectSwitch.setOnCheckedChangeListener(null);

holder.swSelectSwitch.setChecked(mDataSource.get(position).get_isOn());

// Set up On checked change listener for the switch

holder.swSelectSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

@Override

public void onCheckedChanged(CompoundButton toggleButton, boolean isChecked) {

// Set the new status to arraylist

mDataSource.get(position).set_isOn(isChecked);

});

}

2016-11-08

eepty

+1

您正在使用两个列表:

你应该mDataSource在发生变化时更新状态。他们有相同的参考?如果没有,你正在更新一个不同的列表,所以在你滚动之后清楚为什么你的复选框没有更新。其他的事情是你为什么不使用onCheckedChanged监听器的参数,而不是使用findviewbyId –

+0

@Alex你是对的,我发现我应该使用isChecked参数。我使用findviewbyId,因为我只是从onClickedListner复制代码。 onClickedListener没有这个参数。列表是一样的。事实上,我不清楚如何使用listView,当它有很多组件和数据源是复杂的。 –

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值