Адаптер Generi c для представления переработчика базы данных Firebase - PullRequest
0 голосов
/ 05 января 2020

На данный момент я могу получить набор адаптеров для конкретного объекта. Вот это 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 функцию или не мечтать об этом?

...