【问题标题】:Main activity Recycler View - Fragment switch主要活动 Recycler View - Fragment switch
【发布时间】:2021-12-22 02:05:41
【问题描述】:

抱歉,我是新手,每天都在学习。 *编辑以回答问题。

  • 我的 RecyclerView 放置在 mainActivity 布局文件中,并在应用启动时运行
  • 当我尝试切换片段时,recyclerview 仍会显示片段更改。 - 片段肯定会根据 navhost 控制器发生变化,但 RecyclerView 不断显示。
  • 我希望 RecyclerView 只显示在一个片段中,但每次我将代码转移到 ui.home.HomeFragment 或 ui.HomeViewModel 时,应用程序都不会启动。

我想要达到的目标;

  1. 5 个带有底部导航选项卡的片段应用,使用默认的 android studio 设置。
  2. 包含 recyclerView 的片段之一
  3. 片段以 ie 格式设置。 ui.home.HomeFragment & ui.home.HomeViewModel。

有人能告诉我为什么在切换片段时它一直显示来自 MainActivity 的 recyclerView 吗?每当我将此 recyclerView 移动到另一个 fragment.xml 并将其从 MainActivity.xml 文件中删除时,它就会崩溃。

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<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">


<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" >

</fragment>


<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" />

<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" />
</androidx.constraintlayout.widget.ConstraintLayout>

主活动

 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 Observer<List<Note>>() 
 {
        @Override
        public void onChanged(List<Note> 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 && 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 && 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);
    }


   }

【问题讨论】:

  • 如果您的应用程序崩溃后堆栈跟踪以获取帮助,请将您的 recyclerView 移动到片段中。如果您将recyclerView 放在activity 中,它将始终显示。
  • 你想在 UI 方面完成什么?您使用底部导航创建一个包含 5 个选项卡“片段”的活动的方式在您的 XML 中,但您添加了一个无用的回收视图和表格布局
  • 你应该只在你的activity_main中有,然后在每个片段的布局文件中你应该为那个页面放置特定的设计
  • 感谢您的回复。我试图更新上面的问题以更好地解释。所有 5 个片段都包含在 ui.name.NameFragment & ui.name.NameViewModel 中。

标签: java android android-recyclerview fragment android-bottomnav


【解决方案1】:

找到了解决办法。必须删除导航控制器并添加以下内容。在每个活动类中添加重复副本。 RecyclerView 在 MainActivity 中使用 BottomNavbar 主页选项卡运行,并在使用 bottomNavbar 选择新活动时关闭。

MainActivity.java

   BottomNavigationView bottomNavigationView = 
 findViewById(R.id.nav_view);
  

  bottomNavigationView.
  setOnNavigationItemSelectedListener(( 
   item) ->  {
        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;

});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-11
    • 1970-01-01
    相关资源
    最近更新 更多