RecyclerView 滚动问题中的多行 EditText
Multiline EditText in RecyclerView scrolling issues
我有一个包含多行 EditText
作为列表项的 RecyclerView
,每次添加一行时 EditText
都会展开。 RecyclerView
有一个标准的垂直 LinearLayoutManager
和一个标准的 RecyclerView.Adapter<RecyclerView.ViewHolder>
适配器,带有 15 个 EditText 列表项。我将在问题末尾添加代码。
问题是,在您向 EditText
添加了多行之后,每次添加一行时它都会开始向下滚动列表。最终,在您添加了足够多的新行之后,EditText 将滚出屏幕顶部并失去焦点。如果您尝试向上滚动 select EditText
的最后一行,它会向下滚动列表直到 EditText
离开屏幕顶部并且失去焦点。
这不是 ListView
的问题,只是 RecyclerView
的问题。
有谁知道如何解决或绕过这个问题?
订单项:
<EditText xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textMultiLine|textCapSentences"
android:gravity="top"
android:hint="Enter text"
android:minLines="2"
android:layout_margin="16dp"/>
RecyclerViewFragment 和适配器
public class RecyclerViewFragment extends Fragment
{
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
View view = inflater.inflate(R.layout.recycler_view_fragment, container, false);
RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.recycler_view);
recyclerView.setAdapter(new MyAdapter());
recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
return view;
}
private class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
{
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
{
View view = getActivity().getLayoutInflater().inflate(R.layout.edit_text_list_item, parent, false);
MyViewHolder holder = new MyViewHolder(view);
return holder;
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position)
{
}
@Override
public int getItemCount()
{
return 15;
}
private class MyViewHolder extends RecyclerView.ViewHolder
{
public MyViewHolder(View itemView)
{
super(itemView);
}
}
}
}
此问题已由最新版本的 RecyclerView 修复:22.2.0
EditTextView.setOnTouchListener(new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
// Disallow the touch request for parent scroll on touch of child view
v.getParent().requestDisallowInterceptTouchEvent(true);
return false;
}
});
在回收站视图上编辑文本时,请求不向其父级传递触摸事件。这样 editText 就会有触摸事件,并且会按预期运行
我有一个包含多行 EditText
作为列表项的 RecyclerView
,每次添加一行时 EditText
都会展开。 RecyclerView
有一个标准的垂直 LinearLayoutManager
和一个标准的 RecyclerView.Adapter<RecyclerView.ViewHolder>
适配器,带有 15 个 EditText 列表项。我将在问题末尾添加代码。
问题是,在您向 EditText
添加了多行之后,每次添加一行时它都会开始向下滚动列表。最终,在您添加了足够多的新行之后,EditText 将滚出屏幕顶部并失去焦点。如果您尝试向上滚动 select EditText
的最后一行,它会向下滚动列表直到 EditText
离开屏幕顶部并且失去焦点。
这不是 ListView
的问题,只是 RecyclerView
的问题。
有谁知道如何解决或绕过这个问题?
订单项:
<EditText xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textMultiLine|textCapSentences"
android:gravity="top"
android:hint="Enter text"
android:minLines="2"
android:layout_margin="16dp"/>
RecyclerViewFragment 和适配器
public class RecyclerViewFragment extends Fragment
{
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
View view = inflater.inflate(R.layout.recycler_view_fragment, container, false);
RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.recycler_view);
recyclerView.setAdapter(new MyAdapter());
recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
return view;
}
private class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
{
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
{
View view = getActivity().getLayoutInflater().inflate(R.layout.edit_text_list_item, parent, false);
MyViewHolder holder = new MyViewHolder(view);
return holder;
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position)
{
}
@Override
public int getItemCount()
{
return 15;
}
private class MyViewHolder extends RecyclerView.ViewHolder
{
public MyViewHolder(View itemView)
{
super(itemView);
}
}
}
}
此问题已由最新版本的 RecyclerView 修复:22.2.0
EditTextView.setOnTouchListener(new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
// Disallow the touch request for parent scroll on touch of child view
v.getParent().requestDisallowInterceptTouchEvent(true);
return false;
}
});
在回收站视图上编辑文本时,请求不向其父级传递触摸事件。这样 editText 就会有触摸事件,并且会按预期运行