Метод определен (интерфейс Android), но все еще не найден? - PullRequest
0 голосов
/ 01 октября 2019

Я следую руководству Head first по разработке Android в качестве справочного материала и пытаюсь реализовать обзор утилизатора с помощью cardview для блюд из лапши.

В настоящее время я реализую функцию щелчка в качестве интерфейса, отдельного от адаптера, как рекомендуется вкнига;хотя я не использую фрагменты в данный момент. Единственная проблема состоит в том, что метод setListener, который я определил, не найден моей MainActivity.

Ошибка: «не удается найти метод символа 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);
                }
            }

        });
    }

}

1 Ответ

0 голосов
/ 01 октября 2019

замените

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