0

RecyclerView과 함께 커서 로더를 사용하고 있으며, RecyclerView에서 항목을 제거 할 때를 제외하고 다른 모든 항목이 올바르게 작동합니다. 마지막 항목이 깜박입니다 ( RecyclerView 마지막 항목이 항목이 제거 될 때마다 깜박임

).

deleteData(viewHolder.getItemId()); 
: last item blinks

삭제 내 코드 스 와이프

public void deleteData(long id){ 
    Uri uri = ContentUris.withAppendedId(URI, id); 
    getContentResolver().delete(uri, null, null); 
} 

코드는

동일한 RecyclerAdapter, ContentProvider 및 레이아웃 코드를 사용하는 또 다른 활동이 있지만 대부분의 구현 및 방법 접근법도 동일하지만 깜박임없이 완벽하게 작동하므로 나에게는 매우 이상한 상황입니다.

이 문제가 발생할 수있는 특별한 이유가 있습니까? 이미

recyclerView.getItemAnimator().setChangeDuration(0); 

또는

((DefaultItemAnimator) recyclerViewObject.getItemAnimator()).setSupportsChangeAnimations(false); 

같은 애니메이션을 해제하려하지만 아무도 내가 애니메이션 작업 할 않는 것을 말할 것도없고, 일을하지 않습니다.

편집 :에 RUNNABLE :

에서 onCreate :

"4668 @ 주"프리 오 = 5 TID = 0x2로의 꾸벅 꾸벅 = NA 실행 가능한 java.lang.Thread.State에 포인트 업로드 브레이크 com.jackz314.todo.HistoryActivity.onCreateLoader android.support.v4.app.LoaderManagerImpl에서 android.support.v4.app.LoaderManagerImpl.createLoader (LoaderManager.java:539)에서 (HistoryActivity.java:803) . createAndInstallLoader (LoaderManager. android.support.v4.app.LoaderManagerImpl.initLoader (LoaderManager.java:603) com.jackz314.todo.HistoryActivity.displayAllNotes (HistoryActivity.java:394) com.jackz314에서 에서의 548) : 자바. 에서 todo.HistoryActivity.deleteExpiredNotes com.jackz314.todo.HistoryActivity.onCreate (HistoryActivity.java:129)에서 (HistoryActivity.java:767) android.app.Activity.performCreate에서
(Activity.java:6975) android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1213) at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2770) at android. app.ActivityThread.handleLaunchActivity (ActivityThread.java:2892) android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1593)에서 android.app.ActivityThread.-wrap11 (ActivityThread.java:-1)에서 을
android.os.Handler.dispatchMessage (Handler.java:105) at android.os.Looper.loop (Looper.java:164) at android.app.ActivityThread.main (ActivityThread.java:6541) at java .lang.reflect.Method.invoke (Method.java:-1) at com.android.internal.os.Zygote $ MethodAndArgsCaller.run (Zygote.java:240) at com.android.internal.os.ZygoteInit. main (ZygoteInit.자바 : 767)

onDelete (항목을 삭제) : 프리 오 = 5 TID = 0x2로의 NID = NA 실행 가능한 java.lang.Thread.State에

"4668 @ 메인" 에서 가 RUNNABLE COM com.jackz314.todo.HistoryActivity $ 4.onSwiped (HistoryActivity.java:434) android.support.v7.widget.helper.ItemTouchHelper $을 4 에서 .jackz314.todo.HistoryActivity.deleteData (HistoryActivity.java:791) .run (ItemTouchHelper.java:686) android.os.Handler.handleCallback (Handler.java:789) at android.os.Handler.dispatchMessage (Handler.java:98) at android.os.Looper.loop (Looper.java:164) at android.app.ActivityThread.main (ActivityThread.java:6541) at java .lang.reflect.Method.invoke (Method.java:-1) at com.android.internal.os.Zygote $ MethodAndArgsCaller.run (Zygote.java:240) at com.android.internal.os.ZygoteInit. 주 (ZygoteInit.java:767)

희망 사람들은

편집을하는 데 도움이 : 약간의 조사 후, 나는 마지막 항목이 실제로 BLIN하지 않았다 것을 알아 냈다 k, 그것은 RecyclerView이 처음으로 길이/크기가 변경된 것으로 보이며 삭제 된 항목과 동일한 크기를 가진 섹션을 삭제 (삭제) 한 것으로 보이기 때문에 삭제 된 항목의 크기에 따라 마지막 항목이 표시되지 않습니다. 잠시 후 RecyclerView은 처음에 삭제할 항목을 삭제합니다. 아직 주문을 어딘가에서 엉망으로 만들었거나 다른 이유가 있는지 판단하려고 노력 중입니다.

