Android 获取ListView中的开关状态
在我的应用程序中,我希望用户做出多项选择,为此,我在ListView中提供了一些开关和一个按钮来确认 问题是,当我在Button onClickListener()函数中插入db中的值时,我可以从开关中检索文本,但不能检索它们的状态(在示例中,总是输出true)Android 获取ListView中的开关状态,android,listview,switch-statement,Android,Listview,Switch Statement,在我的应用程序中,我希望用户做出多项选择,为此,我在ListView中提供了一些开关和一个按钮来确认 问题是,当我在Button onClickListener()函数中插入db中的值时,我可以从开关中检索文本,但不能检索它们的状态(在示例中,总是输出true) btn.setOnClickListener(新视图.OnClickListener(){ @凌驾 公共void onClick(视图v){ ListAdapter=list.getAdapter(); MyDatabase db=新的
btn.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
ListAdapter=list.getAdapter();
MyDatabase db=新的MyDatabase(cntx);
db.open();
对于(int n=0;n由于您没有向ArrayAdapter.getView方法提供convertView参数,它将始终为您创建一个新的视图层次结构。因此,您将始终看到开关小部件的状态初始化为alert.get(位置)
其中一个可能的解决方案是设置OnCheckedChangeListener来切换小部件,并在切换状态发生变化时更新模型
@Override
public View getView(final int position, View view, ViewGroup parent) {
LayoutInflater inflater = context.getLayoutInflater();
View rowView = inflater.inflate(R.layout.notification_list_element, null, true);
Switch s = (Switch) rowView.findViewById(R.id.switch1);
s.setChecked(alert.get(position));
s.setText(titles.get(position));
s.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
alert.set(position, isChecked);
}
});
return rowView;
}
这样做将允许您直接从模型获取状态,而不是试图从按钮单击事件处理程序中的开关小部件获取状态
View rowview = adapter.getView(n, null, null);
Switch swtc = (Switch) rowview.findViewById(R.id.switch1);
db.updateAlert(swtc.isChecked(), MyDatabase.Tab_Cal_Set.Cal+"=?", args);
你会的
db.updateAlert(alert.get(n), MyDatabase.Tab_Cal_Set.Cal+"=?", args);
此外,我建议您更新适配器以利用以获得更好的性能。您不应该调用适配器getView方法。它由ListView内部使用。
其目的是查看如何填充其内容
如果警报列表
用于保存开关
选中状态,则可以使用它
btn.setOnClickListener( new View.OnClickListener() {
@Override
public void onClick(View v) {
MyDatabase db = new MyDatabase(cntx);
db.open();
for(int n=0;n<alert.size();n++)
{
String[] args = {titles.get(n)};
if(alert.get(n))
{
Log.i("update", args[0]+" going to be true");
}
else
{
Log.i("update", args[0]+" going to be false");
}
int a = db.updateAlert(alert.get(n), MyDatabase.Tab_Cal_Set.Cal+"=?", args);
Toast.makeText(cntx, "affected: "+Integer.toString(a), Toast.LENGTH_LONG).show();
}
db.close();
}
});
btn.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
MyDatabase db=新的MyDatabase(cntx);
db.open();
对于(int n=0;nListView使用哪种适配器?是否扩展BaseAdapter?能否提供适配器代码?
db.updateAlert(alert.get(n), MyDatabase.Tab_Cal_Set.Cal+"=?", args);
btn.setOnClickListener( new View.OnClickListener() {
@Override
public void onClick(View v) {
MyDatabase db = new MyDatabase(cntx);
db.open();
for(int n=0;n<alert.size();n++)
{
String[] args = {titles.get(n)};
if(alert.get(n))
{
Log.i("update", args[0]+" going to be true");
}
else
{
Log.i("update", args[0]+" going to be false");
}
int a = db.updateAlert(alert.get(n), MyDatabase.Tab_Cal_Set.Cal+"=?", args);
Toast.makeText(cntx, "affected: "+Integer.toString(a), Toast.LENGTH_LONG).show();
}
db.close();
}
});