简体   繁体   English

方法已定义(Android 接口)但仍未找到?

[英]Method defined (Android interface) but still not found?

I am following Head first's guide to Android development as a reference and trying to implement a recyclerview with cardview for noodle dishes.我正在按照 Head first 的 Android 开发指南作为参考,并尝试使用 cardview 为面条实现一个 recyclerview。

I am currently implementing the click functionality as an interface separate from the adapter as recommended in the book;我目前正在按照书中的建议将点击功能作为一个独立于适配器的接口来实现; though I am not using fragments at the moment.虽然我目前没有使用片段。 The one problem is that the method setListener i have defined is not being found by my MainActivity.一个问题是我的 MainActivity 没有找到我定义的方法 setListener。

The error is "cannot find symbol method setListener()".错误是“找不到符号方法 setListener()”。 So, my method is acting as if it is undefined.所以,我的方法表现得好像它是未定义的。 Do you know how to why and how to fix this issues?您知道为什么以及如何解决此问题吗? Here is the code for MainActivity这是 MainActivity 的代码

package com.justin.android.foodapp;

import androidx.appcompat.app.A

public class MainActivity extends AppCompatActivity {

    private Noodles[] noodlesDataset = Noodles.noodles;
    private RecyclerView recyclerView;
    private RecyclerView.Adapter mAdapter;
    private RecyclerView.LayoutManager layoutManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //Log.i("MainActivity", "Hello World");

        // get the recycler view
        recyclerView = (RecyclerView) findViewById(R.id.noodleRecycler);

        // use a linear layout manager
        layoutManager = new LinearLayoutManager(this);
        recyclerView.setLayoutManager(layoutManager);

        //specify an adapter
        mAdapter = new MyAdapter(noodlesDataset);
        recyclerView.setAdapter(mAdapter);
        LinearLayoutManager layoutManager = new LinearLayoutManager(MainActivity.this);
        recyclerView.setLayoutManager(layoutManager);

        mAdapter.setListener(new MyAdapter.Listener(){
            public void onClick(int position) {
                Intent intent = new Intent(MainActivity.this, NoodleDetailActivity.class);
                intent.putExtra(NoodleDetailActivity.EXTRA_NOODLE_ID, position);
                (MainActivity.this).startActivity(intent);
            }
        });

    }
}

Here is my adapter code, in which i try to define the setListener method这是我的适配器代码,我尝试在其中定义 setListener 方法

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

    private Noodles[] mDataset;
    private Listener listener;

    interface Listener {
        void onClick(int position);
    }

    // set listener to the implementation of given interface
    public void setListener(Listener listener) {
        this.listener = listener;
    }

    public static class MyViewHolder extends RecyclerView.ViewHolder {
        public CardView cardView;
        public TextView textView;
        public ImageView imageView;
        public MyViewHolder(View v) {
            super(v);
            cardView = v.findViewById(R.id.card_view);
            textView = v.findViewById(R.id.textView);
            imageView = v.findViewById(R.id.food_image);
        }
    }
    // contructor; pass the data from Java class Noodles to MyAdapter
    public MyAdapter(Noodles[] noodlesDataset) {
        mDataset = noodlesDataset;
    }

    @Override
    public int getItemCount() {
        return mDataset.length;
    }

    // create a new ViewHolder and place the views in layout my_text_view inside.
    @Override
    public MyAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent,
                                                     int viewType) {
        // create a new view
        View v = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.my_text_view, parent, false);

        MyViewHolder vh = new MyViewHolder(v);
        return vh;
    }

    // Replace the contents of a view (invoked by the layout manager)
    @Override
    public void onBindViewHolder(MyViewHolder holder, final int position) {
        // - get element from your dataset at this position
        // - replace the contents of the view with that element
        final CardView cardView = holder.cardView;
        holder.textView.setText(mDataset[position].getName());
        holder.imageView.setImageResource(mDataset[position].getImageResourceId());

        // when clicked, send an intent from cardview
        cardView.setOnClickListener(new View.OnClickListener() {
            @Override
            // if listener is present, call the implementation of onClick set by the parent
            public void onClick(View v) {
                if (listener != null) {
                    listener.onClick(position);
                }
            }

        });
    }

}

replace this替换这个

private RecyclerView.Adapter mAdapter;

with

public MyAdapter mAdapter; 

and also remove extra things and update like below并删除额外的东西并更新如下

   private RecyclerView recyclerView;
      public MyAdapter mAdapter;


        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            //Log.i("MainActivity", "Hello World");

            // get the recycler view
            recyclerView = (RecyclerView) findViewById(R.id.noodleRecycler);


            //specify an adapter
            mAdapter = new MyAdapter(noodlesDataset);
  LinearLayoutManager layoutManager = new LinearLayoutManager(MainActivity.this);
            recyclerView.setAdapter(mAdapter);

            recyclerView.setLayoutManager(layoutManager);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM