Java 我正在尝试创建一个单击侦听器,它将在单击后打开一个新活动

Java 我正在尝试创建一个单击侦听器,它将在单击后打开一个新活动,java,android,layout,android-recyclerview,Java,Android,Layout,Android Recyclerview,我想让一个回收视图可以点击。数据将从firebase提取到recyclerview。但是当我运行代码时,我得到一个错误无法解析符号findViewById(int)”。这个错误发生在onBindViewHolder()的第四行。这是我的布局代码 <?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.andr

我想让一个
回收视图
可以点击。数据将从
firebase
提取到
recyclerview
。但是当我运行代码时,我得到一个错误
无法解析符号
findViewById(int)
”。这个错误发生在
onBindViewHolder()
的第四行。这是我的布局代码

<?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"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:clickable="true"
    >

    <TextView
        android:id="@+id/textView2"
        android:textColor="@color/colorPrimary"
        style="@style/Base.TextAppearance.AppCompat.Small"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:layout_marginBottom="8dp"
        android:gravity="center"
        android:text="textview"
        android:minWidth="100dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        android:clickable="true"/>

    <LinearLayout
        android:id="@+id/linearLayout"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginBottom="8dp"
        android:orientation="vertical"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toEndOf="@+id/textView2"
        app:layout_constraintTop_toTopOf="parent"
        android:clickable="true"
        >

        <TextView
            android:id="@+id/textView3"
            android:gravity="center_vertical"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textStyle="bold"
            android:layout_marginBottom="8dp"
            android:text="textview"
            android:clickable="true"/>



        <TextView
            android:layout_marginTop="8dp"
            android:id="@+id/textView4"
            android:gravity="center_vertical"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="textview"
            android:clickable="true"/>
    </LinearLayout>
</android.support.constraint.ConstraintLayout>

这是我的适配器

package com.example.helpresponse;
导入android.content.Context;
导入android.content.Intent;
导入android.os.Bundle;
导入android.support.annotation.NonNull;
导入android.support.v7.widget.RecyclerView;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.TextView;
导入android.support.v7.widget.RecyclerView;
导入java.util.ArrayList;
导入java.util.Locale;
公共类TargetDataAdapter扩展了RecyclerView.Adapter{
ArrayList targetsArrayList;
私人语境;
//查看myClickableView;
公共TargetDataAdapter(ArrayList mTargetData){
targetsArrayList=mTargetData;
}
@非空
@凌驾
public TargetViewHolder onCreateViewHolder(@NonNull ViewGroup ViewGroup,int i){
context=viewGroup.getContext();
视图v=LayoutInflater.from(viewGroup.getContext()).flate(R.layout.target_行,viewGroup,false);
返回新的TargetViewHolder(v);
}
@凌驾
BindViewHolder上的公共无效(@NonNull TargetViewHolder viewHolder,int i){
viewHolder.androidTargetName.setText(targetsArrayList.get(i.FIELD1));
viewHolder.androidTargetNumber.setText(String.format(Locale.getDefault(),“API级别:%d”,targetsArrayList.get(i.FIELD2));
viewHolder.androidTargetShortName.setText(targetsArrayList.get(i.FIELD3));
查看myClickableView=findViewById(R.id.linearLayout);
//myClickableView.setClickable(true);
myClickableView.setOnClickListener((v)->{
意向意向=新意向(上下文,MapsActivity.class);
int myData=1;
intent.putExtra(“myDataKey”,myData);
//更多意图。根据需要添加额外内容
背景。开始触觉(意图);
});
}
@凌驾
public int getItemCount(){
if(targetsArrayList==null)
返回0;
返回targetsArrayList.size();
}
公共静态类TargetViewHolder扩展了RecyclerView.ViewHolder{
受保护的TextView androidTargetName;
受保护的TextView androidTargetNumber;
受保护的TextView androidTargetShortName;
公共TargetViewHolder(@NonNull View itemView){
超级(项目视图);
androidTargetShortName=itemView.findViewById(R.id.textView2);
androidTargetName=itemView.findViewById(R.id.textView3);
androidTargetNumber=itemView.findViewById(R.id.textView4);
}
}
}

我想知道我做错了什么。任何帮助都将不胜感激。

行下的Hi导致了问题

View myClickableView = findViewById(R.id.linearLayout);

它应该位于itemview中。

您也需要在TargetViewHolder类中定义此“myclickableView”

public static class TargetViewHolder extends RecyclerView.ViewHolder {
    protected TextView androidTargetName;
    protected TextView androidTargetNumber;
    protected TextView androidTargetShortName;
    protected LinearLayout myClickableView;
    public TargetViewHolder(@NonNull View itemView) {
        super(itemView);
        androidTargetShortName=  itemView.findViewById(R.id.textView2);
        androidTargetName= itemView.findViewById(R.id.textView3);
        androidTargetNumber= itemView.findViewById(R.id.textView4);
        myClickableView= itemView.findViewById(R.id.linearLayout);
    }

只有这样,您才能在onBindViewHolder方法中安全地使用它

@Override
public void onBindViewHolder(@NonNull TargetViewHolder viewHolder, int i) {
    viewHolder.androidTargetName.setText(targetsArrayList.get(i).FIELD1 );
    viewHolder.androidTargetNumber.setText(String.format(Locale.getDefault(), "API Level: %d", targetsArrayList.get(i).FIELD2));
    viewHolder.androidTargetShortName.setText(targetsArrayList.get(i).FIELD3);

    //myClickableView.setClickable(true);
    viewHolder.myClickableView.setOnClickListener((v) -> {
        Intent intent = new Intent(context, MapsActivity.class);
        int myData = 1;
        intent.putExtra("myDataKey", myData);
        //more intent.putExtra(s) as needed
        context.startActivity(intent);
    });
}
}

在TargetViewHolder类中定义“myclickableView”,并使用onClickListener

public static class TargetViewHolder extends RecyclerView.ViewHolder implement View.OnClickListener{
    protected TextView androidTargetName;
    protected TextView androidTargetNumber;
    protected TextView androidTargetShortName;
    protected LinearLayout myClickableView;
    public TargetViewHolder(@NonNull View itemView) {
        super(itemView);
        androidTargetShortName=  itemView.findViewById(R.id.textView2);
        androidTargetName= itemView.findViewById(R.id.textView3);
        androidTargetNumber= itemView.findViewById(R.id.textView4);
        myClickableView= itemView.findViewById(R.id.linearLayout);
        myClickableView.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.linearLayout:
                //Do whatever you want
                break;
        }
    }
}

确实要在BindAdapter代码中查找您正在该方法中设置findviewbyId,但您应该在设置所有ID的TargetViewHolder中执行此操作。希望您能理解这一点。我收到一个错误“错误:不兼容的类型:TargetViewHolder无法转换为OnClickListener”
public static class TargetViewHolder extends RecyclerView.ViewHolder implement View.OnClickListener{
    protected TextView androidTargetName;
    protected TextView androidTargetNumber;
    protected TextView androidTargetShortName;
    protected LinearLayout myClickableView;
    public TargetViewHolder(@NonNull View itemView) {
        super(itemView);
        androidTargetShortName=  itemView.findViewById(R.id.textView2);
        androidTargetName= itemView.findViewById(R.id.textView3);
        androidTargetNumber= itemView.findViewById(R.id.textView4);
        myClickableView= itemView.findViewById(R.id.linearLayout);
        myClickableView.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.linearLayout:
                //Do whatever you want
                break;
        }
    }
}