【问题标题】:i am trying to create a click listener that will open a new activity once it it clicked我正在尝试创建一个单击侦听器,一旦单击它就会打开一个新活动
【发布时间】:2020-04-17 09:24:03
【问题描述】:

我正在尝试使 recyclerview 可按意图点击。数据将从firebase 提取到recyclerview。但是当我运行代码时,我得到了错误cannot resolve symbolfindViewById(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;

import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.support.v7.widget.RecyclerView;



import java.util.ArrayList;
import java.util.Locale;

public class TargetDataAdapter extends RecyclerView.Adapter<TargetDataAdapter.TargetViewHolder>{

    ArrayList<AndroidTargets> targetsArrayList;
    private Context context;
   // View myClickableView;
    public TargetDataAdapter(ArrayList<AndroidTargets> mTargetData) {
        targetsArrayList = mTargetData;
    }

    @NonNull
    @Override
    public TargetViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        context = viewGroup.getContext();
        View v= LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.target_row,viewGroup,false);
        return new TargetViewHolder(v);

    }
    @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);
        View myClickableView = findViewById(R.id.linearLayout);
        //myClickableView.setClickable(true);
        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);
        });
    }

    @Override
    public int getItemCount() {
        if(targetsArrayList == null)
            return 0;
        return targetsArrayList.size();
    }

    public static class TargetViewHolder extends RecyclerView.ViewHolder {
        protected TextView androidTargetName;
        protected TextView androidTargetNumber;
        protected TextView androidTargetShortName;

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





}

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

【问题讨论】:

    标签: java android layout android-recyclerview


    【解决方案1】:

    嗨,下面一行是导致问题的原因。

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

    它应该在 itemview 中。

    【讨论】:

    • 请务必查找您在此方法中设置 findviewbyId 的 onBindAdapter 代码,但您应该在设置所有 ID 的 TargetViewHolder 中执行此操作。希望你明白了。
    【解决方案2】:

    您也需要在 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);
        });
    }
    }
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 我收到一个错误“错误:不兼容的类型:TargetViewHolder 无法转换为 OnClickListener”
      猜你喜欢
      • 2015-02-25
      • 2013-04-10
      • 1970-01-01
      • 1970-01-01
      • 2020-10-30
      • 2014-03-21
      • 1970-01-01
      • 1970-01-01
      • 2021-07-24
      相关资源
      最近更新 更多