-1

I have utilized mContext through "recyclerAdapter = new RecyclerAdapter(mContext, placeList);" but at the variable declaration, android studio mentioned that it was never assigned. What is the error here?

The main purpose of this is so that I can retrieve both text and images from firebase to android studio.

package com.example.myapplication;

import android.content.Context;
import android.os.Bundle;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.Query;
import com.google.firebase.database.ValueEventListener;

import java.util.ArrayList;


public class MainActivity extends AppCompatActivity {
    //firebase
    //FirebaseDatabase firebaseDatabase;
    private DatabaseReference myRef;

    //Widgets
    RecyclerView recyclerView;

    //variables
    private ArrayList<Place> placeList;
    private RecyclerAdapter recyclerAdapter;
    private Context mContext;//Private field 'mContext' is never assigned

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //set recyclerView
        recyclerView = findViewById(R.id.recyclerView);

        LinearLayoutManager LayoutManager = new LinearLayoutManager(this);
        recyclerView.setLayoutManager(LayoutManager);
        recyclerView.setHasFixedSize(true);

        //set Firebase
        myRef = FirebaseDatabase.getInstance().getReference();

        //set arraylist
        placeList = new ArrayList<>();

        //get  a data method
        GetDataFromFirebase();

        //Clear Arraylist
        ClearAll();

    }

    //this is data method
    private void GetDataFromFirebase() {
        Query query = myRef.child("places1");
        query.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                ClearAll();
                for (DataSnapshot ds: snapshot.getChildren()){
                 Place place = new Place();
                 place.setImage(ds.child("image").getValue().toString()); //place image to "image:"
                 place.setName(ds.child("name").getValue().toString());
                 place.setLocation(ds.child("location").getValue().toString());

                 placeList.add(place);
                }
                recyclerAdapter = new RecyclerAdapter(mContext, placeList);//mContext is being used here
                recyclerView.setAdapter(recyclerAdapter);
                recyclerAdapter.notifyDataSetChanged();
            }

            @Override
            public void onCancelled(@NonNull DatabaseError error) {

            }
        });
    }

    private void ClearAll(){
        if (placeList != null){
            placeList.clear();

            if(recyclerAdapter!=null){
                recyclerAdapter.notifyDataSetChanged();
            }
        }

        placeList = new ArrayList<>();
    }

}

mContext was also used in my another class file called RecyclerAdapter.java

package com.example.myapplication;

import android.content.Context;
import android.icu.text.Transliterator;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import com.bumptech.glide.Glide;

import java.util.ArrayList;

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

    private static final String Tag = "RecyclerView";
    private Context mContext;
    private ArrayList<Place> placeList;

    public RecyclerAdapter(Context mContext, ArrayList<Place> placeList) {
        this.mContext = mContext;
        this.placeList = placeList;
    }

    @NonNull
    @Override
    public RecyclerAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        //call viewholder to place the data in this template
        View view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.place_info, parent, false);

        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        //get textview
        holder.textView1.setText(placeList.get(position).getName());
        holder.textView2.setText(placeList.get(position).getName());

        //image view using glide lib
        Glide.with(mContext)
                .load(placeList.get(position).getImage())
                .into(holder.imageView);    //diaply into image view
    }

    @Override
    public int getItemCount() {

        return placeList.size();
    }

    public class ViewHolder extends RecyclerView.ViewHolder {
        //widgets
        ImageView imageView;
        TextView textView1;
        TextView textView2;

        public ViewHolder(@NonNull  View itemView) {
            super(itemView);

            imageView =itemView.findViewById(R.id.imageView);
            textView1=itemView.findViewById(R.id.textViewName);
            textView2=itemView.findViewById(R.id.textViewLocation);
        }
    }

}

1 Answers1

0

Replace this:

Glide.with(mContext)
            .load(placeList.get(position).getImage())
            .into(holder.imageView);

with this:

Glide.with(holder.itemView.getContext())
            .load(placeList.get(position).getImage())
            .into(holder.imageView);

After doing this, you no longer need the "mContext" :) (Neither in the constructor nor in the class)

Please let me know if this works.

Sujal Kumar
  • 1,054
  • 10
  • 23