1

我在 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 的回收视图问题?

4

2 回答 2

0

如果您使用单选,则选择另一个项目将“取消选择”当前项目。当时,您可以将更改应用到适配器中项目的本地存储副本。我不认为您应该使用传入 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

        }
    });

更新功能将是列表项在不再被选中后的保存方式。但是,此方法假定您使用的是单选模式。

于 2013-08-02T21:47:40.967 回答
0

我的答案与此处的其他答案相似,试图以不同的方式解决回收问题-这将有点循环,因此请阅读两次:在 onItemSelected 中,首先使用您在上一次调用 onItemSelected 时保存的数据. 将当前视图中的数据(作为参数发送到 onItemSelected)保存到最终变量或字段,以便在下次调用 onItemSelected 时使用。

例如,这是一个模型对象: public class YourModelObject{ public YourModelObject(String dataString, int dataInt){ this.dataString = dataString; this.dataInt = dataInt; } 私有字符串数据字符串;私有整数数据;//这里有一些getter、setter和方法... }

这是显示它的列表视图:

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) {
    }
});

这样,您仅在项目失去焦点(并选择了新的焦点)后才操作数据,并且您对数据的一致性持肯定态度,因为您并没有真正持有正在回收的视图,而只是持有它曾经包含的数据。希望你觉得它有用:)

于 2013-10-08T13:58:35.483 回答