0

Mise à jour: J'ai révisé ma question initiale parce qu'elle était trop vague.setOnClickListener - comment passer dans AdapterView <?> dans onClick

Je viens de mettre en place un RecyclerView et maintenant je veux rendre chaque élément cliquable, de sorte que lorsque je clique sur un élément, il m'amène à DetailsActivity (pour téléphone et tablette) où je peux trouver plus d'informations sur l'article .

J'étais capable de faire ceci avant d'implémenter un recyclerview parce que tout ce que j'avais était un gridview où j'appelais mGridView.setOnItemClickListener.

Voici le code avant recyclerview:

public class BookFragment extends Fragment implements LoaderManager.LoaderCallbacks<Cursor> { 

    .... 
    ..... 

    public interface CallbackInterface { 
     /** 
     * DetailFragmentCallback for when an item has been selected. 
     */ 
     public void onItemSelected(Uri bookUri); 
    } 


    .... 
    ..... 


    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 

     final View rootView = inflater.inflate(R.layout.fragment_main, container, false); 


     // initialize our BookAdapter 
     mBookAdapter = new BookAdapter(getActivity(), null, 0, CURSOR_LOADER_ID); 
     // initialize mGridView to the GridView in fragment_main.xml 
     mGridView = (GridView) rootView.findViewById(R.id.Book_grid); 
     // set mGridView adapter to our CursorAdapter 
     mGridView.setAdapter(mBookAdapter); 

     // make each item clickable 
     mGridView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 

       int uriId = position + 1; 

       Uri uri = ContentUris.withAppendedId(BookContentProvider.Book.CONTENT_URI, 
         uriId); 

       Cursor cursor = (Cursor) parent.getItemAtPosition(position); 
       if (cursor != null) { 

        ((CallbackInterface) getActivity()) 
          .onItemSelected(BookContentProvider.Book.withId(cursor.getLong(0))); // getlong(0) gets the row ID 
       } 
      } 
     }); 


     return rootView; 
    } 
..... 

} 

Maintenant que j'ai recyclerview il semble que je ne peux pas appeler plus mGridView.setOnItemClickListener, comme Recyclerview n'a pas cette méthode. On dirait que je peux appeler setOnClickListener mais je ne sais pas comment je peux mettre en œuvre dans mon BookCursorAdapter:

Voici mon code BookCursorAdapter:

public class BookCursorAdapter extends CursorRecyclerViewAdapter<BookCursorAdapter.ViewHolder> { 

    private static final String LOG_TAG = BookCursorAdapter.class.getSimpleName(); 
    private static Context mContext; 
    private ViewHolder mVh; 


    public BookCursorAdapter(Context context, Cursor cursor) { 
     super(context, cursor); 
     mContext = context; 
    } 

    public static class ViewHolder extends RecyclerView.ViewHolder { 
     public final View mView; 
     public final ImageView imageView; 

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

      mView = view; 
      imageView = (ImageView) view.findViewById(R.id.list_item_book_imageview); 

     } 

    } 


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


    @Override 
    public void onBindViewHolder(ViewHolder viewHolder, Cursor cursor) { 

     DatabaseUtils.dumpCursor(cursor); 

     int imageIndex = cursor.getColumnIndex(BookColumns.COLUMN_IMAGEPATH); 
     String image = cursor.getString(imageIndex); 
     if (image != null) { 
      Picasso.with(viewHolder.imageView.getContext()) 
        .load("http://image.tmdb.org/t/p/w400/" + image) 
        .resize(600, 800) 
        .centerCrop() 
        .into(viewHolder.imageView); 
     } 


    } 

} 

Répondre

1
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.VH> { 

private Cursor cursor; 

public MyAdapter(Cursor c) { 
    cursor = c; 
} 

// View Holder 
public static class VH extends RecyclerView.ViewHolder { 

    public TextView _textView; 
    public ImageView _icon; 

    public VH(View v) { 
     super(v); 
     _textView = (TextView) v.findViewById(android.R.id.text1); 
     _icon = (ImageView) v.findViewById(android.R.id.icon); 
    } 

} 


@Override 
public MyAdapter.VH onCreateViewHolder(ViewGroup parent, int viewType) { 
    // inflate the layout and create a new ViewHolder with it. 
    final LayoutInflater inflater = LayoutInflater.from(parent.getContext()); 
    final View v = inflater.inflate(R.layout.baseitem, parent, false); 
    return new VH(v); 
} 

@Override 
public void onBindViewHolder(final VH holder, int position) { 
    // This is called whenever the RecyclerView needs to bind data to the viewholders. 
    // This will happen continuously whilst scrolling. 
    // Viewholders scrolled off screen are likely to be reused. 
    // so make sure you reset any values in it to the defaults. 

    cursor.moveToPosition(position); 

    holder._textView.setText(cursor.getString(cursor.getColumnIndex("MyStringData"))); 
    holder._icon.setImageResource(R.drawable.icv_arrow_up); 

    holder._icon.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Log.i("TAG", holder._textView.getText().toString() + " was pressed"); 
     } 
    }); 
} 

@Override 
public int getItemCount() { 
    return cursor.getCount(); 
} 

} 
+0

Salut @Kuffs merci pour la réponse. Je ne suis pas sûr comment je peux faire cela comme je passe actuellement dans un Cursor dans ma méthode onBindViewHolder comme ceci: public void onBindViewHolder (ViewHolder viewHolder, Curseur curseur) { DatabaseUtils.dumpCursor (curseur); int imageIndex = cursor.getColumnIndex (BookColumns.COLUMN_IMAGEPATH); String image = cursor.getString (imageIndex); } } –

+0

Ma réponse est un exemple seulement. Vous l'adapteriez à vos besoins spécifiques. Mon point était que vous définissez l'auditeur au mauvais endroit. – Kuffs

+0

Merci @Kuffs. J'ai juste essayé de mettre en œuvre votre suggestion, mais je suis un peu perdu parce que je n'arrive toujours pas à comprendre comment retourner un curseur. Comme dans mon code précédent, je renvoie un curseur parce que j'appelle parent.getItemAtPosition comme ceci: Cursor cursor = (Cursor) parent.getItemAtPosition (getAdapterPosition()); –