【发布时间】:2021-12-22 02:05:41
【问题描述】:
抱歉,我是新手,每天都在学习。 *编辑以回答问题。
- 我的 RecyclerView 放置在 mainActivity 布局文件中,并在应用启动时运行
- 当我尝试切换片段时,recyclerview 仍会显示片段更改。 - 片段肯定会根据 navhost 控制器发生变化,但 RecyclerView 不断显示。
- 我希望 RecyclerView 只显示在一个片段中,但每次我将代码转移到 ui.home.HomeFragment 或 ui.HomeViewModel 时,应用程序都不会启动。
我想要达到的目标;
- 5 个带有底部导航选项卡的片段应用,使用默认的 android studio 设置。
- 包含 recyclerView 的片段之一
- 片段以 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