#java #android #android-recyclerview #fragment #android-bottomnav
Вопрос:
Извиняюсь, я новичок и учусь каждый день. *Отредактировано для ответа на вопросы.
- Мой RecyclerView помещается в файл макета MainActivity и запускается при запуске приложения
- Когда я пытаюсь переключить фрагменты, recyclerview по — прежнему отображается при изменении фрагмента. -Фрагменты, безусловно, меняются в соответствии с контроллером navhost, но RecyclerView продолжает отображаться.
- Я хочу, чтобы RecyclerView отображался только в одном фрагменте, но каждый раз, когда я переключаю код на ui.home.Домашняя страница или пользовательский интерфейс.HomeViewModel приложение не запустится.
Чего я пытаюсь достичь;
- 5 фрагмент приложения с нижними вкладками навигации с использованием настроек Android Studio по умолчанию.
- один из фрагментов, содержащих RecyclerView
- Фрагменты настраиваются в формате ie. ui.home.Домашняя страница и пользовательский интерфейс.главная страница.Модель домашнего просмотра.
Кто-нибудь мог бы посоветовать, почему при переключении фрагментов он продолжает показывать RecyclerView из MainActivity? В любое время, когда я перемещаю этот просмотр вторсырья в другой fragment.xml и выньте его из MainActivity.xml файл выходит из строя.
activity_main.xml
lt;?xml version="1.0" encoding="utf-8"?gt; lt;androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@ id/container" android:layout_width="match_parent" android:background="#DCDCDC" android:layout_height="match_parent" android:paddingTop="0dp"gt; lt;fragment android:id="@ id/nav_host_fragment_activity_main" android:name="androidx.navigation.fragment.NavHostFragment" android:layout_width="match_parent" android:layout_height="match_parent" app:defaultNavHost="true" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="0" app:navGraph="@navigation/mobile_navigation" gt; lt;/fragmentgt; lt;com.google.android.material.bottomnavigation.BottomNavigationView android:id="@ id/nav_view" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="0dp" android:layout_marginEnd="0dp" android:background="#282D58" app:itemIconTint="@color/white" app:itemTextColor="@color/white" app:labelVisibilityMode="labeled" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:menu="@menu/bottom_nav_menu" /gt; lt;androidx.recyclerview.widget.RecyclerView android:id="@ id/recyclerView" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginBottom="60dp" android:layout_marginTop="60dp" tools:layout_editor_absoluteX="0dp" tools:listitem="@layout/note_item" /gt; lt;/androidx.constraintlayout.widget.ConstraintLayoutgt;
Основная деятельность
public class MainActivity extends AppCompatActivity { private NoteViewModel noteViewModel; private RecyclerView RecyclerView; private RecyclerView.Adapter Adapter; private RecyclerView.LayoutManager LayoutManager; private ActivityMainBinding binding; ImageView imageView1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = ActivityMainBinding.inflate(getLayoutInflater()); setContentView(binding.getRoot()); BottomNavigationView navView = findViewById(R.id.nav_view); AppBarConfiguration appBarConfiguration = new AppBarConfiguration.Builder( R.id.navigation_logbook, R.id.navigation_settings, R.id.navigation_aircraft, R.id.navigation_pilots, R.id.navigation_totals) .build(); NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment_activity_main); NavigationUI.setupWithNavController(binding.navView, navController); RecyclerView recyclerView = findViewById(R.id.recyclerView); recyclerView.setLayoutManager(new LinearLayoutManager(this)); recyclerView.setHasFixedSize(true); NoteAdapter adapter = new NoteAdapter(); recyclerView.setAdapter(adapter); noteViewModel = new ViewModelProvider.AndroidViewModelFactory(getApplication()) .create(NoteViewModel.class); noteViewModel.getAllNotes().observe(this, new Observerlt;Listlt;Notegt;gt;() { @Override public void onChanged(Listlt;Notegt; notes) { //update RecyclerView adapter.setNotes(notes); } }); imageView1 = findViewById(R.id.flightadd); imageView1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MainActivity.this, AddNoteActivity.class); startActivityForResult(intent, 1); } }); new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(0,ItemTouchHelper.LEFT) { @Override public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) { return false; } @Override public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) { noteViewModel.delete(adapter.getNotes(viewHolder.getAdapterPosition())); } }).attachToRecyclerView(recyclerView); adapter.setOnItemClickListener(new NoteAdapter.OnItemClickListener() { @Override public void onItemClick(Note note) { Intent intent = new Intent(MainActivity.this, UpdateActivity.class); intent.putExtra("id", note.getId()); intent.putExtra("title", note.getTitle()); intent.putExtra("description", note.getDescription()); intent.putExtra("year", note.getYear()); intent.putExtra("flightnumber", note.getFlightnumber()); intent.putExtra("reg", note.getReg()); intent.putExtra("month", note.getMonth()); intent.putExtra("date", note.getDate()); intent.putExtra("dep", note.getDep()); intent.putExtra("arr", note.getArr()); intent.putExtra("total", note.getTotal()); intent.putExtra("offb", note.getOffb()); intent.putExtra("onb", note.getOnb()); startActivityForResult(intent, 2); } }); } @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data){ super.onActivityResult(requestCode, resultCode, data); if (requestCode == 1 amp;amp; resultCode == RESULT_OK) { String title = data.getStringExtra("noteTitle"); String description = data.getStringExtra("noteDescription"); String year = data.getStringExtra("noteYear"); String reg = data.getStringExtra("noteReg"); String month = data.getStringExtra("noteMonth"); String date = data.getStringExtra("noteDate"); String flightnumber = data.getStringExtra("noteFlightnumber"); String dep = data.getStringExtra("noteDep"); String arr = data.getStringExtra("noteArr"); String offb = data.getStringExtra("noteOffb"); String onb = data.getStringExtra("noteOnb"); String total = data.getStringExtra("noteTotal"); Note note = new Note(title, description, year, reg, month, flightnumber, date, dep, arr, offb, onb, total); noteViewModel.insert(note); } else if (requestCode == 2 amp;amp; resultCode == RESULT_OK) { String title = data.getStringExtra("titleLast"); String description = data.getStringExtra("descriptionLast"); String year = data.getStringExtra("yearLast"); String flightnumber = data.getStringExtra("flightnumberLast"); String reg = data.getStringExtra("titleReg"); String month = data.getStringExtra("titleMonth"); String date = data.getStringExtra("titleDate"); String dep = data.getStringExtra("titleDep"); String arr = data.getStringExtra("titleArr"); String offb = data.getStringExtra("titleOffb"); String onb = data.getStringExtra("titleOnb"); String total = data.getStringExtra("titleTotal"); int id = data.getIntExtra("noteId", -1); Note note = new Note(title, description, year, month, reg, flightnumber, date, dep, arr, offb, onb, total); note.setId(id); noteViewModel.update(note); } }
Комментарии:
1. Переместите свой RecyclerView во фрагмент, если ваше приложение выходит из строя после трассировки стека, чтобы получить помощь. Если вы разместите
recyclerView
activity
, это всегда будет видно.2. чего вы пытаетесь достичь здесь с точки зрения пользовательского интерфейса? способ создания действия с нижней навигацией, содержащей 5 вкладок «фрагменты», находится в вашем XML, но вы добавили бесполезный вид для повторного использования и макет таблицы в микс
3. у вас должны быть только lt;фрагментgt; и lt;фрагментgt;lt;bottomnavigationviewgt; в вашем activity_main, а затем внутри файла макета для каждого фрагмента вы должны указать конкретный дизайн для этой страницы
4. Спасибо вам за ответы. Я попытался обновить вопрос выше, чтобы лучше объяснить. Все 5 фрагментов содержатся в ui.name.NameFragment и ui.name.NameViewModel.
Ответ №1:
Нашел решение. Пришлось удалить навигационный контроллер и добавить следующее. Добавление повторных копий в каждый класс деятельности. RecyclerView запускается в режиме основной активности на вкладке «Главная панель» и закрывается при выборе новых действий с помощью панели «Главная панель».
MainActivity.java
BottomNavigationView bottomNavigationView = findViewById(R.id.nav_view); bottomNavigationView. setOnNavigationItemSelectedListener(( item) -gt; { switch (item.getItemId()) { case R.id.navigation_logbook: break; case R.id.navigation_pilots: Intent intent2 = new Intent(MainActivity.this, Pilots.class); startActivity(intent2); break; case R.id.navigation_settings: Intent intent3 = new Intent(MainActivity.this, Settings.class); startActivity(intent3); break; case R.id.navigation_aircraft: Intent intent4 = new Intent(MainActivity.this, Aircraft.class); startActivity(intent4); break; case R.id.navigation_totals: Intent intent5 = new Intent(MainActivity.this, Totals.class); startActivity(intent5); break; } return false; });