Получение текста выбранного рециркулятора (с использованием FireBase) - PullRequest
0 голосов
/ 19 сентября 2019

Я пытаюсь получить какой-нибудь текст из предмета повторного просмотра, который есть в моем фрагменте.Просмотр рециркулятора получает данные из Firebase и сохраняет их в списке, а затем добавляет все элементы в просмотр рециркулятора.

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

Мой код:

public class Products extends Fragment {

private FirebaseRecyclerAdapter adapter;
public RecyclerView productRecyclerView;
ImageButton btnPopupMenu;
String key, keyholder;
TextView productName, productNameHolder;
int position;


@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragment_products, container, false);

    productRecyclerView = (RecyclerView) rootView.findViewById(R.id.rvProducts);
    productRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));

    final FloatingActionButton btnAddProd = rootView.findViewById(R.id.btnAddProduct);
    final FloatingActionButton btnSearchProd = rootView.findViewById(R.id.fabSearchProduct);
    final FloatingActionButton btnRetract = rootView.findViewById(R.id.fabMainRetract);
    final FloatingActionButton btnMain = rootView.findViewById(R.id.fabMain);

    btnAddProd.hide();
    btnSearchProd.hide();
    btnRetract.hide();

    btnMain.setOnClickListener(new View.OnClickListener()
    {
        @Override
        public void onClick(View v)
        {
            btnAddProd.show();
            btnSearchProd.show();
            btnRetract.show();
            btnMain.hide();
        }
    });

    btnRetract.setOnClickListener(new View.OnClickListener()
    {
        @Override
        public void onClick(View v)
        {
            btnAddProd.hide();
            btnSearchProd.hide();
            btnMain.show();
            btnRetract.hide();
        }
    });

    productRecyclerView.setHasFixedSize(true);
    fetch();

    return rootView;
}

public class ViewHolder extends RecyclerView.ViewHolder {
    public TextView productType;
    public TextView productID;
    public TextView productName;
    public LinearLayout rootProduct;
    public ImageButton btnPopupMenu;

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

        rootProduct = itemView.findViewById(R.id.list_rootProducts);
        productName = itemView.findViewById(R.id.list_productName);
        productType = itemView.findViewById(R.id.list_productType);
        productID = itemView.findViewById(R.id.list_productID);
        btnPopupMenu = itemView.findViewById(R.id.ib_popup_menu);
        productNameHolder = itemView.findViewById(R.id.tvHolder);

        position = getAdapterPosition();
        Toast.makeText(getContext(), "Position is: "+position, Toast.LENGTH_SHORT).show();

    }

    public void setProductName(String string) {

        productName.setText(string);
    }

    public void setProductType(String string) {

        productType.setText(string);
    }

    public void setProductID(String string) {

        productID.setText(string);
    }

}

public interface RecyclerViewClickListener {
    public void recyclerViewListClicked(View v, int position);
}


private void fetch() {
    Query query = FirebaseDatabase.getInstance().getReference().child("PRODUCTS");

    final FirebaseRecyclerOptions<ProductDetails> options =
            new FirebaseRecyclerOptions.Builder<ProductDetails>()
                    .setQuery(query, new SnapshotParser<ProductDetails>() {
                        @NonNull
                        @Override
                        public ProductDetails parseSnapshot(@NonNull DataSnapshot snapshot) {
                            return new ProductDetails
                                    (snapshot.child("Product_Name").getValue().toString(),
                                    snapshot.child("Product_Type").getValue().toString(),
                                    snapshot.child("Product_ID").getValue().toString());
                        }
                    })
                    .build();

    adapter = new FirebaseRecyclerAdapter<ProductDetails, ViewHolder>(options) {
        @Override
        public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View view = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.list_products, parent, false);


            return new ViewHolder(view);
        }


        @Override
        protected void onBindViewHolder(final ViewHolder holder, final int position, final ProductDetails model) {
            holder.setProductName(model.getProductName());
            holder.setProductType(model.getProductType());
            holder.setProductID(model.getProductID());

            holder.btnPopupMenu.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    PopupMenu pm = new PopupMenu(getContext(), view);


                    pm.getMenuInflater().inflate(R.menu.popup_menu, pm.getMenu());
                    pm.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
                        @Override
                        public boolean onMenuItemClick(MenuItem item) {
                            switch (item.getItemId()){
                                case R.id.menu_edit_product:

                                    return true;

                                case R.id.menu_delete_product:
                                    AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
                                    builder.setTitle("DELETE Product");
                                    builder.setMessage("You are about to delete the selected product. Continue?");
                                    builder.setCancelable(false);
                                    builder.setNegativeButton("Yes", new DialogInterface.OnClickListener() {
                                        @Override
                                        public void onClick(DialogInterface dialog, int which) {
                                        }
                                    });

                                    builder.setPositiveButton("Cancel", new DialogInterface.OnClickListener() {
                                        @Override
                                        public void onClick(DialogInterface dialog, int which) {

                                        }
                                    });
                                    builder.show();

                                    return true;
                            }

                            return true;
                        }
                    });
                    pm.show();
                }
            });
        }
    };
    productRecyclerView.setAdapter(adapter);
}

@Override
public void onStart() {
    super.onStart();
    adapter.startListening();
}

@Override
public void onStop() {
    super.onStop();
    adapter.stopListening();
}

@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    //you can set the title for your toolbar here for different fragments different titles
    getActivity().setTitle("Products");
}
}

Моя главная цель - просто получить текст «Product_Name» и установить его в Test textView, чтобы проверить, правильно ли я получаю название продукта выбранногопункт рециркуляции.

Я буду использовать этот текст для ссылки на его ключ из базы данных Firebase и позволю функциям редактирования и удаления работать правильно.

Ответы [ 2 ]

0 голосов
/ 19 сентября 2019

Сначала создайте интерфейс, затем реализуйте View.OnClickListener в классе ViewHolder.затем переопределите метод ..

public class PlayerViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{

    TextView name;
    TextView jersy;
    CircleImageView imageView;
    OnPlayerClick playerClick;

    public void setOnPlayerListener ( OnPlayerClick playerClick){
        this.playerClick = playerClick;
    }


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

        name = itemView.findViewById(R.id.playersName);

        jersy = itemView.findViewById(R.id.jersey);
        imageView = itemView.findViewById(R.id.playerCircleImage);

        itemView.setOnClickListener(this);

    }

    @Override
    public void onClick(View view) {
        playerClick.onPlayerClick(view , getAdapterPosition());
    }
}

, затем просто вызовите holder.setOnPlayerListener из onBindViewHolder.как это

 holder.setOnPlayerListener(new OnPlayerClick() {
        @Override
        public void onPlayerClick(View view, int position) {
             //here you get the view and position
  }
    });
0 голосов
/ 19 сентября 2019

Вы должны передать интерфейс вашему ViewHolder и обработать весь интерфейс / логику Dialog за пределами держателя.Просто вставьте щелчок в держатель и активируйте функцию в вашем интерфейсе, нажав позицию.Установите этот clickListener в onBind.И когда вы объявляете реализацию интерфейса (например, во фрагмент), получите всю информацию о продукте, найдя нужный продукт в выбранном вами списке с позицией, и покажите диалог с информацией.Вы видите, что я имею в виду ?Вы даже можете создать диалог в другом классе.Создание диалога внутри VH не очень хорошая практика ... И я не понимаю, почему вы это делаете: position = getAdapterPosition(); в конструкторе VH?Целью recyclerView является повторное использование VH, поэтому позиция при создании VH бесполезна ...

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