2017-09-18 2 views
-5

Mon application fonctionne bien sur 3 émulateurs différents (api 16, 21, 24 et 25) mais continue de se bloquer lorsqu'elle est testée sur un périphérique réel. Je reçois ces messages d'erreur. mais depuis que je suis nouveau dans la programmation Android, je ne comprends pas vraiment ce qu'ils signifient. Im en utilisant RecycleView. la dernière méthode appelée est la méthode onloadfinished où la méthode swapCursor est appelée. Merci de votre aide.Mon application continue de se bloquer, le curseur n'est pas initialisé correctement

09-18 23:41:30.699 8324-8324/com.a2sigma.workermanager E/CursorWindow: 

Failed to read row 0, column 0 from a CursorWindow which has 0 rows, 45 columns. 
09-18 23:41:30.706 8324-8324/com.a2sigma.workermanager D/AndroidRuntime: Shutting down VM 
09-18 23:41:30.719 8324-8324/com.a2sigma.workermanager E/AndroidRuntime: FATAL EXCEPTION: main 
                     Process: com.a2sigma.workermanager, PID: 8324 
                     java.lang.IllegalStateException: Couldn't read row 0, col 0 from CursorWindow. Make sure the Cursor is initialized correctly before accessing data from it. 
                      at android.database.CursorWindow.nativeGetLong(Native Method) 
                      at android.database.CursorWindow.getLong(CursorWindow.java:524) 
                      at android.database.AbstractWindowedCursor.getLong(AbstractWindowedCursor.java:75) 
                      at android.database.CursorWrapper.getLong(CursorWrapper.java:127) 
                      at com.a2sigma.workermanager.CursorRecyclerViewAdapter.onBindViewHolder(CursorRecyclerViewAdapter.java:56) 
                      at com.a2sigma.workermanager.CursorRecyclerViewAdapter.onBindViewHolder(CursorRecyclerViewAdapter.java:16) 
                      at android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:6400) 
                      at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:6433) 
                      at android.support.v7.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:5377) 
                      at android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5640) 
                      at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5482) 
                      at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5478) 
                      at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2215) 
                      at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1542) 
                      at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1502) 
                      at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:595) 
                      at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3625) 
                      at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:3354) 
                      at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:3886) 
                      at android.view.View.layout(View.java:18874) 
                      at android.view.ViewGroup.layout(ViewGroup.java:5954) 
                      at android.support.constraint.ConstraintLayout.onLayout(ConstraintLayout.java:1197) 
                      at android.view.View.layout(View.java:18874) 
                      at android.view.ViewGroup.layout(ViewGroup.java:5954) 
                      at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323) 
                      at android.widget.FrameLayout.onLayout(FrameLayout.java:261) 
                      at android.view.View.layout(View.java:18874) 
                      at android.view.ViewGroup.layout(ViewGroup.java:5954) 
                      at android.support.design.widget.HeaderScrollingViewBehavior.layoutChild(HeaderScrollingViewBehavior.java:131) 
                      at android.support.design.widget.ViewOffsetBehavior.onLayoutChild(ViewOffsetBehavior.java:42) 
                      at android.support.design.widget.AppBarLayout$ScrollingViewBehavior.onLayoutChild(AppBarLayout.java:1389) 
                      at android.support.design.widget.CoordinatorLayout.onLayout(CoordinatorLayout.java:868) 
                      at android.view.View.layout(View.java:18874) 
                      at android.view.ViewGroup.layout(ViewGroup.java:5954) 
                      at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323) 
                      at android.widget.FrameLayout.onLayout(FrameLayout.java:261) 
                      at android.view.View.layout(View.java:18874) 
                      at android.view.ViewGroup.layout(ViewGroup.java:5954) 
                      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:18874) 
                      at android.view.ViewGroup.layout(ViewGroup.java:5954) 
                      at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323) 
                      at android.widget.FrameLayout.onLayout(FrameLayout.java:261) 
                      at android.view.View.layout(View.java:18874) 
                      at android.view.ViewGroup.layout(ViewGroup.java:5954) 
                      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:18874) 
