gpt4 book ai didi

android - 在 ListView 中获取 Switch 状态

转载 作者:行者123 更新时间:2023-11-29 01:46:41 34 4
gpt4 key购买 nike

在我的应用程序中,我希望用户做出多项选择,为此我在 ListView 中提供了一些开关和一个确认按钮。

问题是,当我在 Button onClickListener() 函数中插入 db 中的值时,我可以从开关中检索文本,但不能检索它们的状态(在示例中,始终输出 true)

btn.setOnClickListener( new View.OnClickListener() {

@Override
public void onClick(View v) {
ListAdapter adapter = list.getAdapter();
MyDatabase db = new MyDatabase(cntx);
db.open();
for(int n=0;n<adapter.getCount();n++)
{
View rowview = adapter.getView(n, null, null);
Switch swtc = (Switch) rowview.findViewById(R.id.switch1);
String[] args = {(String)swtc.getText()};
if(swtc.isChecked())
{
Log.i("update", args[0]+" going to be true");
}
else
{
Log.i("update", args[0]+" going to be false");

}
int a = db.updateAlert(swtc.isChecked(), MyDatabase.Tab_Cal_Set.Cal+"=?", args);
Toast.makeText(cntx, "affected: "+Integer.toString(a), Toast.LENGTH_LONG).show();
}
db.close();

}
});

PS:adapter 是我为 ListView 创建的 arrayadapter,cntx 是应用程序的上下文,而 MyDatabase 是我的自定义类,用于管理 Sqlite 数据库。希望你能帮助我

数组适配器代码:

 public class NotificationElementList extends ArrayAdapter<String>{

private final Activity context;

private final List<String> titles;
private final List<String> imgs;
private final List<Boolean> alert;


public NotificationElementList(Activity context, List<String> titles, List<String> imgs, List<Boolean> alert) {

super(context, R.layout.list_single, titles);
this.context = context;
this.titles = titles;
this.imgs = imgs;
this.alert = alert;

}

@Override
public View getView(int position, View view, ViewGroup parent) {

LayoutInflater inflater = context.getLayoutInflater();

View rowView= inflater.inflate(R.layout.notification_list_element, null, true);

Switch switch_text = (Switch) rowView.findViewById(R.id.switch1);
switch_text.setChecked(alert.get(position));
switch_text.setText(titles.get(position));

return rowView;
}

最佳答案

由于您没有为 ArrayAdapter.getView 方法提供 convertView 参数,它总是会为您创建一个新的 View 层次结构。因此,您将始终看到开关小部件的状态已初始化为 alert.get(position)

潜在的解决方案之一是设置一个 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);

此外,我建议您更新适配器以利用 view holder pattern以获得更好的性能。

关于android - 在 ListView 中获取 Switch 状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21003839/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com