Я новичок в 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
Это рабочий процесс
Когда приложение запускается, пользователь увидит пустое представление с просьбой добавить пользователяa new Crime
, нажав на кнопку +
в меню. Изображение № 1 .Это фрагмент , отвечающий за отображение начального экрана .
При нажатии на символ +
пользователь перенаправляется на [другое действие, которое инкапсулируетпросмотр пейджера, который управляет фрагментом.Пользователь может нажать кнопку «Назад» в строке меню или кнопку «Назад» устройства, чтобы увидеть добавленные записи на главном экране.Это действие, которое использует ViewPager для управления несколькими объектами Crime.
Пользователь может повторить шаг # 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
}
}
Когда пользователь нажимает кнопку удаления, запускается следующая опция меню ,
@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) {
}
}