09-18 23:41:30.720 8324-8324/com.a2sigma.workermanager E/AndroidRuntime:  at android.view.ViewGroup.layout(ViewGroup.java:5954) 
                      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:910) 
                      at android.view.View.layout(View.java:18874) 
                      at android.view.ViewGroup.layout(ViewGroup.java:5954) 
                      at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2697) 
                      at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2413) 
                      at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1550) 
                      at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7190) 
                      at android.view.Choreographer$CallbackRecord.run(Choreographer.java:959) 
                      at android.view.Choreographer.doCallbacks(Choreographer.java:734) 
                      at android.view.Choreographer.doFrame(Choreographer.java:670) 
                      at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:945) 
                      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:6776) 
                      at java.lang.reflect.Method.invoke(Native Method) 
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1496) 
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1386) 

Mon AdapterClass

package com.a2sigma.workermanager; 

import android.database.Cursor; 
import android.support.v7.widget.RecyclerView; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ImageButton; 
import android.widget.TextView; 


class CursorRecyclerViewAdapter extends 
RecyclerView.Adapter<CursorRecyclerViewAdapter.WorkerViewHolder> { 
private static final String TAG = "CursorRecyclerViewAdapt"; 

private Cursor mCursor; 
private OnTaskClickListener mListener; 

interface OnTaskClickListener { 
    void onEditClick(Worker worker); 
    void onDeleteClick(Worker worker); 
    void onWorkerClick(Worker worker); 
} 

CursorRecyclerViewAdapter(Cursor cursor, OnTaskClickListener listener) { 
    Log.d(TAG, "CursorRecyclerViewAdapter: Constructor called"); 
    mCursor = cursor; 
    mListener = listener; 
} 

@Override 
public WorkerViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    Log.d(TAG, "onCreateViewHolder: new view requested"); 
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.worker_list_items, parent,false); 
    return new WorkerViewHolder(view); 
} 

@Override 
public void onBindViewHolder(WorkerViewHolder holder, int position) { 
    Log.d(TAG, "onBindViewHolder: starts position " +position); 

    if((mCursor == null)||(mCursor.getCount() == 0)){ 
     Log.d(TAG, "onBindViewHolder: providing instructions"); 
     holder.name.setText(R.string.instructions_heading); 
     holder.noIndukKaryawan.setText(R.string.instructions); 
     holder.editButton.setVisibility(View.GONE); 
     holder.deleteButton.setVisibility(View.GONE); 
    }else { 
     if(!mCursor.moveToPosition(position)){ 
      throw new IllegalStateException("Couldn't move cursor to position " +position); 
     } 
     Log.d(TAG, "onBindViewHolder: Hallooooooooo"); 
     final Worker worker = new Worker(mCursor.getLong(mCursor.getColumnIndex(WorkersContract.Columns._ID)), 
       mCursor.getString(mCursor.getColumnIndex(WorkersContract.Columns.NAMA_KARYAWAN)), 
       mCursor.getString(mCursor.getColumnIndex(WorkersContract.Columns.JENIS_KELAMIN)), 
       mCursor.getString(mCursor.getColumnIndex(WorkersContract.Columns.TGL_LAHIR)), 
       mCursor.getString(mCursor.getColumnIndex(WorkersContract.Columns.TEMPAT_LAHIR)), 
       mCursor.getString(mCursor.getColumnIndex(WorkersContract.Columns.NKTP)), 
       mCursor.getString(mCursor.getColumnIndex(WorkersContract.Columns.NO_HP_1)), 
       mCursor.getString(mCursor.getColumnIndex(WorkersContract.Columns.NO_HP_2)), 
       mCursor.getString(mCursor.getColumnIndex(WorkersContract.Columns.NO_KK)), 
       mCursor.getString(mCursor.getColumnIndex(WorkersContract.Columns.IBU_KANDUNG)), 
    mCursor.getBlob(mCursor.getColumnIndex(WorkersContract.Columns.FOTO))); 



     Log.d(TAG, "onBindViewHolder: worker id "+ worker.getId()); 
     holder.name.setText(worker.getmName()); 
     holder.noIndukKaryawan.setText("NIK: " + worker.getmNIK()); 
     holder.editButton.setVisibility(View.VISIBLE);//TODO add onClick listener 
     holder.deleteButton.setVisibility(View.VISIBLE); //TODO add onClick Listener 

     View.OnClickListener buttonListener = new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       Log.d(TAG, "onClick: starts"); 
       switch (view.getId()){ 
        case R.id.wli_edit: 
         if(mListener != null){ 
          mListener.onEditClick(worker); 
         } 

         break; 
        case R.id.wli_delete: 
         if(mListener!=null){ 
          mListener.onDeleteClick(worker); 
         } 

         break; 
        default: 
         Log.d(TAG, "onClick: found unexpected button id"); 
       } 
      } 
     }; 

     holder.editButton.setOnClickListener(buttonListener); 
     holder.deleteButton.setOnClickListener(buttonListener); 
    } 
} 

