我的ListView
包含带有复选框的项目,这些复选框的行为有时像CHOICE_MODE_MULTIPLE
,有时像CHOICE_MODE_SINGLE
。我的意思是对于列表中的某些项目,当选择某些其他项目时,需要取消选择,而其他项目可以保持选中状态。
因此,当项目 A 被选中时,我可以在我的数据中找到需要取消选中的 B 项,但如何让UI刷新以显示为我(我相信)找不到代表 B 的实际View
,只是它的数据?
答案 0 :(得分:0)
你可以使用singleChoice alartDialog,我用过像:
private int i = 0; // this is global
private final CharSequence[] items = {"Breakfast", "Lunch", "Dinner"}; // this is global
Button settings = (Button)view.findViewById(R.id.settings);
settings.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(final View v) {
AlertDialog.Builder builder = new AlertDialog.Builder(v.getContext());
//Title of Popup
builder.setTitle("Settings");
builder.setSingleChoiceItems(items, i,
new DialogInterface.OnClickListener() {
// When you click the radio button
public void onClick(DialogInterface dialog, int item){
i=item;
}
});
builder.setPositiveButton("Confirm",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int item) {
if (i == 0) {
//it means 1st item is checked, so do your code
}
if (i == 1) {
//it means 2nd item is checked, so do your code
} /// for more item do if statement
}
});
//When you click Cancel, Leaves PopUp.
builder.setNegativeButton("Cancel", null);
builder.create().show();
}
});
我已初始化i=0
,因此当用户第一次点击settings
按钮时,会选择第一个项目。然后,当用户选择其他项目时,我保存了i
值,以便下次用户点击settings
按钮时,我可以向用户显示他/她之前选择的项目。
答案 1 :(得分:0)
这听起来像是一个良好的开端。你是对的,你应该在单击A时操纵项目B的基础数据源。
可能对您有所帮助的两个提示:
getView()
方法应该查看您的数据源,并根据找到的内容更改convertView
。您无法找到代表B的实际视图,因为在ListView
中,Views
会被回收并重新使用,因为需要显示不同的数据。基本上,当项目从列表中滚动时,使用的View
将作为getView()
传递给convertView
函数,准备处理下一个元素的数据。因此,您可能永远不应该根据用户输入直接更改View
中的ListView
,而是基础数据。notifyDataSetChanged()
来表示某个基础数据已被更改,并且应该再次为列表中当前显示的元素调用getView()
。如果您仍然遇到问题,请随意发布一些代码,说明您遇到的具体问题。在更好地定义问题时,提供具体建议要容易得多。希望这有帮助!
答案 2 :(得分:0)
我今天碰到并解决了这个问题。
public class ItemChooceActivity extends Activity implements OnItemClickListener {
private int chosenOne = -1;
class Madapter extends BaseAdapter {
.....
.....
@Override
public View getView(final int position, View convertView,
ViewGroup parent) {
// TODO Auto-generated method stub
if (chosenOne != position) {
set the view in A style
} else {
set the view in B style
}
return convertView;
}
}
@Override
public void onItemClick(AdapterView<?> arg0, View view, int position,
long arg3) {
,,,,
chosenOne = position;
adapter.notifyDataSetChanged();
,,,
}
}