1

RecyclerViews 및 Cursor 어댑터에 대해 this thread을 읽고 처음으로 solution을 사용하려고합니다. 나는 OnViewHolder 함수의 구현에 대해 혼란스러워한다. 나는 (ViewHolder, int) 또는 (ViewHolder, Cursor)에 의해 OnViewHolder가 호출 될 수 있음을 이해했지만 프로젝트와 함께 사용하는 방법을 모른다.CursorAdapter를 사용한 RecyclerView에 대한 의문점

이 RecyclerView와

public class FeedAdapter extends CursorAdapter { 

/* 
Etiqueta de Depuración 
*/ 
private static final String TAG = FeedAdapter.class.getSimpleName(); 

/** 
* View holder para evitar multiples llamadas de findViewById() 
*/ 
static class ViewHolder { 
    TextView titulo; 
    TextView descripcion; 

    int tituloI; 
    int descripcionI; 
} 

public FeedAdapter(Context context, Cursor c, int flags) { 
    super(context, c, flags); 

} 

public View newView(Context context, Cursor cursor, ViewGroup parent) { 
    LayoutInflater inflater = LayoutInflater.from(parent.getContext()); 

    View view = inflater.inflate(R.layout.item_layout, null, false); 

    ViewHolder vh = new ViewHolder(); 

    // Almacenar referencias 
    vh.titulo = (TextView) view.findViewById(R.id.titulo); 
    vh.descripcion = (TextView) view.findViewById(R.id.descripcion); 

    // Setear indices 
    vh.tituloI = cursor.getColumnIndex(ScriptDatabase.ColumnEntradas.TITULO); 
    vh.descripcionI = cursor.getColumnIndex(ScriptDatabase.ColumnEntradas.DESCRIPCION); 

    view.setTag(vh); 

    return view; 
} 

public void bindView(View view, Context context, Cursor cursor) { 

    final ViewHolder vh = (ViewHolder) view.getTag(); 

    // Setear el texto al titulo 
    vh.titulo.setText(cursor.getString(vh.tituloI)); 

    // Obtener acceso a la descripción y su longitud 
    vh.descripcion.setText(descripcion); 

} 
} 

내 새 어댑터 내 원래 어댑터입니다. OnBindViewHolder는 설정 방법을 모르기 때문에 미완성입니다.

public class RVAdapter extends CursorRecyclerViewAdapter<RVAdapter.ViewHolder>{ 
private Cursor mCursorAdapter; 

public RVAdapter(Context context, Cursor cursor){ 
    super(context,cursor); 
} 

public static class ViewHolder extends RecyclerView.ViewHolder { 
    CardView cv; 
    TextView titulo; 
    TextView descripcion; 

    int tituloI; 
    int descripcionI; 

    public ViewHolder (View view){ 
     super(view); 
     cv = (CardView) itemView.findViewById(R.id.cv); 
     titulo = (TextView) itemView.findViewById(R.id.titulo); 
     descripcion = (TextView) itemView.findViewById(R.id.descripcion); 
    } 
} 

@Override 
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View itemView = LayoutInflater.from(parent.getContext()) 
      .inflate(R.layout.item_layout, parent, false); 
    ViewHolder vh = new ViewHolder(itemView); 
    return vh; 
} 

@Override 
public void onBindViewHolder(ViewHolder viewHolder, int position) { 
    mCursorAdapter.moveToPosition(position); 

    final ViewHolder vh = (ViewHolder) view.getTag(); 

} 
} 

나는 "onBindViewHolder (ViewHolder viewHolder, 커서 커서)"이 경우에 사용할 수 있습니까? 어떻게 작동시킬 수 있습니까?

EDIT 1

이 당신은 아래 처럼보기와 필드를 액세스 할 수 ViewHolder와 위치를 사용할 수 있습니다

답변

1

내 RVAdapter

