【发布时间】:2018-11-25 09:14:39
【问题描述】:
我是一名 Android 新手,我需要弄清楚如何将数据从一个活动返回到另一个活动。这个想法是,当单击回收器视图中的一行时,它将在另一个活动中加载选定的行。如果该行被删除,则数据行被删除一个列表,并且控件返回包含回收器视图的活动。但我收到以下错误。
Process: com.manoflogan.criminalintent, PID: 27222
java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid
view holder adapter positionViewHolder{9ed884a position=1 id=-1, oldPos=1,
pLpos:-1 scrap [attachedScrap] tmpDetached no parent}
android.support.v7.widget.RecyclerView{833ff9c VFED..... ......I.
0,0-1080,1584 #7f070032 app:id/crime_recycler_view},
adapter:com.manoflogan.criminalintent.CrimeListFragment$CrimeAdapter@4ad8da5,
layout:android.support.v7.widget.LinearLayoutManager@1abc57a,
context:com.manoflogan.criminalintent.CrimeListActivity@6a147d9
at
android.support.v7.widget.RecyclerView$Recycler.validateViewHolderForOffsetPosition(RecyclerView.java:5715)
at
android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5898)
at
android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5858)
at
android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5854)
at
android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2230)
at
android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1557)
at
android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1517)
at
android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:612)
at
android.support.v7.widget.RecyclerView.dispatchLayoutStep1(RecyclerView.java:3875)
at
android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:3639)
at
android.support.v7.widget.RecyclerView.consumePendingUpdateOperations(RecyclerView.java:1877)
at
android.support.v7.widget.RecyclerView$1.run(RecyclerView.java:407)
at
android.view.Choreographer$CallbackRecord.run(Choreographer.java:949)
at android.view.Choreographer.doCallbacks(Choreographer.java:761)
at android.view.Choreographer.doFrame(Choreographer.java:693)
at
android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:935)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Native Method)
at
com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
2018-11-24 22:11:30.588 1608-1608/? E/lowmemorykiller: Error writing /proc/2
这是工作流程
当应用程序启动时,用户将看到一个空视图,要求用户 通过单击菜单上的
+按钮添加new Crime。 Image # 1。这是fragment responsible for rendering the home screen。当
+符号被点击时,用户被引导到一个[封装了一个视图的不同活动 管理片段的寻呼机。用户可以单击菜单栏上的后退按钮,或设备后退按钮以在主屏幕上查看添加的条目。这是一个使用 ViewPager 管理多个犯罪对象的活动。用户可以重复步骤#2来添加更多
*crimes*。-
要删除犯罪,用户单击/点击任何视图持有者(行)以转到与第 2 步中看到的相同的活动,然后点击
garbage图标。然后删除该项目,并将用户重定向回由父活动屏幕管理的视图。这是调用封装所选视图的活动的代码块。private class CrimeHolder extends RecyclerView.ViewHolder implements View.OnClickListener { // Child views instance variables. public CrimeHolder(View view) { super(view); // *. . . Initialising child views . . . * } @Override public void onClick(View view) { Intent intent = CrimePagerActivity.newIntent(getActivity(), mCrime.getId()); lastAdapterClickedPosition = getAdapterPosition(); // Invoking another activity. I would like the activity result to be handled by `onActivityResult`. getActivity().startActivityForResult(intent, CRIME_VIEW_CODE); } void bind(Crime crime) { mCrime = crime; // Setting the state of child views } }
当用户点击删除按钮时,following menu option is triggered,
@Override
public boolean onOptionsItemSelected(MenuItem item) {
CrimeLab crimeLab = CrimeLab.get(getActivity());
Intent intent = new Intent();
switch(item.getItemId()) {
case R.id.delete_crime:
// Idea is that this index will be instantiated when activity result is returned.
intent.putExtra(CrimeListFragment.DELETE_ROW_INDEX,
crimeLab.getCrimes().indexOf(mCrime));
crimeLab.deleteCrime(mCrime);
getActivity().setResult(Activity.RESULT_OK, intent);
getActivity().finish();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
这是我认为是我的问题。
-
理想情况下,当我设置结果并调用
finish以返回上一个活动时,我希望在返回时调用onActivityResult。但事实并非如此。我的理解正确吗?下面给出的是我必须看到的方法。// Never invoked. @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode != Activity.RESULT_OK) { return; } if (requestCode == CRIME_ADD_CODE) { lastInsertedRowPosition = data.getIntExtra(CrimeListFragment.ROW_INDEX, -1); } else if (requestCode == CRIME_VIEW_CODE) { } }
【问题讨论】:
-
您调用 CRIME_VIEW_CODE 并在您的代码中处理 CRIME_ADD_CODE!!?
-
这是不同点击事件的请求码。我还在我的 if 块中处理 CRIME_VIEw_CODE,但是没有调用活动结果。这是我在视图持有者的点击处理程序中调用 CRIME_VIEW_CODE 的地方。 github.com/manoflogan/android-projects/blob/master/…
标签: android android-fragments android-intent android-fragmentactivity