#java #android #generics
#java #Android #общие
Вопрос:
Я реализовал универсальный класс, я определил тип T
для интерфейса Integer
, я получаю ошибку при вызове Activity.this
и создании экземпляра адаптера.
скриншот ошибки
Код
public class TestActivity extends AppCompatActivity implements RecyclerViewAdapter.OnRecyclerViewItemClickListener<Integer> {
private RecyclerView testRecycleView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
testRecycleView = findViewById(R.id.test_recycleview);
ArrayList<Pet> pet = new ArrayList<>();
pet.add(new Pet("a","nothing"));
pet.add(new Pet("b","nothing"));
pet.add(new Pet("c","nothing"));
pet.add(new Pet("d","nothing"));
pet.add(new Pet("e","nothing"));
RecyclerViewAdapter<Pet> adapter = new RecyclerViewAdapter<Pet>(pet, this, R.layout.test_pet_row);
LinearLayoutManager layoutManager = new LinearLayoutManager(this, RecyclerView.VERTICAL, false);
testRecycleView.setLayoutManager(layoutManager);
testRecycleView.setAdapter(adapter);
}
@Override
public void onItemClick(Integer position) {
Toast.makeText(this, "clicked " position, Toast.LENGTH_SHORT).show();
}
}
Универсальный класс
public class RecyclerViewAdapter<T> extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder> {
private ArrayList<T> mDataset;
private OnRecyclerViewItemClickListener<T> onRecyclerViewItemClickListener;
private int layoutId;
public RecyclerViewAdapter(ArrayList<T> measurements, OnRecyclerViewItemClickListener<T> onRecyclerViewItemClickListener, int layoutId) {
this.onRecyclerViewItemClickListener = onRecyclerViewItemClickListener;
this.mDataset = measurements;
this.layoutId = layoutId;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
RecyclerViewRow<T> row = (RecyclerViewRow<T>) LayoutInflater.from(parent.getContext()).inflate(layoutId, parent, false);
ViewHolder vh = new ViewHolder(row);
return vh;
}
@Override
public void onBindViewHolder(ViewHolder holder, final int position) {
holder.mRow.showData(mDataset.get(position));
((View) holder.mRow).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (onRecyclerViewItemClickListener != null) {
onRecyclerViewItemClickListener.onItemClick(mDataset.get(position));
}
}
});
}
@Override
public int getItemCount() {
return mDataset.size();
}
public static class ViewHolder extends RecyclerView.ViewHolder {
public RecyclerViewRow mRow;
public ViewHolder(RecyclerViewRow itemView) {
super((View) itemView);
mRow = itemView;
}
}
public interface RecyclerViewRow<T> {
void showData(T item);
}
public interface OnRecyclerViewItemClickListener<T> {
void onItemClick(T position);
}
}
Ответ №1:
Не должно ли это быть
implements RecyclerViewAdapter.OnRecyclerViewItemClickListener<Pet>
вместо
implements RecyclerViewAdapter.OnRecyclerViewItemClickListener<Integer>
потому что у вас есть
ArrayList<T> measurements, OnRecyclerViewItemClickListener<T> onRecyclerViewItemClickListener
таким образом, оба используют «T»
новый RecyclerViewAdapter устанавливает T в значение «Pet», поэтому T не может быть «целым числом» одновременно
Комментарии:
1. спасибо @JavaMan за ваш ответ, но, похоже, это не проблема. Я поделился кодом общего класса. Теперь вы можете увидеть конструктор. может быть, это поможет 🙂
2. В нем говорится, что требуется тип RecyclerViewAdapter . OnRecyclerViewItemClickListener, но предоставил TestActivity. Эта ошибка возникает, когда я определяю тип в Integer, когда оставлено пустым, не вызывает проблем. Но мне нужно явно определить, что это целое число. Я также обновил скриншот ошибки.
3. Разве это не должно быть ‘implements RecyclerViewAdapter . OnRecyclerViewItemClickListener<Pet>’ вместо’реализует RecyclerViewAdapter . OnRecyclerViewItemClickListener<Целое число>’ поскольку у вас есть ‘ArrayList<T> измерения, OnRecyclerViewItemClickListener<T> onRecyclerViewItemClickListener’ поэтому оба используют «T»; новый RecyclerViewAdapter<Pet> устанавливает T в «Pet»
4. да, на самом деле, я этого не осознавал 🙂 можете ли вы обновить свой ответ, я приму. Большое вам спасибо.