public abstract class CursorRecyclerViewAdapter<VH extends RecyclerView.ViewHolder> extends RecyclerView.Adapter<VH> { 

private Context mContext; 

private Cursor mCursor; 

private boolean mDataValid; 

private int mRowIdColumn; 

private DataSetObserver mDataSetObserver; 

public CursorRecyclerViewAdapter(Context context, Cursor cursor) { 
    mContext = context; 
    mCursor = cursor; 
    mDataValid = cursor != null; 
    mRowIdColumn = mDataValid ? mCursor.getColumnIndex("_id") : -1; 
    mDataSetObserver = new NotifyingDataSetObserver(); 
    if (mCursor != null) { 
     mCursor.registerDataSetObserver(mDataSetObserver); 
    } 
} 

public Cursor getCursor() { 
    return mCursor; 
} 

@Override 
public int getItemCount() { 
    if (mDataValid && mCursor != null) { 
     return mCursor.getCount(); 
    } 
    return 0; 
} 

@Override 
public long getItemId(int position) { 
    if (mDataValid && mCursor != null && mCursor.moveToPosition(position)) { 
     return mCursor.getLong(mRowIdColumn); 
    } 
    return 0; 
} 

@Override 
public void setHasStableIds(boolean hasStableIds) { 
    super.setHasStableIds(true); 
} 

public abstract void onBindViewHolder(VH viewHolder, Cursor cursor); 

@Override 
public void onBindViewHolder(VH viewHolder, int position) { 
    if (!mDataValid) { 
     throw new IllegalStateException("this should only be called when the cursor is valid"); 
    } 
    if (!mCursor.moveToPosition(position)) { 
     throw new IllegalStateException("couldn't move cursor to position " + position); 
    } 
    onBindViewHolder(viewHolder, mCursor); 
} 

/** 
* Change the underlying cursor to a new cursor. If there is an existing cursor it will be 
* closed. 
*/ 
public void changeCursor(Cursor cursor) { 
    Cursor old = swapCursor(cursor); 
    if (old != null) { 
     old.close(); 
    } 
} 

/** 
* Swap in a new Cursor, returning the old Cursor. Unlike 
* {@link #changeCursor(Cursor)}, the returned old Cursor is <em>not</em> 
* closed. 
*/ 
public Cursor swapCursor(Cursor newCursor) { 
    if (newCursor == mCursor) { 
     return null; 
    } 
    final Cursor oldCursor = mCursor; 
    if (oldCursor != null && mDataSetObserver != null) { 
     oldCursor.unregisterDataSetObserver(mDataSetObserver); 
    } 
    mCursor = newCursor; 
    if (mCursor != null) { 
     if (mDataSetObserver != null) { 
      mCursor.registerDataSetObserver(mDataSetObserver); 
     } 
     mRowIdColumn = newCursor.getColumnIndexOrThrow("_id"); 
     mDataValid = true; 
     notifyDataSetChanged(); 
    } else { 
     mRowIdColumn = -1; 
     mDataValid = false; 
     notifyDataSetChanged(); 
     //There is no notifyDataSetInvalidated() method in RecyclerView.Adapter 
    } 
    return oldCursor; 
} 

private class NotifyingDataSetObserver extends DataSetObserver { 
    @Override 
    public void onChanged() { 
     super.onChanged(); 
     mDataValid = true; 
     notifyDataSetChanged(); 
    } 

    @Override 
    public void onInvalidated() { 
     super.onInvalidated(); 
     mDataValid = false; 
     notifyDataSetChanged(); 
     //There is no notifyDataSetInvalidated() method in RecyclerView.Adapter 
    } 
} 

}을 확장하는 추상 클래스입니다 :

@Override 
    public void onBindViewHolder(ViewHolder viewHolder, final int position) { 
     StructName name = names.get(position); 
     viewHolder.txttitle.setText(name.title); 
     viewHolder.rootItem.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

      } 
     }); 

    } 

도움이된다면 커서를 사용하는 것보다 더 쉽습니다. 알아 두십시오.

+0

내 연기로 불편을 끼쳐 드려 죄송합니다. CursorRecyclerViewAdapter가 커서를 사용하여 onBindViewHolder를 구현해야한다는 것을 알았지 만 커서 변수로 위치를 이동하는 방법을 얻지 못합니다. 어떤 생각? 귀하의 흥미로운 답변을 많이 주셔서 고맙습니다 – mhkore

+0

추상 함수 CursorRecyclerView로 원래 게시물을 편집했습니다 – mhkore

1

더 효율적인 메모리이므로 커서를 사용하십시오.

@Override 
public void onBindViewHolder(ViewHolder viewHolder, int position) { 
    mCursorAdapter.moveToPosition(position); 
    viewHolder.titulo.setText(mCursorAdapter.getString(mCursorAdapter.getColumnIndex(ScriptDatabase.ColumnEntradas.TITULO))); 
    viewHolder.descripcion.setText(mCursorAdapter.getString(mCursorAdapter.getColumnIndex(ScriptDatabase.ColumnEntradas.DESCRIPCION))); 
} 
+0

커서를 사용하면 위치는 int가 될 수 없지만 커서 유형과 moveToPostion은 int 변수와 함께 사용해야합니다. 커서 유형으로 위치를 이동하려면 어떻게해야합니까? 공개 무효 onBindViewHolder (ViewHolder viewHolder, 커서 커서) – mhkore

+0

내가 말한 것은 클래스 (이미 완료 한 것, mCursorAdapter 멤버)에 커서 클래스 멤버를 사용하고 객체의 배열/목록을 HPbyP로 사용하지 않는다는 것입니다. 제안. "names.get (위치);" 그는 당신이 목록 반원을 가지고 있음을 암시한다. 이와 같은 솔루션을 사용하지 말고 대신 mCursorAdapter를 사용하십시오. RVAdapter.onBindViewHolder 메서드의 경우 해당 서명은 public void onBindViewHolder (ViewHolder, int) 여야합니다. – kws