【问题标题】:setOnClickListener - how to pass in AdapterView<?> in onClicksetOnClickListener - 如何在 onClick 中传入 AdapterView<?>
【发布时间】:2016-04-19 02:15:50
【问题描述】:

更新:我修改了我原来的问题,因为它太模糊了。

我刚刚实现了一个 RecyclerView,现在我想让每个项目都可点击,这样当我点击一个项目时,它会带我到 DetailsActivity(用于手机和平板电脑),在那里我可以找到有关该项目的更多信息。

我能够在实现 recyclerview 之前执行此操作,因为我只有一个 gridview,我在其中调用 mGridView.setOnItemClickListener。

这是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;
    }
.....

}

现在我有了 recyclerview,看起来我不能再调用 mGridView.setOnItemClickListener,因为 Recyclerview 没有这个方法。看起来我可以调用 setOnClickListener 但我不确定如何在 BookCursorAdapter 中实现它:

这是我的代码 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);
        }


    }

}

【问题讨论】:

    标签: android android-fragments android-recyclerview android-cursoradapter android-cursor


    【解决方案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();
    }
    
    }
    

    【讨论】:

    • 嗨@Kuffs 感谢您的回复。我不确定如何做到这一点,因为我目前在我的 onBindViewHolder 方法中传入一个 Cursor,如下所示: public void onBindViewHolder(ViewHolder viewHolder, Cursor cursor){ DatabaseUtils.dumpCursor(cursor); int imageIndex = cursor.getColumnIndex(BookColumns.COLUMN_IMAGEPATH);字符串图像 = cursor.getString(imageIndex); } }
    • 我的回答只是一个例子。您将根据您的特定需求对其进行定制。我的意思是您将侦听器设置在错误的位置。
    • 谢谢@Kuffs。刚刚尝试实施您的建议,但我有点茫然,因为我仍然无法弄清楚如何返回光标。在我之前的代码中,我返回一个游标,因为我这样调用 parent.getItemAtPosition:Cursor cursor = (Cursor) parent.getItemAtPosition(getAdapterPosition());
    • 我的编辑有帮助吗?抱歉,如果我直接键入时其中有错误,但它应该让您了解我的建议,即通过其构造函数将光标传递到适配器,然后操作适配器内的数据。
    • 嗨@Kuffs 非常感谢您提供更多详细信息。我试过了,但它没有用,因为它要求我实现 onBindViewHolder(ViewHolder viewHolder, Cursor cursor) 方法。我提供了更多背景信息并更新了我的问题,以便这次更清楚。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-16
    • 1970-01-01
    • 1970-01-01
    • 2021-12-02
    • 2017-11-02
    相关资源
    最近更新 更多