【问题标题】:OnClickListener in RecyclerView having image, textRecyclerView 中的 OnClickListener 具有图像、文本
【发布时间】:2019-06-19 02:15:51
【问题描述】:

我想在单击回收器视图的对象时显示另一个活动。例如:如果我单击“dd”文本或“该行的图像”,那么我应该转到名为“AbcActivity”的活动。

它去了很多网站,看过 youtube 教程但没有帮助。请帮帮我。请帮帮我,这是我最后的希望:(

我是这方面的初学者,如果你能提供项目就太好了。

这是主要活动:

public class MainActivity extends AppCompatActivity implements WordAdapter.OnNoteListener {
    private RecyclerView recyclerView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        recyclerView = findViewById(R.id.home_view);
        LinearLayoutManager layoutManager = new LinearLayoutManager(this);
        layoutManager.setOrientation(LinearLayoutManager.VERTICAL);

        recyclerView.setLayoutManager(layoutManager);

        List<Word> wordList = new ArrayList<>();


        wordList.add(new Word(R.drawable.ic_launcher_background, "dd"));
        wordList.add(new Word(R.drawable.ic_launcher_background, "ss"));

        WordAdapter adapter = new WordAdapter(wordList, this);
        recyclerView.setAdapter(adapter);
        adapter.notifyDataSetChanged();
        }

    @Override
    public void onNoteClick(int position) {
    }
}

字适配器:

public class WordAdapter extends RecyclerView.Adapter<WordAdapter.viewholder> {

    private List<Word> wordList;
    private OnNoteListener mOnNoteListener;

    public WordAdapter(List<Word> wordList, OnNoteListener onNoteListener) {
        this.wordList = wordList;
        this.mOnNoteListener = onNoteListener;
    }

    @NonNull
    @Override
    public viewholder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.list_items, viewGroup, false);
        return new viewholder(view, mOnNoteListener);
    }

    @Override
    public void onBindViewHolder(@NonNull viewholder viewholder, int position) {
        int resource = wordList.get(position).getImageResource();
        String title = wordList.get(position).getTitle();
        viewholder.setData(resource, title);
    }

    @Override
    public int getItemCount() {
        return wordList.size();
    }

    class viewholder extends RecyclerView.ViewHolder implements View.OnClickListener{

        private ImageView imageView;
        private TextView title;

        OnNoteListener onNoteListener;
        public viewholder(@NonNull View itemView, OnNoteListener onNoteListener) {
            super(itemView);

            imageView = itemView.findViewById(R.id.image);
            title = itemView.findViewById(R.id.word);
            this.onNoteListener = onNoteListener;

            itemView.setOnClickListener(this);
        }

        private void setData(int resource, String titleText){
            imageView.setImageResource(resource);
            title.setText(titleText);
        }

        @Override
        public void onClick(View view) {
            onNoteListener.onNoteClick(getAdapterPosition());
        }
    }

    public interface OnNoteListener {
        void onNoteClick(int position);
    }
}

这是一个词:

public class Word implements Parcelable {

   private int imageResource;
   private String title;

    public Word(int imageResource, String title) {
        this.imageResource = imageResource;
        this.title = title;
    }

    protected Word(Parcel in) {
        imageResource = in.readInt();
        title = in.readString();
    }

    public static final Creator<Word> CREATOR = new Creator<Word>() {
        @Override
        public Word createFromParcel(Parcel in) {
            return new Word(in);
        }

        @Override
        public Word[] newArray(int size) {
            return new Word[size];
        }
    };

    public int getImageResource() {
        return imageResource;
    }

    public String getTitle() {
        return title;
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel parcel, int i) {
        parcel.writeInt(imageResource);
        parcel.writeString(title);
    }
}

【问题讨论】:

  • onNoteClick() 方法的实现在哪里??
  • 让你的viewholder类实现接口方法。然后根据适配器的位置选择你想要去的活动
  • 嗨 Jeeva,我是这个领域的初学者,你能提供我在回收站视图中通过添加图像和文本以及 OnCreate 方法制作的项目吗?请问?

标签: java android android-intent android-recyclerview onclicklistener


【解决方案1】:

