Я следую руководству 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);
}
}
});
}
}