我在ListView中有很多项目。每个项目都包含几个可编辑的视图。我想保存用户对这些更改。保存发生的事件是当项目失去焦点时。
我目前看到两种方式:
View.OnFocusChangeListener() with onFocusChange(View v, boolean hasFocus)
这很有效但很麻烦,因为每个项目都包含几个可编辑的视图。当整个项目散焦时,我宁愿保存。到目前为止,我的简化尝试只会让事情变得复杂。
如果有一个OnItemDeSelectedListener它会很完美,但只有相反:
AdapterView.OnItemSelectedListener() with onItemSelected(AdapterView<?> adapterView, View view, int i, long l)
从表面上看,这看起来不错。我只是创建变量lastSelectedView,所以我知道最后选择(取消选择)的项目是什么。 问题是ListView如何回收视图。我相信不能保证适配器没有回收lastSelectedView,因此改变了它包含的数据。这是一个合理的假设吗?
有没有合理的方法来解决OnItemSelectedListener的回收视图问题?
答案 0 :(得分:0)
如果您正在使用单一选择,那么选择其他项目将会取消选择&#34;当前项目。此时,您可以将更改应用于适配器中项目的本地存储副本。我不相信你应该使用onItemSelected()或onItemDeselected()中传递的视图作为编辑数据的模型。就像我说的那样,最好创建一个当前正在编辑的适配器数据类型的项目,并且在onSelectedListener()中,您可以将已编辑项目的更改应用到适配器中的相应项目。像这样:
ListView myListView;
Object objectCurrentlyEditing;
int positionCurrentlyEditing;
myListView.setOnItemSelectedListener(new OnItemSelectedListener(){
@Override
public void onItemSelected(AdapterView<?> arg0, View arg1,
int position, long arg3)
{
myListView.getAdapter().getItem(positionCurrentlyEditing).update(objectCurrentlyEditing);
positionCurrentlyEditing = position;
objectCurrentlyEditing = myListView.getAdapter().getItem(position);
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
// TODO Auto-generated method stub
}
});
更新功能将是列表项不再被选中后的保存方式。此方法假设您使用单选模式。
答案 1 :(得分:0)
我的答案与此处的其他答案类似,尝试以稍微不同的方式解决回收问题 - 这将是一个循环,所以阅读两次: 在onItemSelected中,首先使用您之前调用onItemSelected时保存的数据。 将数据从当前视图(发送到onItemSelected作为参数)保存到最终变量或字段,以便在下次调用onItemSelected时使用。
例如,这是一个模型对象: 公共类YourModelObject { public YourModelObject(String dataString,int dataInt){ this.dataString = dataString; this.dataInt = dataInt; } private String dataString; private int dataInt; //这里有一些吸气剂,制定者和方法...... }
以下是显示它的列表视图:
ListView myListView;
ArrayList<YourModelObject> listOfModelObjects;
//somewhere before onItemSelected listOfModelObjects is initialized with data
final YourModelObject lastItemData; //this can either be final, or an instance variable.
myListView.setOnItemSelectedListener(new OnItemSelectedListener(){
@Override
public void onItemSelected(AdapterView<?> parent, View view, int i, long l)
{
//use last saved data:
if (lastItemData != null){
//do some stuff with lastItemData
}
//save current data for next call:
TextView tv = (TextView) view.findViewById(someId);
NumberPicker np = (NumberPicker) view.findViewById(anotherId);
String dataString = tv.getText().toString();
int dataInt = np.getValue();
lastItemData = new YourModelObject(dataString , dataInt);
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
通过这种方式,您只能在项目失去焦点(以及选择新项目)之后操纵数据,并且您对数据的一致性持肯定态度,因为您实际上并未保留正在回收的视图,而只保留其使用的数据包含装有。希望你发现它有用:)