Как получить доступ к переменной без указания final?

#java #firebase #firebase-realtime-database

#java #firebase #firebase-realtime-database

Вопрос:

Как я могу использовать держатель переменной, не указанный как final. На самом деле я довольно смущен, потому что я прочитал, что когда в Activity не рекомендуется использовать constructor. Кто-нибудь может мне объяснить?

ниже я указал holder в качестве final, и в результате мое значение одинаково для каждого поля в моем recyclerview.

   public class LocationActivity extends AppCompatActivity {

    private static final String TAG = "LocationActivitynull";
    private RecyclerView.LayoutManager layoutManager;
    private Query query;
    private RecyclerView recyclerView;
    public FirebaseRecyclerAdapter<LocationContent,LocationViewHolder> firebaseRecyclerAdapter;

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

        // Write a message to the database
        query = FirebaseDatabase.getInstance()
                .getReference()
                .child("Locations")
                .limitToLast(50);

        query.keepSynced(true);

        // set up the RecyclerView
        recyclerView = findViewById(R.id.myrecyclerview);
        // use this setting to improve performance if you know that changes
        // in content do not change the layout size of the RecyclerView
        recyclerView.setHasFixedSize(true);

        // use a linear layout manager
        layoutManager = new LinearLayoutManager(this);
        recyclerView.setLayoutManager(layoutManager);

        FirebaseRecyclerOptions<LocationContent> options =
                new FirebaseRecyclerOptions.Builder<LocationContent>()
                        .setQuery(query, LocationContent.class)
                        .build();



        firebaseRecyclerAdapter= new FirebaseRecyclerAdapter<LocationContent, LocationViewHolder>(options) {

            @Override
            protected void onBindViewHolder(@NonNull LocationViewHolder holder, int position, @NonNull LocationContent model) {
//                double doubleLatitude = model.getLatitude();
//                double doubleLongitude = model.getLongitude();
                readData(new MyCallback() {
                    @Override
                    public void onCallback(Double value, Double value2) {
                        holder.post_name.setText(model.getName());
                        holder.post_latitude.setText(String.valueOf (value));
                        holder.post_longitude.setText(String.valueOf (value2));
                        Log.d(TAG, value   ", "   value2);
                    }
                });

//                Log.d(TAG, "onCreate: "   model.getLongitude());
            }

            @NonNull
            @Override
            public LocationViewHolder onCreateViewHolder(@NonNull ViewGroup viewgroup, int i) {
                View view = LayoutInflater.from(viewgroup.getContext()).inflate(R.layout.location_row,viewgroup,false);

                return new LocationViewHolder(view);
            }
        };

        recyclerView.setAdapter(firebaseRecyclerAdapter);

    }

    public interface MyCallback {
        void onCallback(Double value,Double value2);
    }

    public void readData(MyCallback myCallback){
        Log.d("TAG", "Before attaching the listener!");
        ValueEventListener valueEventListener =  new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                for (DataSnapshot ds : dataSnapshot.getChildren()) {

                    LocationContent lc = ds.child("South Bound").getValue(LocationContent.class);
//                    Log.d(TAG, lc.getLatitude()   ", "   lc.getLongitude());
                    myCallback.onCallback(lc.getLatitude(),lc.getLongitude());
                    Log.d("TAG", "Inside onDataChange() method!");
                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
                Log.d(TAG, databaseError.getMessage()); //Don't ignore errors!
            }
        };
        query.addListenerForSingleValueEvent(valueEventListener);
        Log.d("TAG", "After attaching the listener!");
    }



    @Override
    protected void onStart(){
        super.onStart();
        firebaseRecyclerAdapter.startListening();

    }

    @Override
    protected void onStop() {
        super.onStop();
        firebaseRecyclerAdapter.stopListening();
    }
}
  

Это мой LocationViewHolder.

 public class LocationViewHolder extends RecyclerView.ViewHolder {

    public TextView post_name;
    public TextView post_latitude;
    public TextView post_longitude;

    public LocationViewHolder(View itemView){
        super(itemView);

        post_name = itemView.findViewById(R.id.post_name);
        post_latitude = itemView.findViewById(R.id.post_latitude);
        post_longitude = itemView.findViewById(R.id.post_longitude);

    }
}
  

Это мой класс LocationContect

 public class LocationContent {
    private String Name;
    private double Latitude;
    private double Longitude;

    public LocationContent(String name, double latitude, double longitude) {
        Name = name;
        Latitude = latitude;
        Longitude = longitude;
    }

    public LocationContent(){

    }

    public String getName() {
        return Name;
    }

    public void setName(String name) {
        Name = name;
    }

    public double getLatitude() {
        return Latitude;
    }

    public void setLatitude(double latitude) {
        Latitude = latitude;
    }

    public double getLongitude() {
        return Longitude;
    }

    public void setLongitude(Double longitude) {
        Longitude = longitude;
    }

}
  

Комментарии:

1. вы пробовали использовать just as, static потому что final параметр определяет переменную как неизменяемую

2. да, и там сказано, что модификатор ‘static’ здесь не разрешен

3. поймите, не могли бы вы, пожалуйста, объяснить, для чего вы будете использовать эту строку?

4. я собираюсь передать holder в метод onCallback, чтобы я мог установить мои данные firebase в моем textview. Я отредактировал свой вопрос для вас

Ответ №1:

я просто объявляю глобальную переменную, и она работает так, как я хочу