【问题标题】:Constructor RecyclerViewAdapter in class RecyclerViewAdapter cannot be applied to given types类 RecyclerViewAdapter 中的构造函数 RecyclerViewAdapter 不能应用于给定类型
【发布时间】:2020-06-21 16:09:07
【问题描述】:

我正在尝试使用接口方法为我的 RecyclerView CardView 项目创建 onClickListener。我是新手,据我所知,您需要有适配器类的构造函数。我已经创建了构造函数,但我仍然收到错误。当我在“RecyclerViewAdapter myrvAdapter = new RecyclerViewAdapter(NewCategory,this);”中键入“this”时,会显示“mData”而不是“onCardViewListener”。

错误:

error: constructor RecyclerViewAdapter in class RecyclerViewAdapter cannot be applied to given types;
required: Context,List<Category>,OnCardViewListener
found: ActivityTwo,ActivityTwo,ActivityTwo,List<Category>
reason: actual and formal argument lists differ in length

我在 Android Studio 中有以下 Java 代码:

RecyclerViewAdapter.java:

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.MyViewHolder> {

private Context mContext;
private List<Category> mData;
private OnCardViewListener mOnCardViewListener;

public RecyclerViewAdapter(Context mContext, List<Category> mData, OnCardViewListener onCardViewListener){
    this.mContext = mContext;
    this.mData = mData;
    this.mOnCardViewListener = onCardViewListener;
}

@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

    View view;
    LayoutInflater mInflater = LayoutInflater.from(mContext);
    view = mInflater.inflate(R.layout.cardview_items_categories,parent,false);
    return new MyViewHolder(view, mOnCardViewListener);
}

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

    holder.tv_category_title.setText(mData.get(position).getTitle());
    holder.img_category_icon.setImageResource(mData.get(position).getIcon());
}

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

public class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

    TextView tv_category_title;
    ImageView img_category_icon;
    CardView cardView;
    OnCardViewListener mOnCardViewListener;

    public MyViewHolder(View itemView, OnCardViewListener onCardViewListener){
        super(itemView);

        tv_category_title = (TextView) itemView.findViewById(R.id.category_text);
        img_category_icon = (ImageView) itemView.findViewById(R.id.category_icon);
        cardView = (CardView) itemView.findViewById(R.id.cv_nav);
        mOnCardViewListener = onCardViewListener;

        itemView.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        mOnCardViewListener.onCardViewClick(getAdapterPosition());

    }
}

public interface OnCardViewListener{
    void onCardViewClick(int position);
}

ActivityTwo.java:

public class ActivityTwo extends AppCompatActivity implements RecyclerViewAdapter.OnCardViewListener {

private static final String TAG = "ActivityTwo";

private SectionsPagerAdapter mSectionsPagerAdapter;

private ViewPager mViewPager;

List<Category> NewCategory;

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

    NewCategory = new ArrayList<>();
    NewCategory.add(new Category("Food & Beverages",R.drawable.fnb_24));
    NewCategory.add(new Category("Administration",R.drawable.admin_white_24dp));
    NewCategory.add(new Category("Faculty Blocks",R.drawable.faculty_white_24dp));
    NewCategory.add(new Category("Teaching Buildings",R.drawable.teaching_24));
    NewCategory.add(new Category("Library & Study Areas",R.drawable.library_white_24dp));
    NewCategory.add(new Category("Research Buildings",R.drawable.research_24));
    NewCategory.add(new Category("Campus Accommodations",R.drawable.accommt_white_24dp));
    NewCategory.add(new Category("Sports",R.drawable.sports_white_24dp));
    NewCategory.add(new Category("Student Association",R.drawable.sa_24dp));
    NewCategory.add(new Category("Information Services",R.drawable.it_white_24dp));
    NewCategory.add(new Category("Islamic Centre & Mosques",R.drawable.mosque_24));
    NewCategory.add(new Category("Guard Houses",R.drawable.security_24));

    RecyclerView myrv = (RecyclerView) findViewById(R.id.recylcerview_navigation);
    RecyclerViewAdapter myrvAdapter = new RecyclerViewAdapter(NewCategory,this);
    myrv.setLayoutManager(new GridLayoutManager(this,2));
    myrv.setAdapter(myrvAdapter);

    mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());

    BottomNavigationView bottomNavigationView = (BottomNavigationView) findViewById(R.id.bottom_nav_bar);

    Menu menu = bottomNavigationView.getMenu();
    MenuItem menuItem = menu.getItem(2);
    menuItem.setChecked(true);

    bottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
        @Override
        public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
            switch (menuItem.getItemId()){
                case R.id.timetable:
                    Intent intent0 = new Intent(ActivityTwo.this, MainActivity.class);
                    startActivity(intent0);
                    overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
                    break;

                case R.id.transports:
                    Intent intent1 = new Intent(ActivityTwo.this, ActivityOne.class);
                    startActivity(intent1);
                    overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
                    break;

                case R.id.navigation:
                    break;
            }
            return false;
        }
    });

}

@Override
public void onCardViewClick(int position) {
}

Category.java:

public class Category {

private String title;
private  int icon;

public Category (){
}

public Category(String title, int icon) {
    this.title = title;
    this.icon = icon;
}

public String getTitle() {
    return title;
}

public int getIcon() {
    return icon;
}

public void setTitle(String title) {
    this.title = title;
}

public void setIcon(int icon) {
    this.icon = icon;
}

【问题讨论】:

    标签: java android android-studio android-recyclerview interface


    【解决方案1】:

    解决了这个问题。以前 mContext 用于 LayoutInflater。这导致构造函数需要 3 个参数,并且由于 mContext 未在 ActivityTwo.java 中定义而出现错误。因此,通过更改我编写 LayoutInflater 代码的方式,我设法将参数数量减少到 2 个,并且代码运行良好。希望这会对构造函数和参数的新手有所帮助。

