Java 键盘在RecyclerView中打开多个edittext时滚动
好的,伙计们 我正在开发一个android应用程序,它需要很多edittext字段(因此我将它们放入recyclerview以获得更好的ui性能) 首先,我遇到edittext字段上的输入值未保存,因此滚动导致edittext字段中的值丢失 我通过将textwatcher添加到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
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);
}