+0

이 코드를 추가 할 때까지 비슷한 문제가 발생했습니다. 내 디자인은 RecyclerAdapter DetailsActivity 및 ListActivity입니다. 세부 정보에서 삭제하고 어댑터 코드에 연결된 목록을 알려줍니다. btnDelete ListActivity.removeListRow (position); // 코드 줄 위의 호출 위의 코드 줄 – Grendel

+0

데이터 행을 삭제하는 활동에 다음과 같은 코드가 있습니까? //이 메서드는 DetailsActivity에서 호출되고 Recycler보기에 DB가 변경되었음을 알립니다. // 그리고 메서드는 Recycler와 동일한 변경을 수행합니다. DB 및 Recycler의 동기화보기 종류 public static void removeListRow (int position) { dbList.remove (position); mAdapter.notifyItemRemoved (position); mAdapter.notifyItemRangeChanged (position, dbList.size()); } – Grendel

+0

모든 것이'cursorLoader'에 의해 자동으로 처리되기 때문에 데이터 행을 삭제하는 코드가 없기 때문에 나에게 혼란을줍니다. 나중에 당신의 방법을 시도해 볼게요, 고마워요. – jackz314

답변

0

마침내 얻었습니다!

어리석은 또 다른 실수는 전혀 복잡하지 않습니다. 저는 계속이 활동에 대해서만이 문제를 겪고 있지만 이전 활동에는이 문제가 없었습니다. 갑자기 두 가지 활동의 레이아웃이 다릅니다. , 내가 RecyclerView의 높이를 wrap_content으로 설정했기 때문에, 어떤 일이 일어난 것 같아요. 레이아웃이 RecyclerView의 콘텐츠를 래핑하도록 시스템에 말했고, 항목을 삭제하면 기술적으로 더 이상 존재하지 않게되었습니다. 삭제 된 항목에 대한 애니메이션이 있지만 해당 항목이 레이아웃 수준에서 즉시 제거되므로 안드로이드가 RecyclerView 님의 높이를 먼저 조정 한 다음 항목을 삭제 한 것 같습니다. 실제로 어떤 일이 일어 났는지는 RecyclerViewwrap_content ,보기 (항목)의 위치를 ​​제거합니다. immediatel 삭제 후 y가 애니메이션 이후가 아니기 때문에 깜박 거리는 것입니다.

어쨌든,이 솔루션은 내가 그랬던 것처럼 당신이 ConstraintLayout를 사용하는 경우 다음 바로 0dp에 높이를 변경, 다른 값으로 wrap_content에서 RecyclerView의 높이를 변경 뭔가에 RecyclerView을 제약하거나 단지입니다 모서리.

내 문제를 해결하기 위해 노력한 모든 사람에게 감사드립니다. 이것은 내가 지금까지 가지고있는 가장 어리 석고 좌절 한 문제 중 하나임을 인정합니다.

같은 문제가 발생한 다른 사람들이 있다고 생각합니다. 높이가 wrap_content으로 설정되어 있는지 확인하십시오.

0

RecyclerViewAdapter와 바인딩하는 데이터 객체에 중단 점을 놓고 데이터가 깜박 거리는 지 확인합니다. 이 상황과 같은 대부분의 경우, 나는 데이터가 영향을 받고보기 변경을 제어 할 수 없게 만든다는 것을 깨닫습니다. 데이터를 어떻게 처리하는지 모르므로 자세한 내용을 알려 드릴 수 없습니다.

+0

모든 것은'cursorLoader'에 의해 처리됩니다. 데이터를 처리하는 특정 메소드를 게시 할 예정 이었지만,'cursorLoader' 작업에는 너무 많은 다른 클래스와 메소드가 포함되어 있기 때문에 실제로 무엇을해야합니까? 여기에 게시하십시오. 여기에 게시해야 할 부분이나 중단 점을 설정할 위치에 대한 구체적인 지침을 제공 할 수 있습니까? 감사! – jackz314

+0