@Override 
public int getItemCount() { 
    Log.d(TAG, "getItemCount: starts"); 
    if((mCursor == null) || (mCursor.getCount() == 0)){ 
     return 1; // fib, because we populate a single viewHolder with instructions 
    }else { 
     return mCursor.getCount(); 
    } 
} 

/** 
* Swap in a new Cursor, returning the old Cursor. 
* The returned old Cursor is <em>not</em> closed. 
* 
* @param newCursor The new cursor to be used 
* @return Returns the previously set Cursor, or null if there wasn't one. 
* If the given new Cursor is the same instance as the previously set 
* Cursor, null is also returned. 
*/ 
Cursor swapCursor(Cursor newCursor){ 
    Log.d(TAG, "swapCursor: Called"); 
    if(newCursor == mCursor){ 
     return null; 
    } 

    final Cursor oldCursor = mCursor; 
    mCursor = newCursor; 
    if(newCursor !=null){ 
     // notify the observers about the new cursor 
     notifyDataSetChanged(); 
    }else { 
     // notify the obeservers about the lack of a data set 
     notifyItemRangeRemoved(0, getItemCount()); 
    } 
    return oldCursor; 
} 

static class WorkerViewHolder extends RecyclerView.ViewHolder{ 
    private static final String TAG = "TaskViewHolder"; 

    TextView name = null; 
    TextView noIndukKaryawan = null; 
    ImageButton editButton = null; 
    ImageButton deleteButton = null; 


    public WorkerViewHolder(View itemView){ 
     super(itemView); 
     Log.d(TAG, "TaskViewHolder: starts"); 

     this.name = (TextView) itemView.findViewById(R.id.wli_name); 
     this.noIndukKaryawan = (TextView)itemView.findViewById(R.id.wli_nik); 
     this.editButton = (ImageButton) itemView.findViewById(R.id.wli_edit); 
     this.deleteButton = (ImageButton) itemView.findViewById(R.id.wli_delete); 
    } 
} 
} 

fichiers XML 1. Worker_list_items

<?xml version="1.0" encoding="utf-8"?> 
<android.support.constraint.ConstraintLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="wrap_content" 
android:orientation="vertical"> 

<TextView 
    android:id="@+id/wli_name" 
    android:layout_width="0dp" 
    android:layout_height="wrap_content" 
    android:layout_marginLeft="8dp" 
    android:layout_marginRight="8dp" 
    android:layout_marginTop="16dp" 
    android:textColor="?android:attr/textColorPrimary" 
    android:textSize="22sp" 
    android:textStyle="bold" 
    app:layout_constraintHorizontal_bias="0.0" 
    app:layout_constraintLeft_toLeftOf="parent" 
    app:layout_constraintRight_toLeftOf="@+id/wli_edit" 
    app:layout_constraintTop_toTopOf="parent" 
    tools:text="Nama Karyawan" /> 

<TextView 
    android:id="@+id/wli_nik" 
    android:layout_width="0dp" 
    android:layout_height="wrap_content" 
    android:layout_marginLeft="8dp" 
    android:layout_marginRight="8dp" 
    android:layout_marginTop="1dp" 
    android:textColor="?android:attr/textColorSecondary" 
    android:textSize="18sp" 
    app:layout_constraintHorizontal_bias="0.0" 
    app:layout_constraintLeft_toLeftOf="parent" 
    app:layout_constraintRight_toLeftOf="@+id/wli_edit" 
    app:layout_constraintTop_toBottomOf="@+id/wli_name" 
    tools:text="123.256.478" /> 

<ImageButton 
    android:id="@+id/wli_delete" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_marginEnd="8dp" 
    android:layout_marginRight="8dp" 
    android:layout_marginTop="16dp" 
    android:contentDescription="@string/delete_button" 
    app:layout_constraintRight_toRightOf="parent" 
    app:layout_constraintTop_toTopOf="parent" 
    app:srcCompat="@android:drawable/ic_menu_delete" /> 

