Я отправил данные из действия под названием ItemDetails:
private void AddToCart(String name, String price) {
OrdersFragment fragment = new OrdersFragment();
fragment.receiveData(name, price);
}
Я хочу показать данные в представлении ресайклера в OrdersFragment, когда я их получу (список пуст, он будет заполняться переданными данными, когда я получаю заказы)
Итак, я получаю данные здесь:
public void receiveData(String name, String price) {
this.name = name;
this.price = price;
}
Но я не могу получить к нему доступ в onCreateView:
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_rv_orders, container, false);
txt_name = view.findViewById(R.id.order_item_name);
txt_price = view.findViewById(R.id.order_item_price);
txt_name.setText(name);
txt_price.setText(price);
return view;
}
Я пробовал различные способы отправки данных из активности во фрагмент, и это единственный способ, которым он фактически отправлял данные во фрагмент, я просто не знаю, как получить к нему доступ. Любое предложение приветствуется.
Проблема в том, что из кода, которым вы поделились здесь, вновь созданный экземпляр не будет добавлен в пользовательский интерфейс. Вам нужно вызвать receiveData()
экземпляр, где вы знаете, что он в данный момент отображается. Несколько лет назад можно было запросить Fragmentmanager для текущего экземпляра OrdersFragment. Но сегодня мы бы сделали это, как предлагает @Shawn: чтобы Activity передала данные в экземпляр ViewModel, который также доступен для OrdersFragment. См. также Делитесь данными с помощью ViewModel
Вы должны установить свои строковые значения в методе receiveData
фрагмента.
Объявите во фрагменте две глобальные переменные (я предполагаю, что это TextView
)
private TextView txt_name;
private TextView txt_price;
И инициализируйте их в методе onCreateView
:
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_rv_orders, container, false);
txt_name = view.findViewById(R.id.order_item_name);
txt_price = view.findViewById(R.id.order_item_price);
return view;
}
Наконец, установите текстовые значения с помощью
public void receiveData(String name, String price) {
txt_name.setText(name);
txt_price.setText(price);
}
Я читал, что вы имеете в виду RecyclerView
в своем вопросе, если вам нужно заполнить список этого типа, вам нужно будет создать адаптер во фрагменте и заполнить его методом receiveData
.
Я пробовал это, TextView имеет значение null, поэтому я не могу установить значение. Я думал, что смогу обойтись без переходника, но спасибо, попробую с переходником.
Если вам нужно заполнить RecyclerView
, вы должны использовать класс, реализующий RecyclerView.Adapter
, и инициализировать его представления в методе onBindViewHolder
.
Android рекомендует использовать «общую ViewModel», ее основная цель — поддерживать данные при изменении конфигурации и передавать данные между действиями и фрагментами.