@ jackz314 RecyclerViewAdapter에서이 클래스에 선언 한 목록 데이터 개체에 1 개의 중단 점을 배치하고 삭제 된 항목 메서드에 1 개의 중단 점을 추가로 배치하십시오. 그런 다음 항목을 삭제 한 후에 변경되는 데이터를 감독합니다. 이상한 순서로 목록 객체가 변경된 경우 항목을 삭제 한 후 데이터 처리 메소드를 확인하고 어댑터 클래스의보기 핸들 메소드를 확인하지 않으면됩니다. –

+0

@ jackz314 많은 코드를 게시하는 대신 디자인을 알려주는 설명을 추가하십시오. 모든 클래스의 이름이 도움이 될 것이며 어떤 클래스에서 삭제를 실행하는지 알 수 있습니다.의도적으로 MVP는 이벤트를 처리하는 특정 클래스와 RecyclerViewAdapter를 사용하여 다른 클래스와 함께 작동해야 함을 의미합니다. XML 파일의 이름을 포함시킬 수 있습니다. – Grendel

0

애니메이션을 사용하지 않으려 고 시도한 적이 있습니까? 아래

adapter.setHasStableIds(true); 
recyclerView.setItemAnimator(null); 
+0

예, 수행 한 것 중 아무 것도 수행하지 않았습니다. – jackz314

0

Jackz이 코드는 btnDelete이 불을 가지고 있으며, DBHelper까지 가고 DetailsActivity에 기록 반환은 다음 위치에 따라 목록에서 항목을 제거하는 ListActivity에 대한 호출을 삭제합니다 DetailsActivity에 NOT 기록 ID 여기

private void addListenerOnButtonDelete() { 
    btnDelete.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 

      // Calls the Method deleteDBRow in DatabaseHelper 
      // which acts on the TABLE_INFO to remove a record by getting the record ID 
      helper.deleteDBRow(String.valueOf(dbList.get(position).getID())); 
      ListActivity.removeListRow(position); 
      // Code line above calls Method in ListActivity to notify recycler view of changes 
      // NOTICE the List keeps items by position not ID <== READ 
      etWebSite.setText(""); 
      etUN.setText(""); 
      etPW.setText(""); 
      etSecQuestion.setText(""); 
      etSecAnswer.setText(""); 
      etNotes.setText(""); 

      Intent intent = new Intent(DetailsActivity.this, ListActivity.class); 
      startActivity(intent); 
     } 
    }); 
} 

// This method is called from DetailsActivity and notifies Recycler View that the DB was changed 
// and the method makes the same changes to the Recycler View kind of a sync of DB and Recycler View 
public static void removeListRow(int position) { 
    dbList.remove(position); 
    mAdapter.notifyItemRemoved(position); 
    mAdapter.notifyItemRangeChanged(position, dbList.size()); 
} 
+0

그것은하지 않았습니다. 나를 위해 일하는 제발 내 업데이 트를 봐, RecyclerView가 잘못된 순서로 일을하고있는 것 같아 – jackz314

+0

@ jackz314 그래서 내 제안은 레코드를 삭제 한 다음 목록에서 항목을 제거한 다음 항목이 제거 된 어댑터로 통지합니다. 위치 및 어댑터 마지막으로 항목 범위를 수행 위의 코드에서와 같이 변경 내 목록보기는 목록보기의 크기로 작업하여 전체 항목 만 표시 함 목록을 채우는 카드보기의 높이 설정 – Grendel

+0

솔루션, 실제로는 실제 프로그램 프로세스와 관련이 없습니다. 단지 바보가되어서 RecyclerView 높이를 다른 것으로 설정하는 것을 잊었습니다. 'wrap_content'보다, 어쨌든 도움을 주셔서 감사합니다! – jackz314

0

내가 샘과 붙어 어댑터 통신하는 ListActivity에 살고 코드입니다 너와 똑같이. 문제는 우리가 데이터베이스에서 무언가를 삭제할 때마다 CursorLoader가 다시 시작되므로 onLoadFinished가 매번 트리거하고 커서를 교체한다는 것입니다.

커서에서 List로 데이터를로드하고 어댑터에 전달하면 문제가 "해결 될 수 있습니다". 아직도, 나는 해결책으로, 진짜 해결책이 아닌 것을 안다.

+0

해결책을 찾았습니다. 도움을 주셔서 감사합니다. 레이아웃 파일을 확인하고 높이가'wrap_content'로 설정되어 있는지 확인하셨습니까? (내 대답을 확인하십시오) – jackz314

관련 문제