<ImageButton 
    android:id="@+id/wli_edit" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_marginEnd="8dp" 
    android:layout_marginRight="8dp" 
    android:layout_marginTop="0dp" 
    android:contentDescription="@string/edit_button" 
    app:layout_constraintRight_toLeftOf="@+id/wli_delete" 
    app:layout_constraintTop_toTopOf="@+id/wli_delete" 
    app:srcCompat="@android:drawable/ic_menu_edit" /> 

</android.support.constraint.ConstraintLayout> 

Et le XML RycycleView FICHIER

<?xml version="1.0" encoding="utf-8"?> 
<android.support.constraint.ConstraintLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto" 
xmlns:tools="http://schemas.android.com/tools" 
android:orientation="vertical" 
android:layout_width="match_parent" 
android:layout_height="match_parent"> 

<android.support.v7.widget.RecyclerView 
    android:id="@+id/worker_list" 
    android:layout_width="0dp" 
    android:layout_height="0dp" 
    android:layout_marginBottom="8dp" 
    android:layout_marginLeft="8dp" 
    android:layout_marginRight="8dp" 
    android:layout_marginTop="8dp" 
    app:layout_constraintBottom_toBottomOf="parent" 
    app:layout_constraintLeft_toLeftOf="parent" 
    app:layout_constraintRight_toRightOf="parent" 
    app:layout_constraintTop_toTopOf="parent" 
    android:layout_marginStart="8dp" 
    android:layout_marginEnd="8dp" /> 
</android.support.constraint.ConstraintLayout> 
+1

On dirait que ce n'est pas le stacktrace entier ... pouvez-vous publier l'intégralité du stacktrace? – 10101010

+0

Avez-vous 'android: animateLayoutChanges =" true "' dans le fichier 'RecyclerView' de votre xml? –

+0

@MosesAprico Non, je n'ai pas, ive édité ma question. –

Répondre

0

Il est généralement une erreur d'inflation. Vous devez comparer les ID de vue que vous tentez de remplir, assurez-vous qu'ils ne sont pas NULL et que vous êtes correctement configuré avec votre adaptateur Recycler View Holder.

Publiez votre adaptateur, votre xml pour la ligne que vous remplissez, le modèle de votre viewholder et la configuration et l'affectation de votre adaptateur, et nous pourrons certainement vous aider à résoudre vos problèmes. Juste pour mettre à jour la réponse votre curseur devrait être peuplé correctement avant d'y accéder et vous devriez vous assurer que le contenu existe avant d'y accéder.

Exemple peuplant curseur

Cursor cursor = null; 
     try { 
      cursor = queryBuilder.query(MySQLDBHelper.openDatabase(<YOUR CONTEXT>), projection, selection, selectionArgs, null, null, sortOrder); 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
return cursor; 

Suivant lorsque vous décidez d'accéder aux valeurs du curseur, vous pouvez faire des contrôles de sécurité au lieu de directement les accès. Il peut être plutôt verbeux, donc je vous recommande de créer une méthode qui crée votre objet à partir du curseur, puis de faire toutes vos vérifications null null là-bas.

Au lieu de:

mCursor.getString(mCursor.getColumnIndex(WorkersContract.Columns.IBU_KANDUNG))); 

faire quelque chose comme:

int IBU_KANDUNG_INDEX = mCursor.getColumnIndex(WorkersContract.Columns.IBU_KANDUNG); 
myObject.setString(mCursor.getString(IBU_KANDUNG_INDEX) == null ? "" : mCursor.getString(IBU_KANDUNG_INDEX)); 

Cela vous permettra de ne définissez pas les valeurs NULL dans votre objet ou tenter d'accéder -1 index d'un curseur qui est vide .

+0

Merci pour votre réponse rapide, j'ai édité ma question avec xml et classe d'adaptateur. –

+0

Désolé aurait pu répondre ici, pouvez-vous obtenir un peu plus sur le côté erreur pour moi. L'erreur de gonfleur n'a pas réussi à créer votre élément d'interface utilisateur, mais il existe une raison sous-jacente.Il se peut que le curseur d'échange se produise alors qu'il dessine votre première rangée ou un million d'autres raisons, mais je suis sûr qu'il y a un peu plus d'informations imbriquées dans ces journaux peut-être que nous pouvons le trouver :) – Sam

+0

J'ai encore édité ma question:) plus d'erreurs de notation –