    请参阅下面的更改:

    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.cardview_items_categories, parent, false);
    

    RecyclerViewAdapter.java:

    public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.MyViewHolder> {
    
    private List<Category> mData;
    private OnCardViewListener mOnCardViewListener;
    
    public RecyclerViewAdapter(List<Category> mData, OnCardViewListener onCardViewListener){
    
        this.mData = mData;
        this.mOnCardViewListener = onCardViewListener;
    }
    
    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.cardview_items_categories, parent, false);
    }
    
    @Override
    public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
    
        holder.tv_category_title.setText(mData.get(position).getTitle());
        holder.img_category_icon.setImageResource(mData.get(position).getIcon());
    }
    
    @Override
    public int getItemCount() {
        return mData.size();
    }
    
    public class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
    
        TextView tv_category_title;
        ImageView img_category_icon;
        CardView cardView;
        OnCardViewListener mOnCardViewListener;
    
        public MyViewHolder(View itemView, OnCardViewListener onCardViewListener){
            super(itemView);
    
            tv_category_title = (TextView) itemView.findViewById(R.id.category_text);
            img_category_icon = (ImageView) itemView.findViewById(R.id.category_icon);
            cardView = (CardView) itemView.findViewById(R.id.cv_nav);
            mOnCardViewListener = onCardViewListener;
    
            itemView.setOnClickListener(this);
        }
    
        @Override
        public void onClick(View view) {
            mOnCardViewListener.onCardViewClick(getAdapterPosition());
    
        }
    }
    
    public interface OnCardViewListener{
        void onCardViewClick(int position);
    }
    

    ActivityTwo.java:

    public class ActivityTwo extends AppCompatActivity implements RecyclerViewAdapter.OnCardViewListener {
    
    private static final String TAG = "ActivityTwo";
    
    private SectionsPagerAdapter mSectionsPagerAdapter;
    
    private ViewPager mViewPager;
    
    List<Category> NewCategory;
    
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_two);
    
        NewCategory  = new ArrayList<>();
        NewCategory.add(new Category("Food & Beverages",R.drawable.fnb_24));
        NewCategory.add(new Category("Administration",R.drawable.admin_white_24dp));
        NewCategory.add(new Category("Faculty Blocks",R.drawable.faculty_white_24dp));
        NewCategory.add(new Category("Teaching Buildings",R.drawable.teaching_24));
        NewCategory.add(new Category("Library & Study Areas",R.drawable.library_white_24dp));
        NewCategory.add(new Category("Research Buildings",R.drawable.research_24));
        NewCategory.add(new Category("Campus Accommodations",R.drawable.accommt_white_24dp));
        NewCategory.add(new Category("Sports",R.drawable.sports_white_24dp));
        NewCategory.add(new Category("Student Association",R.drawable.sa_24dp));
        NewCategory.add(new Category("Information Services",R.drawable.it_white_24dp));
        NewCategory.add(new Category("Islamic Centre & Mosques",R.drawable.mosque_24));
        NewCategory.add(new Category("Guard Houses",R.drawable.security_24));
    
        RecyclerView myrv = (RecyclerView) findViewById(R.id.recylcerview_navigation);
        RecyclerViewAdapter myrvAdapter = new RecyclerViewAdapter(NewCategory,this);
        myrv.setLayoutManager(new GridLayoutManager(this,2));
        myrv.setAdapter(myrvAdapter);
    
        mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());
    
        BottomNavigationView bottomNavigationView = (BottomNavigationView) findViewById(R.id.bottom_nav_bar);
    
        Menu menu = bottomNavigationView.getMenu();
        MenuItem menuItem = menu.getItem(2);
        menuItem.setChecked(true);
    
        bottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
                switch (menuItem.getItemId()){
                    case R.id.timetable:
                        Intent intent0 = new Intent(ActivityTwo.this, MainActivity.class);
                        startActivity(intent0);
                        overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
                        break;
    
                    case R.id.transports:
                        Intent intent1 = new Intent(ActivityTwo.this, ActivityOne.class);
                        startActivity(intent1);
                        overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
                        break;
    
                    case R.id.navigation:
                        break;
                }
                return false;
            }
        });
    
    }
    
    @Override
    public void onCardViewClick(int position) {
        Log.d(TAG, "onCardViewClick: Clicked!" + position);
    }
    

    【讨论】:

      【解决方案2】:

      错误信息很清楚。您的构造函数需要 3 个参数,而您只传递了一个。

      你的构造函数:

      public RecyclerViewAdapter(Context mContext, List<Category> mData, OnCardViewListener onCardViewListener){
          this.mContext = mContext;
          this.mData = mData;
          this.mOnCardViewListener = onCardViewListener;
      }
      

      你也需要传递数据和监听器,像这样:

      RecyclerViewAdapter myrvAdapter = new RecyclerViewAdapter(NewCategory.this, data, this);
      

      您的 NewCategory ArrayList 也缺少名称,因此:

      NewCategory = new ArrayList<>();
      

      改为:

      List<NewCategory> data = new ArrayList<>();
      

      【讨论】:

      • Category.java: ``` public class Category { private String title;私有 int 图标; public Category (){ } public Category(String title, int icon) { this.title = title; this.icon = 图标; } 公共字符串 getTitle() { 返回标题; } public int getIcon() { 返回图标; } public void setTitle(String title) { this.title = title; } public void setIcon(int icon) { this.icon = icon; } ``` 我按照你的方式得到了错误:找不到符号类 NewCategory
      • 请参阅已编辑的帖子,因为我添加了一个新类,显示 List NewCategory 的来源。我按照你传递参数的方式得到了错误:找不到符号类 NewCategory
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多