Java 键盘在RecyclerView中打开多个edittext时滚动

Java 键盘在RecyclerView中打开多个edittext时滚动,java,android,android-edittext,android-recyclerview,Java,Android,Android Edittext,Android Recyclerview,好的,伙计们 我正在开发一个android应用程序,它需要很多edittext字段(因此我将它们放入recyclerview以获得更好的ui性能) 首先,我遇到edittext字段上的输入值未保存,因此滚动导致edittext字段中的值丢失 我通过将textwatcher添加到edittext字段并保存输入数据解决了这个问题,但现在我遇到了另一个问题: 只需按正确顺序尝试以下步骤: 1- tap to some edittext input field(soft keyboard open up

好的,伙计们

我正在开发一个android应用程序,它需要很多edittext字段(因此我将它们放入recyclerview以获得更好的ui性能)

首先,我遇到edittext字段上的输入值未保存,因此滚动导致edittext字段中的值丢失

我通过将textwatcher添加到edittext字段并保存输入数据解决了这个问题,但现在我遇到了另一个问题: 只需按正确顺序尝试以下步骤:

1- tap to some edittext input field(soft keyboard open ups simultaneously)
2- now scroll the recyclerview to other edittext fields (so edittext which you entering value into it, disappears from screen)
3- and try to input some words into it by keyboard
在这些步骤之后 编辑的edittext不包含任何值

相反,其他随机选择的edittext将获得您输入的值

可能是recyclerview的重用机制造成的,不确定

我不想在打开软键盘时禁用滚动来修复此可能的行为/问题,那么有其他方法解决此问题吗

编辑:

公共类samdeccapter扩展了RecyclerView.Adapter{
私有静态列表mEditTextValues=new ArrayList();
公共数据集(列表数据集){
mEditTextValues=数据集;
}
@凌驾
public RecyclerView.ViewHolder onCreateViewHolder(视图组父级,int-viewType){
返回新的CustomViewHolder(LayoutInflater.from(parent.getContext()).flate(R.layout.edittext,parent,false));
}
@凌驾
BindViewHolder上的公共无效(RecyclerView.ViewHolder,int位置){
CustomViewHolder viewHolder=((CustomViewHolder)holder);
viewHolder.mEditText.setTag(位置);
viewHolder.mEditText.setText(mEditTextValues.get(position));
}
@凌驾
public int getItemCount(){
返回mEditTextValues.size();
}
公共类CustomViewHolder扩展了RecyclerView.ViewHolder{
私有EditText-mEditText;
公共CustomViewHolder(查看项目视图){
超级(项目视图);
mEditText=(EditText)itemView.findViewById(R.id.EditText);
mEditText.addTextChangedListener(新的TextWatcher(){
public void beforeTextChanged(CharSequence CharSequence,inti,inti1,inti2){
public void PostTextChanged(可编辑){
if(mEditText.getTag()!=null){
mEditTextValues.set((int)mEditText.getTag(),editable.toString());
}
}
public void onTextChanged(CharSequence CharSequence,inti,inti1,inti2){
});
}
}

}

听起来你的版面需要一个滚动视图,但是没有代码发布

试着把你的TextWatcher放在onBindViewHolder中,它会工作的

@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
    CustomViewHolder viewHolder = ((CustomViewHolder)holder);

    viewHolder.mEditText.setText(mEditTextValues.get(position));

viewHolder.mEditText.addTextChangedListener(new TextWatcher() {
            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {}
            public void afterTextChanged(Editable editable) {

            }
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
               mEditTextValues.set(position,mEditText.getText().toString())
}
        });
}

如果要停止编辑随机位置,可以在当前编辑文本开始不聚焦时隐藏软键盘

Adapter.bindView

viewHolder.mEditText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View view, boolean b) {
                if (b == false) {
                    hideKeyboard(view.getContext(), view);
                }
            }
        });
隐藏键盘

/**
 * To hide a keypad.
 *
 * @param context
 * @param view
 */
public static void hideKeyboard(Context context, View view) {
    if ((context == null) || (view == null)) {
        return;
    }
    InputMethodManager mgr =
            (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
    mgr.hideSoftInputFromWindow(view.getWindowToken(), 0);
}

我试着使用scrollview,但我有80多个edittext,所以scrollview上的ui非常糟糕,然后我使用了RecyclerView,你可以发布一些代码吗,80个edittext在任何视图上都是地狱好的,我添加了适配器classyeah视图数很高,但RecyclerView戏剧性地修复了整个滞后和性能问题,它可以滚动非常短的代码片段会有帮助好的,我添加了适配器类您是否通知适配器您的数据集已更改?在mEditTextValues之后。set()通过调用notifyDataSetChanged()通知适配器目前,您正在更新列表中的值,但适配器对此一无所知。我是否可以将该侦听器放入createviewholder而不是bindView?
/**
 * To hide a keypad.
 *
 * @param context
 * @param view
 */
public static void hideKeyboard(Context context, View view) {
    if ((context == null) || (view == null)) {
        return;
    }
    InputMethodManager mgr =
            (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
    mgr.hideSoftInputFromWindow(view.getWindowToken(), 0);
}