Android 如何为recycler视图的每个列表项(每行)设置onClickListener,为列表的不同对象设置不同的活动

Android 如何为recycler视图的每个列表项(每行)设置onClickListener,为列表的不同对象设置不同的活动,android,android-activity,android-recyclerview,onclicklistener,onitemclicklistener,Android,Android Activity,Android Recyclerview,Onclicklistener,Onitemclicklistener,我需要为回收器视图的每个列表项设置OnClickListener 我想通过单击每个列表视图项导航到不同的活动 到目前为止,我已经设法通过回调将单击位置传递给列表中每个单击项的相同活动。但是,我想在单击列表中的项目时启动一个不同的活动 让我们假设我想单击包含文本“dd”的行,然后它应该转到名为“abc”的活动 请帮帮我。求你了 这是主要活动: public类MainActivity扩展AppCompatActivity实现WordAdapter.OnNoteListener{ 私人回收站; 私有静

我需要为回收器视图的每个列表项设置OnClickListener
我想通过单击每个列表视图项导航到不同的活动

到目前为止,我已经设法通过回调将单击位置传递给列表中每个单击项的相同活动。但是,我想在单击列表中的项目时启动一个不同的活动

让我们假设我想单击包含文本“dd”的行,然后它应该转到名为“abc”的活动

请帮帮我。求你了

这是主要活动:

public类MainActivity扩展AppCompatActivity实现WordAdapter.OnNoteListener{
私人回收站;
私有静态最终字符串标记=MainActivity.class.getCanonicalName();
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recyclerView=findViewById(R.id.home\u视图);
LinearLayoutManager layoutManager=新的LinearLayoutManager(此);
layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
recyclerView.setLayoutManager(layoutManager);
List wordList=new ArrayList();
添加(新单词(R.drawable.ic_launcher_background,“dd”);
添加(新单词(R.drawable.ic_launcher_background,“ss”);
添加(新单词(R.drawable.ic_launcher_background,“cc”);
WordAdapter=新的WordAdapter(此);
recyclerView.setAdapter(适配器);
adapter.addItems(单词列表);
}
@凌驾
公共void onNoteClick(内部位置){
Log.d(标签,“点击位置:”+位置);
意向意向=新意向(此,abc.class);
这一点。触觉(意图);
}
}
这是名为WordAdapter的适配器:

公共类WordAdapter扩展了RecyclerView.Adapter{ 私有列表词表; 私有OnNoteListener mOnNoteListener; 公共字适配器(列表字列表、OnNoteListener、OnNoteListener){ this.wordList=wordList; this.mOnNoteListener=onNoteListener; } 公用字适配器(OnNoteListener OnNoteListener){ 这(新的ArrayList(),onNoteListener); } 公共无效附加项(列表项){ wordList.addAll(项目); notifyDataSetChanged(); } 公共空间清除(){ clear(); notifyDataSetChanged(); } @非空 @凌驾 public ViewHolder onCreateViewHolder(@NonNull ViewGroup ViewGroup,int i){ View View=LayoutInflater.from(viewGroup.getContext()).flate(R.layout.list_项,viewGroup,false); 返回新的ViewHolder(视图,mOnNoteListener); } @凌驾 public void onBindViewHolder(@NonNull ViewHolder ViewHolder,int位置){ int resource=wordList.get(position.getImageResource(); String title=wordList.get(position.getTitle(); viewholder.setData(资源、标题); } @凌驾 public int getItemCount(){ 返回wordList.size(); } 静态类ViewHolder扩展了RecyclerView.ViewHolder实现了View.OnClickListener{ 私人影像视图; 私有文本视图标题; 私有OnNoteListener OnNoteListener; public ViewHolder(@NonNull View itemView,OnNoteListener OnNoteListener){ 超级(项目视图); imageView=itemView.findViewById(R.id.imageView); title=itemView.findviewbyd(R.id.word); this.onNoteListener=onNoteListener; setOnClickListener(这个); } 私有void setData(int资源,字符串titleText){ setImageResource(资源); title.setText(titleText); } @凌驾 公共void onClick(视图){ onNoteListener.onNoteClick(getAdapterPosition()); } } 公共接口OnNoteListener{ void onNoteClick(int位置); } }
更新您的界面,将
ViewHolder
作为参数

public interface OnNoteListener {
    public void onNoteClick(ViewHolder viewHolder);    // Don't need position anymore, since you can call viewHolder.getAdapterPosition() directly.
}
有关完成此操作的完整程序,请查看所提供的@sm_happy

然后在活动的
onNoteClick()
方法中更改文本

viewHolder.textView.setText(viewHolder.textView.getText().toString() + "dd");    // Although the better option would be to instead keep a parameterized string in your resources file.

和。

您的
适配器
类将具有您的
接口
,如下所示:

public class AdapterClass extends RecyclerView.Adapter<AdapterClass.Viewholder>{

private OnItemClick onItemClick;

public NotificationAdapter(Context context) {
       onItemClick = (OnItemClick)context;
    }

public interface OnItemClick {
        void onClick(int position);
    }

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

holder.layout.setOnClickListener(v -> {
            onItemClick.onClick(position);
        });

    }
}
         public class MainActivity extends AppCompatActivity implements AdapterClass.OnItemClick {


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

                private void startNewActivity(int position){
                Intent intent = new Intent(MainActivity.this, NewActivity.class);
                //Pass your data here if required
                intent.putExtra("key_for_data", position); 

                startActivity(intent);
        }
    }

因此,我将附上完整的解决方案,因为我修改了一点原始代码

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);
    }

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

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

    static class ViewHolder extends RecyclerView.ViewHolder {

        private ImageView imageView;
        private TextView title;

        public ViewHolder(@NonNull View itemView) {
            super(itemView);

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

        private void bind(final int resource, final String titleText, final OnNoteListener listener) {
            imageView.setImageResource(resource);
            title.setText(titleText);
            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    listener.onNoteClick(titleText);
                }
            });
        }
    }

    public interface OnNoteListener {
        void onNoteClick(String dataClicked);
    }
}

我添加了一个基本的xml布局(second_activity.xml):



现在,您需要将活动注册到清单中,您应该完成了

   <aplication tag here>
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
</application>

        <activity android:name=".SecondActivity" />

可能与@sm_happy、@ahmedalijubair重复;当我在每个列表中单击时,我问如何在另一个活动中进行意图和接收,我已经完成了该问题答案中提到的所有事情。请阅读问题,并在未投票前给出他们的代码。
    public class SecondActivity extends AppCompatActivity {


    public static final String TAG = SecondActivity.class.getSimpleName();

    public static String STRING_EXTRA = "string_extra";

    private TextView textView = null;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.second_activity);
        textView = findViewById(R.id.tv_received);
        parseIntent(getIntent());
    }

    private void parseIntent(Intent intent) {
        if (intent != null) {
            Bundle extras = intent.getExtras();
            assert extras != null;
            String received = extras.getString(STRING_EXTRA);
            textView.setText(received);
        }

    }
}
 <?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 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:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".SecondActivity">

    <TextView
        android:id="@+id/tv_received"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="received from activity one"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</android.support.constraint.ConstraintLayout>
   <aplication tag here>
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
</application>

        <activity android:name=".SecondActivity" />