0

안녕하세요 this 라이브러리를 사용하여 CursorLoader로 RecyclerView를 구현하고 있습니다. 그것은 올바르게 작동하지만 내가 원하는 것은 RecyclerView 항목을 클릭 할 때 커서를 얻는 것입니다. 이 ListView에 있었다면CursorLoader를 사용할 때 RecyclerView 항목에서 커서를 가져 오는 중

나는 쉽게

ListView에 대해서 itemClick에서
Cursor cursor = (Cursor) listView.getAdapter.getItem(position); 

으로 커서를 얻을 수;

하지만 RecyclerView에서도 동일한 작업을 수행 할 수 없습니다. 이 작업을 수행하는 방법?

가 나는 시도했다 :

public class MovieAdapter extends RecyclerViewCursorAdapter<MovieAdapter.MovieViewHolder>{ 

/** 
* Column projection for the query to pull Movies from the database. 
*/ 
public static final String[] MOVIE_COLUMNS = new String[] { 
     MovieContract.MovieEntry.TABLE_NAME + "." + MovieContract.MovieEntry._ID, 
     MovieContract.MovieEntry.COLUMN_NAME 
}; 

/** 
* Index of the name column. 
*/ 
private static final int NAME_INDEX = 1; 

/** 
* Constructor. 
* @param context The Context the Adapter is displayed in. 
*/ 
public MovieAdapter(Context context) { 
    super(context); 

    setupCursorAdapter(null, 0, R.layout.list_item_movie, false); 
} 

/** 
* Returns the ViewHolder to use for this adapter. 
*/ 
@Override 
public MovieViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    return new MovieViewHolder(mCursorAdapter.newView(mContext, mCursorAdapter.getCursor(), parent)); 
} 

/** 
* Moves the Cursor of the CursorAdapter to the appropriate position and binds the view for 
* that item. 
*/ 
@Override 
public void onBindViewHolder(MovieViewHolder holder, int position) { 
    // Move cursor to this position 
    mCursorAdapter.getCursor().moveToPosition(position); 

    // Set the ViewHolder 
    setViewHolder(holder); 

    // Bind this view 
    mCursorAdapter.bindView(null, mContext, mCursorAdapter.getCursor()); 
} 

/** 
* ViewHolder used to display a movie name. 
*/ 
public class MovieViewHolder extends RecyclerViewCursorViewHolder { 
    public final TextView mMovieName; 

    public MovieViewHolder(View view) { 
     super(view); 

     mMovieName = (TextView) view.findViewById(R.id.movie_name); 

    } 

    @Override 
    public void bindCursor(Cursor cursor) { 
     mMovieName.setText(cursor.getString(NAME_INDEX)); 
     mMovieName.setTag(mCursorAdapter.getCursor()); 
     mMovieName.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if(v.getTag()!=null){ 
        Cursor cursorTag = (Cursor)v.getTag(); 

        **//Here I get last item's name in every item click using both cursorTag and cursor.** 
        Toast.makeText(mContext, "SSSSS "+cursor.getString(NAME_INDEX),Toast.LENGTH_SHORT).show(); 
       } 
      } 
     }); 

    } 
    } 
} 

답변

1

어댑터는 보호 된 멤버 변수 mCursor 있습니다. 당신은 특정 라이브러리가 실제 솔루션보다 해킹의 더 인 CursorAdapter를 제공하지만

if (mCursor != null) { 
    mCursor.moveToPosition(position) 
    //TODO: handle your functionality here (i.e. mCursor now points to the correct item) 
} 

으로 예상 커서를 검색하려면이 옵션을 사용할 수 있습니다. RecyclerExt과 같이 ListView CursorAdapter에 실제 기능을 넘겨주는 대신 모든 것을 제어하는 ​​라이브러리를 사용하는 것이 좋습니다.

+0

mCursorAdapter.getCursor(). moveToPosition (pos); 내부 onClick inBindViewHolder 트릭을 했어! 내 대답을 참조하십시오. –

1

다음은 @ RocketSpock의 대답에 따라 해결 한 방법입니다.

@Override 
public void onBindViewHolder(MovieViewHolder holder, int position) { 
    // Move cursor to this position 
    mCursorAdapter.getCursor().moveToPosition(position); 

    // Set the ViewHolder 
    setViewHolder(holder); 

    // Bind this view 
    mCursorAdapter.bindView(null, mContext, mCursorAdapter.getCursor()); 
    holder.view.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      mCursorAdapter.getCursor().moveToPosition(position); 
      Toast.makeText(mContext, "SSSSS "+mCursorAdapter.getCursor() 
        .getString(NAME_INDEX),Toast.LENGTH_SHORT).show(); 
     } 
    }); 

} 

/** 
* ViewHolder used to display a movie name. 
*/ 
public class MovieViewHolder extends RecyclerViewCursorViewHolder { 
    public final TextView mMovieName; 
    View view; 

    public MovieViewHolder(View view) { 
     super(view); 

     this.view = view; 
     mMovieName = (TextView) view.findViewById(R.id.movie_name); 
    } 

    @Override 
    public void bindCursor(Cursor cursor) { 
     mMovieName.setText(mCursorAdapter.getCursor().getString(NAME_INDEX)); 

    } 

} 
관련 문제