На данный момент я могу получить набор адаптеров для конкретного объекта. Вот это Material_details. Код:
FirebaseRecyclerOptions<Material_details> options = new FirebaseRecyclerOptions.Builder<Material_details>()
.setQuery(firebase.ref,Material_details.class).build();
FirebaseRecyclerAdapter<Material_details, ViewHolder> adapter;
adapter = new FirebaseRecyclerAdapter<Material_details, ViewHolder>(options) {
@Override
protected void onBindViewHolder(@NonNull ViewHolder holder, int position, @NonNull Material_details model) {
holder.title.setText(((Material_details)model).getName());
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
//Log.d(TAG, "onCreateViewHolder: initialized!");
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_for_swipe_minimal, parent, false);
ViewHolder holder = new ViewHolder(view);
return holder;
}
};
Затем я написал метод generi c, чтобы получить Dapter для разных классов вместо Material_details. Это как:
@SuppressWarnings("unchecked")
private Class<T> getGenericTypeClass() {
try {
String className = ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0].getTypeName();
Class<?> clazz = Class.forName(className);
return (Class<T>) clazz;
} catch (Exception e) {
throw new IllegalStateException("Class is not parametrized with generic type!!! Please use extends <> ");
}
}
<T> FirebaseRecyclerAdapter<T, ViewHolder> return_adpater()
{
Fb firebase = new Fb<T>("materials",getApplicationContext());
FirebaseRecyclerOptions<T> options = new FirebaseRecyclerOptions.Builder<T>()
.setQuery(firebase.ref,T.class).build(); // error because of T
return new FirebaseRecyclerAdapter<T, ViewHolder>(options) {
@Override
protected void onBindViewHolder(@NonNull ViewHolder holder, int position, @NonNull T model) {
holder.title.setText(((T)model).getName()); // error because of T
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
//Log.d(TAG, "onCreateViewHolder: initialized!");
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_for_swipe_minimal, parent, false);
ViewHolder holder = new ViewHolder(view);
return holder;
}
};
}
.setQuery(firebase.ref,T.class).build(); // error because of T expression expected
holder.title.setText(((T)model).getName()); // error because of T cannot resolve getName
Я получаю ошибку из-за двух строк, упомянутых выше. 1. Как я должен объявить это? 2. Возможен ли метод generi c? 3. Каково общее правило большого пальца, чтобы иметь обобщенную c функцию или не мечтать об этом?