繁体   English   中英

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

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

我正在按照 Head first 的 Android 开发指南作为参考,并尝试使用 cardview 为面条实现一个 recyclerview。

我目前正在按照书中的建议将点击功能作为一个独立于适配器的接口来实现; 虽然我目前没有使用片段。 一个问题是我的 MainActivity 没有找到我定义的方法 setListener。

错误是“找不到符号方法 setListener()”。 所以,我的方法表现得好像它是未定义的。 您知道为什么以及如何解决此问题吗? 这是 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);
            }
        });

    }
}

这是我的适配器代码,我尝试在其中定义 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);
                }
            }

        });
    }

}

替换这个

private RecyclerView.Adapter mAdapter;

public MyAdapter mAdapter; 

并删除额外的东西并更新如下

   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