Android 我能';当我试图写一些东西时,它会消失,这是因为当我修改数据时会调用getView()

Android 我能';当我试图写一些东西时,它会消失,这是因为当我修改数据时会调用getView(),android,listview,android-edittext,android-softkeyboard,inline-editing,Android,Listview,Android Edittext,Android Softkeyboard,Inline Editing,编辑: 我找到了原因,那就是当我尝试 编辑某些内容,以便加载来自DataAdapter的数据并编辑我的数据 变化消失了 编辑: 我观察到一件事,如果listview中只有几行,那么它的 好的,但是如果列表视图中有许多行无法显示在 可见屏幕(显示滚动条以滚动到其他记录),然后 问题来了 我正在进行一个项目,我们已经实现了一个,即数据可以在listview中编辑 我为该ListView的每个项目/行定义了一个xml。我正在使用自定义DataAdapter将数据绑定到ListView 当我第一次加载L

编辑:

我找到了原因,那就是当我尝试 编辑某些内容,以便加载来自DataAdapter的数据并编辑我的数据 变化消失了

编辑:

我观察到一件事,如果listview中只有几行,那么它的 好的,但是如果列表视图中有许多行无法显示在 可见屏幕(显示滚动条以滚动到其他记录),然后 问题来了

我正在进行一个项目,我们已经实现了一个,即数据可以在listview中编辑

我为该ListView的每个项目/行定义了一个xml。我正在使用自定义DataAdapter将数据绑定到ListView

当我第一次加载ListView时,我可以编辑数据&它工作正常。当编辑某些内容时,更改会保存到SQLite数据库中,我有一个用于此目的的按钮

现在的问题是,在第一次保存数据&再次加载listview之后,我不能再编辑数据了。当我试图编辑数据时,键盘会出现,然后自动消失,输入的数据也会消失。请看屏幕截图

有人能帮我解决这个问题吗?

我的自定义适配器类:

public class QuestionAdapter extends ArrayAdapter<QuestionEntity> {
      private ArrayList<QuestionEntity> items;
      private Context CurrentContext;
      private QuestionEntity CurrentItem;
      private Cursor    OptionsCursor;


    public QuestionAdapter(Context context,  ArrayList<QuestionEntity> items, Cursor curOptions) 
    {
        super(context, R.layout.grid_item, items);
        this.CurrentContext = context;
        this.items          = items;
        this.OptionsCursor  = curOptions;

    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) 
    {
        //verify that the items list is still valid since
        //the list may have been cleared during an update
        if ((items == null) || ((position + 1) > items.size()))
                return convertView; //Can't extract item

        CurrentItem = items.get(position);    

        if(convertView == null) 
        {
            LayoutInflater inflater = LayoutInflater.from(CurrentContext);
            convertView = inflater.inflate(R.layout.grid_item, null);
        }

        if (convertView != null) 
        {

            TextView txtQuestion = (TextView) convertView.findViewById(R.id.txtQuestion);
            txtQuestion.setText(CurrentItem.getTitle());

            Spinner cmbOptions = (Spinner)convertView.findViewById(R.id.cmbOptions);

            /*
             * Load the options from OptionsCursor
             */

            LoadOptions(cmbOptions);

            /*
             * Attach onItemClick event with cmbOptions 
             * When the user change the option we will populate the comments based on the option
             */

            cmbOptions.setOnItemSelectedListener(new OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) 
            {
                try
                {
                    //If MyCondition is true show msg to user.

                }
                catch(Exception ex)
                {
                    ex.toString();
                }

            }
            });

        }
        return convertView;

    }

    private void LoadOptions(Spinner iacOptions)
    {
        //Load data in the spinner using the OptionsCursor

    }

}
公共类QuestionAdapter扩展了ArrayAdapter{
私有ArrayList项;
私人语境;
私人项目;
专用游标选项游标;
公共问题适配器(上下文上下文、ArrayList项、游标选项)
{
super(上下文、R.layout.grid_项、项);
this.CurrentContext=上下文;
这个项目=项目;
this.options cursor=curOptions;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图)
{
//请验证项目列表是否仍然有效,因为
//该列表可能在更新过程中被清除
if((items==null)| |((position+1)>items.size())
return convertView;//无法提取项
CurrentItem=items.get(位置);
if(convertView==null)
{
LayoutFlater充气机=LayoutFlater.from(当前上下文);
convertView=充气机。充气(R.layout.grid_项,空);
}
if(convertView!=null)
{
TextView txtQuestion=(TextView)convertView.findViewById(R.id.txtQuestion);
setText(CurrentItem.getTitle());
微调器cmbOptions=(微调器)convertView.findViewById(R.id.cmbOptions);
/*
*从选项游标加载选项
*/
装载选项(CMB选项);
/*
*使用CMB选项附加MClick事件
*当用户更改该选项时,我们将根据该选项填充注释
*/
CMBHOPTIONS.setOnItemSelectedListener(新的OnItemSelectedListener(){
@凌驾
已选择公共视图(AdapterView父视图、视图selectedItemView、整型位置、长id)
{
尝试
{
//如果MyCondition为true,则向用户显示消息。
}
捕获(例外情况除外)
{
例如toString();
}
}
});
}
返回视图;
}
专用void加载选项(微调器选项)
{
//使用选项游标在微调器中加载数据
}
}

尝试修改代码,看看是否在不应该调用方法的时候调用了该方法。这可能是由于对的冗余调用造成的


只需将日志添加到这些方法中,并查看它们是否在正确的时间和地点被调用。

根据您的问题更新,很明显问题出在您的
Adapter.getView(..)实现中。
。在编辑视图时,可以使用存储的数据刷新视图。如果在调用
Adapter.getView(..)
时正在键入
EditText
,则应检查此方法,如果是,则不刷新它。您是正确的。问题是,在我尝试修改数据时调用了Adapter.getView()。你能帮我解决这个问题吗?谢谢你的代码。
Adapter
的实现和调用
notifyDataSetChanged()
(或
notifyDataSetValidated()
)的代码特别有趣。