Как реализовать плавное расположение в пользовательском интерфейсе базы данных адаптера Firebase Recycler? - PullRequest
0 голосов
/ 15 июня 2019

У меня проблема с реализацией объединенного местоположения, какой метод используется для получения текущего местоположения устройства в пользовательском интерфейсе базы данных Firebase, но он не работает, потому что была красная линия, которая заметила

Cannot resolve method 'addOnSuccessListener(anonymous com.firebase.ui.database.FirebaseRecyclerAdapter<co.id.roningrum.dolanapptugasakhir.item.CategoryItem,co.id.roningrum.dolanapptugasakhir.adapter.CategoryViewHolder>, anonymous com.google.android.gms.tasks.OnSuccessListener<android.location.Location>)

Есть три класса, которые я уже сделал, CategoryItem, CategoryViewHolder и CategoryMenuActivity.CategoryItem - это класс модели, CategoryViewHolder - это класс ViewHolder, а CategoryMenuActivity - это класс активности, который используется для отображения списка элементов.

  1. CategoryItem.java

public class CategoryItem {
    private String name_tourism;
    private String location_tourism;
    private String info_tourism;
    private String telepon;
    private String url_photo;
    private double lat_location_tourism;
    private double lng_location_tourism;

    public CategoryItem() {
        //constructor untuk panggilan ke DataSnapshot.getValue
    }

    public CategoryItem(String name_tourism, String location_tourism, String info_tourism, String telepon, String url_photo, double lat_location_tourism, double lng_location_tourism) {
        this.name_tourism = name_tourism;
        this.location_tourism = location_tourism;
        this.info_tourism = info_tourism;
        this.telepon = telepon;
        this.url_photo = url_photo;
        this.lat_location_tourism = lat_location_tourism;
        this.lng_location_tourism = lng_location_tourism;
    }

    public String getName_tourism() {
        return name_tourism;
    }

    public void setName_tourism(String name_tourism) {
        this.name_tourism = name_tourism;
    }

    public String getLocation_tourism() {
        return location_tourism;
    }

    public void setLocation_tourism(String location_tourism) {
        this.location_tourism = location_tourism;
    }

    public String getInfo_tourism() {
        return info_tourism;
    }

    public void setInfo_tourism(String info_tourism) {
        this.info_tourism = info_tourism;
    }

    public String getTelepon() {
        return telepon;
    }

    public void setTelepon(String telepon) {
        this.telepon = telepon;
    }

    public String getUrl_photo() {
        return url_photo;
    }

    public void setUrl_photo(String url_photo) {
        this.url_photo = url_photo;
    }

    public double getLat_location_tourism() {
        return lat_location_tourism;
    }

    public void setLat_location_tourism(double lat_location_tourism) {
        this.lat_location_tourism = lat_location_tourism;
    }

    public double getLng_location_tourism() {
        return lng_location_tourism;
    }

    public void setLng_location_tourism(double lng_location_tourism) {
        this.lng_location_tourism = lng_location_tourism;
    }
}
CategoryViewHolder.java
package co.id.roningrum.dolanapptugasakhir.adapter;

import android.location.Location;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;

import com.bumptech.glide.Glide;

import java.text.DecimalFormat;

import co.id.roningrum.dolanapptugasakhir.R;
import co.id.roningrum.dolanapptugasakhir.item.CategoryItem;


public class CategoryViewHolder extends RecyclerView.ViewHolder {
    private TextView name_tourisms, location_tourism, distance_tourism;
    private ImageView tourism_pic;



    public CategoryViewHolder(@NonNull View itemView) {
        super(itemView);
        name_tourisms = itemView.findViewById(R.id.tv_name_tourism);
        location_tourism = itemView.findViewById(R.id.tv_location_tourism);
        distance_tourism= itemView.findViewById(R.id.tv_distance_tourism);
        tourism_pic = itemView.findViewById(R.id.tourism_pic);
        itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                categoryOnClick.onItemClick(v, getAdapterPosition());
            }
        });

    }

    public void showTourismData(CategoryItem categoryItem, double longitude, double latitude) {
        Location loc1 = new Location("");
        loc1.setLatitude(latitude);
        loc1.setLongitude(longitude);
        Location loc2 = new Location("");
        loc2.setLatitude(categoryItem.getLat_location_tourism());
        loc2.setLongitude(categoryItem.getLng_location_tourism());

        float jarakMeter = loc1.distanceTo(loc2);
        float jarakKM = jarakMeter/1000;

        DecimalFormat df = new DecimalFormat();
        df.setMaximumFractionDigits(2);

        name_tourisms.setText(categoryItem.getName_tourism());
        location_tourism.setText(categoryItem.getLocation_tourism());
        distance_tourism.setText(""+df.format(jarakKM)+" KM");
        Glide.with(itemView.getContext()).load(categoryItem.getUrl_photo()).into(tourism_pic);
    }

    //interface
    private CategoryViewHolder.ClickListener categoryOnClick;
    public interface ClickListener{
        void onItemClick (View view, int position);
    }
    public void setOnClickListener(CategoryViewHolder.ClickListener clickListener){
        categoryOnClick = clickListener;
    }


}
//}
CategoryMenuActivity.java
import com.firebase.ui.database.FirebaseRecyclerOptions;
import com.google.android.gms.location.FusedLocationProviderClient;
import com.google.android.gms.location.LocationServices;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.Query;

import java.util.ArrayList;

import co.id.roningrum.dolanapptugasakhir.adapter.CategoryViewHolder;
import co.id.roningrum.dolanapptugasakhir.item.CategoryItem;

