Amir Dora.
Amir Dora.

Reputation: 2707

Implemented generic class, getting Activity.this error

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

enter image description here

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

Answers (1)

JavaMan
JavaMan

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

Related Questions