【发布时间】:2017-10-09 08:33:32
【问题描述】:
我有一个 RecyclerView。 回收站视图中的每一行都有一个编辑文本组件。
当键盘不可见时,应用程序崩溃,并且用户点击了任何 EditText 组件在键盘弹出后将被占用的区域。 也就是说,屏幕上半部分的EditText框不会抛出异常。
此错误特定于运行 Android 6.0 或更高版本的设备。
对于版本低于 Android 6.0 的设备,该应用运行良好,因为 EditText 会自动滚动到键盘上方。
以下是例外。
E/AndroidRuntime: FATAL EXCEPTION: main
Process: in.haplotech.aims, PID: 12723
java.lang.IllegalArgumentException: parameter must be a descendant of this view
at android.view.ViewGroup.offsetRectBetweenParentAndChild(ViewGroup.java:5502)
at android.view.ViewGroup.offsetDescendantRectToMyCoords(ViewGroup.java:5431)
at android.widget.ScrollView.isWithinDeltaOfScreen(ScrollView.java:1167)
at android.widget.ScrollView.onSizeChanged(ScrollView.java:1576)
at android.view.View.sizeChange(View.java:17641)
at android.view.View.setFrame(View.java:17603)
at android.view.View.layout(View.java:17520)
at android.view.ViewGroup.layout(ViewGroup.java:5618)
at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1079)
at android.view.View.layout(View.java:17523)
at android.view.ViewGroup.layout(ViewGroup.java:5618)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
at android.view.View.layout(View.java:17523)
at android.view.ViewGroup.layout(ViewGroup.java:5618)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1741)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1585)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1494)
at android.view.View.layout(View.java:17523)
at android.view.ViewGroup.layout(ViewGroup.java:5618)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
at android.view.View.layout(View.java:17523)
at android.view.ViewGroup.layout(ViewGroup.java:5618)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1741)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1585)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1494)
at android.view.View.layout(View.java:17523)
at android.view.ViewGroup.layout(ViewGroup.java:5618)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
at com.android.internal.policy.DecorView.onLayout(DecorView.java:724)
at android.view.View.layout(View.java:17523)
at android.view.ViewGroup.layout(ViewGroup.java:5618)
at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2374)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2101)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1278)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6357)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:871)
at android.view.Choreographer.doCallbacks(Choreographer.java:683)
at android.view.Choreographer.doFrame(Choreographer.java:619)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:857)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6077)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
以下是我的适配器代码:
public class StudentAdapter extends RecyclerView.Adapter<StudentAdapter.ViewHolder> {
private Context context;
private List<User> dataList;
private ImageLoader mImageLoader;
public StudentAdapter(List<User> dataList) {
this.dataList = dataList;
this.mImageLoader = CustomVolleyRequestQueue.getInstance(AppName.getInstance().getApplicationContext()).getImageLoader();
}
public List<User> getDataList() {
return dataList;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
context = parent.getContext();
LayoutInflater inflater = LayoutInflater.from(context);
View itemView = inflater.inflate(R.layout.item_exam_student, parent, false);
ViewHolder viewHolder = new ViewHolder(itemView);
return viewHolder;
}
@Override
public void onBindViewHolder(ViewHolder viewHolder, int position) {
final User std = dataList.get(position);
RelativeLayout studentHolder = viewHolder.studentHolder;
NetworkImageView imgStudentPic = viewHolder.imgStudentPic;
final TextView tvName = viewHolder.tvName;
final EditText etMarks = viewHolder.etMarks;
tvName.setText(std.toString());
etMarks.setVisibility(View.GONE);
}
@Override
public int getItemCount() {
return dataList.size();
}
@Override
public int getItemViewType(int position) {//VVIMP : used to maintain the state of scrolled items.
//Resource : http://stackoverflow.com/questions/32065267/recyclerview-changing-items-during-scroll
return position;
}
public static class ViewHolder extends RecyclerView.ViewHolder {
public RelativeLayout studentHolder;
public NetworkImageView imgStudentPic;
public TextView tvName;
public EditText etMarks;
public ViewHolder(View itemView) {
super(itemView);
studentHolder = (RelativeLayout) itemView.findViewById(R.id.studentHolder);
imgStudentPic = (NetworkImageView) itemView.findViewById(R.id.imgStudentPic);
tvName = (TextView) itemView.findViewById(R.id.tvName);
etMarks = (EditText) itemView.findViewById(R.id.etMarks);
}
}
}
【问题讨论】:
-
同时添加您的适配器代码
-
this question的可能重复
-
您能否用代码清楚地描述问题?
-
请注意,我在每一行中都使用 Recycler View 和 Edit Text 组件。只有在我在回收站视图上进行一些滚动然后单击任何编辑文本框后才会引发异常。
标签: android android-recyclerview