public class CategoryMenuActivity extends AppCompatActivity {
    Toolbar mToolbar;
    DatabaseReference tourismDBRef;
    RecyclerView rvTourismList;
    ArrayList<CategoryItem> categoryItemList;
    FirebaseRecyclerAdapter<CategoryItem, CategoryViewHolder> firebaseAdapter;

    LocationManager locationManagers;
    String[] perms = {Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_NETWORK_STATE};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_category_menu);
        mToolbar = findViewById(R.id.toolbar_top);
        rvTourismList = findViewById(R.id.tourism_list);
        rvTourismList.setLayoutManager(new LinearLayoutManager(this));
        categoryItemList = new ArrayList<>();

        setSupportActionBar(mToolbar);

        locationManagers = (LocationManager) 
 getSystemService(Context.LOCATION_SERVICE);

        tourismDBRef = FirebaseDatabase.getInstance().getReference();
        Query query = tourismDBRef.child("Tourism");

        FirebaseRecyclerOptions<CategoryItem> options = new FirebaseRecyclerOptions.Builder<CategoryItem>()
                .setQuery(query, CategoryItem.class)
                .build();
        firebaseAdapter = new FirebaseRecyclerAdapter<CategoryItem, CategoryViewHolder>(options) {

            @NonNull
            @Override
            public CategoryViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
                View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_category_menu, viewGroup, false);
                return new CategoryViewHolder(view);
            }

            @Override
            public void onBindViewHolder(@NonNull final CategoryViewHolder holder, int position, @NonNull final CategoryItem model) {
                final DatabaseReference touristRef = getRef(position);
                final String wiskey = touristRef.getKey();

                FusedLocationProviderClient mFusedLocation = LocationServices.getFusedLocationProviderClient(getApplicationContext());

                if (ActivityCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                    // TODO: Consider calling
                    //    ActivityCompat#requestPermissions
                    // here to request the missing permissions, and then overriding
                    //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
                    //                                          int[] grantResults)
                    // to handle the case where the user grants the permission. See the documentation
                    // for ActivityCompat#requestPermissions for more details.
                    verifyPermission();
                    return;
                }
                mFusedLocation.getLastLocation().addOnSuccessListener(this, new OnSuccessListener<Location>() {
                    @Override
                    public void onSuccess(Location location) {
                        if (location != null) {
                            // Do it all with location
                            Log.d("My Current location", "Lat : " + location.getLatitude() + " Long : " + location.getLongitude());
                            double latitude = location.getLatitude();
                            double longitude = location.getLongitude();
                            holder.showTourismData(model, latitude,longitude);
                            holder.setOnClickListener(new CategoryViewHolder.ClickListener() {
                                @Override
                                public void onItemClick(View view, int position) {
                                    Intent intent = new Intent(getApplicationContext(), DetailCategoryActivity.class);
                                    intent.putExtra(DetailCategoryActivity.EXTRA_WISATA_KEY, wiskey);
                                    startActivity(intent);
                                }
                            });
                        }
                    }
                });


            }
        };
        firebaseAdapter.notifyDataSetChanged();
        rvTourismList.setAdapter(firebaseAdapter);
    }


    private void verifyPermission() {
        if (!hasPermission(this, perms)) {
            ActivityCompat.requestPermissions(this, perms, 1);
        }
    }

    private boolean hasPermission(Context context, String[] perms) {
        if (context != null && perms != null) {
            for (String permission : perms) {
                if (ActivityCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED) {
                    return false;
                }
            }
        }
        return true;
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.toolbar_menu, menu);
        MenuItem mSearch = menu.findItem(R.id.searchMenu);
        SearchView mSearchView = (SearchView) mSearch.getActionView();
        mSearchView.setQueryHint("Search");
        mSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                return false;
            }

            @Override
            public boolean onQueryTextChange(String searchText) {
                rvTourismList.removeAllViews();
                firebaseSearch(searchText);
return super.onCreateOptionsMenu(menu);
    }

    private void firebaseSearch(String searchText) {
        Query firebaseSearchquery = tourismDBRef.child("Tourism").orderByKey().startAt(searchText).endAt(searchText + "\uf8ff");
        FirebaseRecyclerOptions<CategoryItem> options = new FirebaseRecyclerOptions.Builder<CategoryItem>()
                .setQuery(firebaseSearchquery, CategoryItem.class)
                .setLifecycleOwner(this)
                .build();
        firebaseAdapter = new FirebaseRecyclerAdapter<CategoryItem, CategoryViewHolder>(options) {

            @NonNull
            @Override
            public CategoryViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
                View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_category_menu, viewGroup, false);
                return new CategoryViewHolder(view);
            }

            @Override
            public void onBindViewHolder(@NonNull CategoryViewHolder holder, int position, @NonNull CategoryItem model) {
                final DatabaseReference touristRef = getRef(position);
                final String wiskey = touristRef.getKey();

                holder.showTourismData(model);
                holder.setOnClickListener(new CategoryViewHolder.ClickListener() {
                    @Override
                    public void onItemClick(View view, int position) {
                        Intent intent = new Intent(getApplicationContext(), DetailCategoryActivity.class);
                        intent.putExtra(DetailCategoryActivity.EXTRA_WISATA_KEY, wiskey);
                        startActivity(intent);
                    }
                });
            }
        };
        rvTourismList.setAdapter(firebaseAdapter);

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

    @Override
    protected void onStop() {
        super.onStop();
        if (firebaseAdapter != null) {
            firebaseAdapter.stopListening();
        }

    }
}

Это мои данные структуры базы данных Firebase Realtime Structure Database

Я ожидаю, что метод слияния местоположения может работатьпотому что мое ожидание показать расстояние, которое является результатом расчета расстояния между текущим местоположением и местом назначения.Спасибо :) 1026 *

...