Search code examples
javaandroidandroid-recyclerviewstaticnon-static

Android Recycler View problem in "onBindViewHolder" function "static method cannot be called from non-static method"


I am new to android and java. I am not able to call ViewHolder.setCategoryName(name); in the onBindViewHolder function. I know there are probably similar questions but nothing has worked for me yet. The compiler gives error "non-static functions cannot be called from a static context", I haven't used static keyword anywhere in my code.

public class CategoryAdapter extends RecyclerView.Adapter<CategoryAdapter.ViewHolder> {

    private List<CategoryModel> categoryModelList;

    public CategoryAdapter(List<CategoryModel> categoryModelList) {
        this.categoryModelList = categoryModelList;
    }

    @NonNull
    @Override
    public CategoryAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int position) {
        View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.category_item,viewGroup,false);
        return new ViewHolder(view);
    }

    @Override
    public  void onBindViewHolder(@NonNull CategoryAdapter.ViewHolder holder, int position) {
        String icon = categoryModelList.get(position).getCategoryIconLink();
        String name = categoryModelList.get(position).getCategoryName();
        ViewHolder.setCategoryName(name);

    }


    @Override
    public int getItemCount() {
        return categoryModelList.size();
    }


    public class ViewHolder extends  RecyclerView.ViewHolder{

       private ImageView categoryIcon;
       private TextView categoryName;

        public ViewHolder(@NonNull View itemView)  {
              super(itemView);
              categoryIcon = itemView.findViewById(R.id.category_icon);
              categoryName = itemView.findViewById(R.id.category_name);

        }

        private void setCategoryIcon(){

        }
        private void setCategoryName(String name){

            categoryName.setText(name);
        }
    }
}

Solution

  • try this:

    public class CategoryAdapter extends RecyclerView.Adapter<CategoryAdapter.ViewHolder> {
    
        private List<CategoryModel> categoryModelList;
    
        public CategoryAdapter(List<CategoryModel> categoryModelList) {
            this.categoryModelList = categoryModelList;
        }
    
        @NonNull
        @Override
        public CategoryAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int position) {
            View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.category_item,viewGroup,false);
            return new ViewHolder(view);
        }
    
        @Override
        public  void onBindViewHolder(@NonNull CategoryAdapter.ViewHolder holder, int position) {
    
        holder.bind(categoryModelList.get(position))
    
        }
    
    
        @Override
        public int getItemCount() {
            return categoryModelList.size();
        }
    
    
        public class ViewHolder extends  RecyclerView.ViewHolder{
    
           private ImageView categoryIcon;
           private TextView categoryName;
    
            public ViewHolder(@NonNull View itemView)  {
                  super(itemView);
                  categoryIcon = itemView.findViewById(R.id.category_icon);
                  categoryName = itemView.findViewById(R.id.category_name);
    
            }
    
           public void bind(CategoryModel categoryModel){
    
                 categoryName.setText(categoryModel.getCategoryName());
            }
        }
    }