您的代码可以正常工作。不知道是什么问题。也许您在开始新活动时遇到问题,但这段代码肯定没有问题。 我将在您的示例下方发布对 ViewHolder 的小修改。

    public class MainActivity extends AppCompatActivity implements WordAdapter.OnNoteListener {
    private RecyclerView recyclerView;
    private static final String TAG = MainActivity.class.getCanonicalName();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        recyclerView = findViewById(R.id.home_view);
        LinearLayoutManager layoutManager = new LinearLayoutManager(this);
        layoutManager.setOrientation(LinearLayoutManager.VERTICAL);

        recyclerView.setLayoutManager(layoutManager);

        List<Word> wordList = new ArrayList<>();


        wordList.add(new Word(R.drawable.ic_launcher_background, "dd"));
        wordList.add(new Word(R.drawable.ic_launcher_background, "ss"));
        wordList.add(new Word(R.drawable.ic_launcher_background, "cc"));


        WordAdapter adapter = new WordAdapter(this);
        recyclerView.setAdapter(adapter);
        adapter.addItems(wordList);
    }

    @Override
    public void onNoteClick(int position) {
        Log.d(TAG, "clicked on the position:" + position);
    }
}

    public class WordAdapter extends RecyclerView.Adapter<WordAdapter.ViewHolder> {

    private List<Word> wordList;
    private OnNoteListener mOnNoteListener;

    public WordAdapter(List<Word> wordList, OnNoteListener onNoteListener) {
        this.wordList = wordList;
        this.mOnNoteListener = onNoteListener;
    }

    public WordAdapter(OnNoteListener onNoteListener) {
        this(new ArrayList<Word>(), onNoteListener);
    }

    public void addItems(List<Word> items) {
        wordList.addAll(items);
        notifyDataSetChanged();
    }

    public void clear() {
        wordList.clear();
        notifyDataSetChanged();
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.list_items, viewGroup, false);
        return new ViewHolder(view, mOnNoteListener);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder viewholder, int position) {
        int resource = wordList.get(position).getImageResource();
        String title = wordList.get(position).getTitle();
        viewholder.setData(resource, title);
    }

    @Override
    public int getItemCount() {
        return wordList.size();
    }

    static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

        private ImageView imageView;
        private TextView title;

        private OnNoteListener onNoteListener;

        public ViewHolder(@NonNull View itemView, OnNoteListener onNoteListener) {
            super(itemView);

            imageView = itemView.findViewById(R.id.imageView);
            title = itemView.findViewById(R.id.word);
            this.onNoteListener = onNoteListener;

            itemView.setOnClickListener(this);
        }

        private void setData(int resource, String titleText) {
            imageView.setImageResource(resource);
            title.setText(titleText);
        }

        @Override
        public void onClick(View view) {
            onNoteListener.onNoteClick(getAdapterPosition());
        }
    }

    public interface OnNoteListener {
        void onNoteClick(int position);
    }
}


词类保持不变。
现在,关于 xml,我在下面放了一些快速的东西(list_item.xml):

    <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/md_green_100"
    android:orientation="horizontal"
    android:layout_marginTop="4dp"
    android:layout_marginBottom="4dp">

    <TextView
        android:id="@+id/word"
        android:layout_width="86dp"
        android:layout_height="36dp"
        android:layout_marginStart="8dp"

        android:gravity="center"
        android:text="Word 1"
        android:textSize="16sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toStartOf="@+id/imageView"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="120dp"
        android:layout_height="160dp"
        android:layout_marginStart="8dp"
        android:layout_marginEnd="8dp"
        android:background="@drawable/ic_launcher_background"
        android:contentDescription="Icon"

        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toEndOf="@+id/word"
        app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>


您可以在下面找到点击事件的屏幕截图。


现在,知道点击事件可以为所欲为,startActivity、Log 等。

【讨论】:

  • 非常感谢 Andrei,能再帮我解决一个问题吗?请假设当我单击列表中的单词“dd”时,我想导航到名为“abc”的活动我该怎么办?你能给我代码并说我应该把它放在哪里吗?请?请问?
  • 你问了一个问题,我回答了。现在,如果你想学习,有些事情你应该自己尝试。正如你所看到的,没有人给你项目,因为在这里你得到的帮助不是整个项目要复制。
  • 您可以提出第二个问题并在此处放置链接或等待其他人回答。
  • @Rajana ,如果代码运行良好,则接受答案。
  • 我真的很想了解具体的(针对每个列表)ClickListener,但主要问题是我找不到任何可靠的来源,其中一些已经过时,而另一些则不是我所期望的。我还在 Udacity,android 的 codelabs 中进行了搜索,但可以找到我所期望和不了解的 android 网站。由于我是初学者,所以我自己并没有太多的想法:(。请给我建议任何学习链接。我已经 17 岁左右开始了这次旅行。
【解决方案2】:

您可以为您的viewHolderitemView 设置一个OnClickListener

这将在您单击viewholderimageView 时启动AbcActivity

    @Override
    public void onBindViewHolder(@NonNull viewholder viewholder, int position) {
        int resource = wordList.get(position).getImageResource();
        String title = wordList.get(position).getTitle();
        viewholder.setData(resource, title);

        // @ADDED
        // viewholder.itemView or viewholder.title will work too
        viewholder.imageView.setOnClickListener(new View.OnClickListener() {
            @Override
            void onClick(View v) {
                // start activity

                Context context = viewHolder.itemView.getContext();              
                Intent intent = new Intent(context, AbcActivity.class);
                context.startActivity(intent);
            }
        });
    }

【讨论】:

  • 它不工作,请你给我一个项目好吗?
  • 不是在启动AbcActivity吗?您是否尝试过测试单击图像是否会触发 onClick 块。
  • 是的,我试过了,没用 :-( Andrei 提供的代码工作正常,并显示在 logcat 中单击的列表,您能否建议如何用意图替换 logcat,以便我可以导航到当我单击列表的特定对象时的另一个活动?
【解决方案3】:

您几乎完成了所有工作。

剩下的只是处理你传递给适配器的监听器在活动中通知你的点击事件。

改变

@Override
public void onNoteClick(int position) {


}    

到这里

@Override
public void onNoteClick(int position) {
   Intent intent = new Intent(context, AbcActivity.class);
   context.startActivity(intent);
}

在你的活动中

【讨论】:

  • Intent intent = new Intent(this, AbcActivity.class);
  • 谢谢 Sajal Gupta 先生,它成功了。能否请您告诉我如何单击每个列表视图并转到我想要的其他活动,以免假设我单击的列表是“ss”而我想转到名为“sgActivity”的活动?
  • 嘿@Rajana,您可以将侦听器的签名编辑为类似 void onNoteClick(int position, String title) 的内容,然后传递相关信息以最终在活动的侦听器实现中使用它来打开所需的活动。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-23
  • 1970-01-01
相关资源
最近更新 更多