Как применить onClick Listener к imageView в CardView - PullRequest
0 голосов
/ 25 октября 2018

Я пытаюсь настроить прослушиватель onClick, в котором у этого слушателя уже есть кнопка.Цель состоит в том, чтобы предоставить второй способ доступа к намерению (в данном случае класс «ReadActivity». Примером этого является

Вот мой код:

@Override
    public void onBindViewHolder(MyViewHolder holder, final int position) {

        holder.tv_book_title.setText(mData.get(position).getBookTitle());
        holder.tv_book_author.setText("by " + mData.get(position).getBookAuthor());
        holder.img_book_thumbnail.setImageResource(mData.get(position).getBookId());
        holder.actionButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Intent intent = new Intent(mContext, ReadActivity.class);

                // passing data to the book activity
                intent.putExtra("Id", mData.get(position).getPhotoId());
                intent.putExtra("Title", mData.get(position).getBookTitle());
                intent.putExtra("Author", mData.get(position).getBookAuthor());
                intent.putExtra("Description", mData.get(position).getContentUrl());
                intent.putExtra("Thumbnail", mData.get(position).getBookId());
                // start the activity
                mContext.startActivity(intent);
            }
        });

И этоmy cardview_item xml:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView 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:id="@+id/card_view"
    android:layout_width="match_parent"
    android:layout_height="@dimen/card_height"
    android:layout_gravity="center"
    android:layout_marginBottom="@dimen/md_keylines"
    android:layout_marginLeft="@dimen/md_keylines"
    android:layout_marginRight="@dimen/md_keylines"
    android:foreground="?attr/selectableItemBackground">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <ImageView
            android:id="@+id/book_img_id"
            **android:onClick="imageClick"**
            android:layout_width="match_parent"
            android:layout_height="@dimen/card_image_height"
            android:scaleType="centerCrop"
            android:contentDescription="@string/todo" />

        <TextView
            android:id="@+id/book_title_id"
            android:layout_width="match_parent"
            android:layout_height="@dimen/card_title_height"
            android:layout_alignBottom="@+id/book_img_id"
            android:layout_marginStart="@dimen/md_keylines"
            android:textAppearance="@style/TextAppearance.AppCompat.Title"
            android:textColor="@color/white" />

        <TextView
            android:id="@+id/book_author_id"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@+id/book_img_id"
            android:layout_marginLeft="@dimen/md_keylines"
            android:layout_marginTop="@dimen/md_keylines"
            android:layout_marginBottom="@dimen/md_keylines"
            android:layout_marginRight="@dimen/md_keylines"
            android:ellipsize="end"
            android:singleLine="true"
            android:textColor="@color/dark_grey"
            android:textSize="@dimen/article_subheading" />

        <Button
            android:id="@+id/action_button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@+id/book_author_id"
            style="?android:attr/borderlessButtonStyle"
            android:textColor="?attr/colorPrimary"
            android:text="@string/read" />

    </RelativeLayout>
</android.support.v7.widget.CardView>

В xml я попытался установить строку onClick, но я не уверен, как настроить прослушиватель onClick. Есть ли способ сделать это, не затрагивая исходный код? Или было бы проще скопировать в actionButton.setOnClickListener и просто изменить настройку держателя на миниатюру?

1 Ответ

0 голосов
/ 25 октября 2018

Вы не должны использовать атрибут `android: onClick" для обработки клика. Вам лучше обрабатывать его в коде, чтобы ваша компоновка и логика не были тесно связаны.

Вам необходимо использовать setOnClickListener, как в actionButtonИли вы можете немного изменить свой код для обработки клика внутри ViewHolder. Измените свой код следующим образом:

// use View.OnClickListener so that the click listener won't
// be recreated when the View is recycled
public class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
    public Button actionButton;
    public ImageView img_book_thumbnail;

    public ViewHolder(Context context, View itemView) {
        super(itemView);
        // find actionButton and img_book_thumbnail
        ...

       // Attach a click listener to both of them
        actionButton.setOnClickListener(this);
        img_book_thumbnail.setOnClickListener(this);
    }

    // Handles clicked
    @Override
    public void onClick(View view) {
      if(view.getId == R.id.action_button) {
         // do something
      } else if(view.getId == R.id.book_img_id) {
         // do something
      }
    }
}

Вместо прямой обработки клика в адаптере, вы должны делегировать обработку клика родительской операции./ фрагмент Адаптера с использованием механизма Listener / Callback.

...