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