Reputation: 2707
I have implemented a generic class, I have defined the type T
for the interface to Integer
, I get error when calling Activity.this
and instantiating adapter.
error screenshot
Code
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();
}
}
Generic class
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);
}
}
Upvotes: 0
Views: 53
Reputation: 1217
Shouldn't it be
implements RecyclerViewAdapter.OnRecyclerViewItemClickListener<Pet>
instead of
implements RecyclerViewAdapter.OnRecyclerViewItemClickListener<Integer>
because you have
ArrayList<T> measurements, OnRecyclerViewItemClickListener<T> onRecyclerViewItemClickListener
so the both use "T"
new RecyclerViewAdapter sets T to "Pet", therefore T can't be "Integer" at the same time
Upvotes: 1