Как передать интерфейс адаптеру? - PullRequest
0 голосов
/ 20 июня 2019

Моя настройка включает в себя представление Googlemap с видом переработчика, наложенным на MapviewFragment.class .Каждый раз, когда пользователь нажимает на вид элемента (который содержит данные, запрошенные мной из Firestore), мне нужно переместить камеру, чтобы сфокусироваться на последующем маркере карты Google этого вида.

Итак, чтобы выполнить это, я прохожу позициювыбранного элемента из RestaurantPickAdapter.class , проверяя это по всем маркерам с помощью индекса и затем перемещая камеру.Однако я понятия не имею, как передать интерфейс и, тем более, как его создать.

Вот мой MapviewFragment.class (в нем 600 строк кода, связанных с маркерами и полилиниями).что я исключил).

public class MapviewFragment extends Fragment implements
        OnMapReadyCallback,
        GoogleMap.OnInfoWindowClickListener,
        RestaurantPickupAdapter.RestaurantRecyclerListener,
        GoogleMap.OnPolylineClickListener {

// This method below queries firestore and loads the recyclerview
private void listRestaurants(View pickupView) {
        restaurantItemsArrayList = new ArrayList<>();

        restaurantRecycler = pickupView.findViewById(R.id.restaurant_pickup_recycler);
        restaurantRecycler.setHasFixedSize(true);
        restaurantRecycler.setLayoutManager(new LinearLayoutManager(mapviewContext, LinearLayoutManager.HORIZONTAL, false));

        Query restaurantQuery = FirebaseFirestore.getInstance().collection("Restaurant_Data").limit(LOAD_LIMIT);
        restaurantQuery.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
            @Override
            public void onComplete(@NonNull Task<QuerySnapshot> task) {
                if (task.isSuccessful()) {
                    restaurantItemsArrayList = new ArrayList<>();
                    for (DocumentSnapshot document : task.getResult()) {
                        if (task.isSuccessful()) {
                            RestaurantItems restaurantItems = new RestaurantItems(document.getString("restaurantName"),
                                    document.getString("restaurantDescription"), document.getString("restaurantAddress"),
                                    document.getString("restaurantLogo"), document.getId(), document.getGeoPoint("geoPoint"));
                            restaurantItemsArrayList.add(restaurantItems);
                            Log.d(TAG, "menu items:" + restaurantItemsArrayList);
                        }
                    }

                    RestaurantPickupAdapter.RestaurantRecyclerListener restaurantRecyclerListener =

                    restaurantPickupAdapter = new RestaurantPickupAdapter(mapviewContext, restaurantItemsArrayList, // this is where I need to pass the interface);
                    restaurantRecycler.setAdapter(restaurantPickupAdapter);
}

// In this method the the camera is focused on the marker (i.e. location of a restaurant) that corresponds to the itemview (i.e. restaurant description)
 @Override
    public void onRestaurantClicked(int position) {
        String restaurantId = restaurantItemsArrayList.get(position).getRestaurantId();
        for (String markerRestaurantId : markerRestaurantIdArrayList) {
            if (markerRestaurantId.equals(restaurantId)) {
                googleMap.animateCamera(CameraUpdateFactory.newLatLng(new LatLng(restaurantItemsArrayList.get(position).getGeoPoint().getLatitude() , restaurantItemsArrayList.get(position).getGeoPoint().getLongitude())), 600, null);
                break;
            }
        }
    }

Вот это RestaurantPickupAdapter.class

public class RestaurantPickupAdapter extends RecyclerView.Adapter<RestaurantPickupAdapter.RestaurantViewHolder>{

    private Context adapterContext;
    private ArrayList<RestaurantItems> restaurantItemsArrayList;
    private RestaurantRecyclerListener restaurantRecyclerListener;

    public RestaurantPickupAdapter(Context adapterContext, ArrayList<RestaurantItems> restaurantItemsArrayList, RestaurantRecyclerListener restaurantRecyclerListener) {
        this.adapterContext = adapterContext;
        this.restaurantItemsArrayList = restaurantItemsArrayList;
        this.restaurantRecyclerListener = restaurantRecyclerListener;
    }

    @NonNull
    @Override
    public RestaurantPickupAdapter.RestaurantViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        LayoutInflater layoutInflater = LayoutInflater.from(adapterContext);
        View view = layoutInflater.inflate(R.layout.item_restaurant_pickup, viewGroup,false);
        return new RestaurantViewHolder(view, restaurantRecyclerListener);
    }

    @Override
    public void onBindViewHolder(@NonNull final RestaurantPickupAdapter.RestaurantViewHolder viewHolder, final int i) {
        viewHolder.tvRestaurantName.setText(restaurantItemsArrayList.get(i).getRestaurantName());
        viewHolder.tvRestaurantAddress.setText(restaurantItemsArrayList.get(i).getRestaurantAddress());
        viewHolder.tvRestaurantDescription.setText(restaurantItemsArrayList.get(i).getRestaurantDescription());
        Glide.with(adapterContext).load(restaurantItemsArrayList.get(i).getRestaurantLogo()).into(viewHolder.tvRestaurantLogo);
    }

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

    class RestaurantViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
        public TextView tvRestaurantName, tvRestaurantAddress, tvRestaurantDescription;
        public ImageView tvRestaurantLogo;
        RestaurantRecyclerListener restaurantClickListener;

        public RestaurantViewHolder(@NonNull View itemView, RestaurantRecyclerListener restaurantRecyclerListener) {
            super(itemView);
            tvRestaurantName = itemView.findViewById(R.id.restaurant_name);
            tvRestaurantAddress = itemView.findViewById(R.id.restaurant_address);
            tvRestaurantDescription = itemView.findViewById(R.id.restaurant_description);
            tvRestaurantLogo = itemView.findViewById(R.id.restaurant_logo);
            restaurantClickListener = restaurantRecyclerListener;

            itemView.setOnClickListener(this);
        }

        @Override
        public void onClick(View view) {
            restaurantClickListener.onRestaurantClicked(getAdapterPosition());
        }
    }

    public interface RestaurantRecyclerListener{
        void onRestaurantClicked(int position);
    }
}

Я не могу просто передать этот , потому что внутри слушателя onSuccess / onComplete дляfirestore это относится к результату запроса.

1 Ответ

0 голосов
/ 21 июня 2019

Похоже, что вы хотите:

restaurantPickupAdapter = new RestaurantPickupAdapter(
        mapviewContext, restaurantItemsArrayList, MapviewFragment.this);

Анонимные внутренние классы имеют ссылку на экземпляр класса, в котором они созданы с использованием этого синтаксиса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...