OnItemSelectedListener,ListView和项目回收

时间:2013-07-31 19:37:06

标签: android listview

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

2 个答案:

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

通过这种方式,您只能在项目失去焦点(以及选择新项目)之后操纵数据,并且您对数据的一致性持肯定态度,因为您实际上并未保留正在回收的视图,而只保留其使用的数据包含装有。希望你发现它有用:)