任何人都可以帮助我,我使用 mvvm 模型在我的应用程序中显示电影信息,我认为我做了所有正确的事情,但是当我运行我的应用程序时,它在片段中没有显示任何内容,并且主活动 xml 文件显示正确,但是当我启动我的应用程序没有显示任何内容 告诉我的错误。
片段类
class ListFragment : Fragment() {
lateinit var viewModel: MovieInfoViewModel
lateinit var adapter: MovieAdapter
private var _binding: FragmentListBinding?=null
private val binding get() = _binding!!
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View{
_binding= FragmentListBinding.inflate(inflater,container,false)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
viewModel=(activity as MainActivity).viewModel
setupRecyclerView()
binding.icon.setOnClickListener {
search()
}
findNavController().navigate(
R.id.action_listFragment_to_searchFragment
)
var job: Job?=null
binding.search.addTextChangedListener {it->
job?.cancel()
job= MainScope().launch {
delay(500L)
it?.let {
if (it.toString().isNotEmpty()){
showShimmerAndHideRecycler()
viewModel.searchMovie(it.toString())
}
}
}
}
viewModel.searchMovie.observe(viewLifecycleOwner,{response->
when(response){
is Resource.Success->{
hideShimmerAndShowRecycler()
response.data?.let {
searchResponse -> adapter.differ.submitList(searchResponse.Search)
}
}
is Resource.Error->{
hideShimmerAndShowRecycler()
response.message?.let {
Toast.makeText(activity,"An error occurred: $it", Toast.LENGTH_SHORT).show()
}
}
is Resource.Loading->{
showShimmerAndHideRecycler()
}
}
})
}
private fun hideShimmerAndShowRecycler(){
binding.shimmerLayout.visibility=View.GONE
binding.recycleview.visibility=View.VISIBLE
}
private fun showShimmerAndHideRecycler(){
binding.recycleview.visibility=View.GONE
binding.shimmerLayout.visibility=View.VISIBLE
binding.shimmerLayout.startShimmer()
}
private fun setupRecyclerView(){
adapter= MovieAdapter()
binding.recycleview.apply {
adapter=adapter
layoutManager=LinearLayoutManager(activity)
}
}
private fun search(){
binding.icon.visibility=View.GONE
binding.search.visibility=View.VISIBLE
}
override fun onDestroyView() {
super.onDestroyView()
_binding=null
}
}
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:layout_width="match_parent"
android:layout_height="match_parent">
<ImageButton
android:id="@+id/icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:minHeight="48dp"
android:src="@drawable/ic_baseline_search_24"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:ignore="SpeakableTextPresentCheck" />
<EditText
android:id="@+id/search"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:hint="Search"
android:maxLines="1"
android:visibility="invisible"
android:minHeight="48dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<androidx.recyclerview.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="0dp"
android:id="@+id/recycleview"
android:layout_margin="10dp"
app:layout_constraintTop_toBottomOf="@id/search"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
tools:listitem="@layout/adapter"/>
<com.facebook.shimmer.ShimmerFrameLayout
android:id="@+id/shimmerLayout"
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@+id/search"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:visibility="visible">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<include layout="@layout/shimmer_layout" />
<include layout="@layout/shimmer_layout" />
<include layout="@layout/shimmer_layout" />
</LinearLayout>
</com.facebook.shimmer.ShimmerFrameLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
主要活动
class MainActivity : AppCompatActivity() {
lateinit var navController: NavController
lateinit var viewModel: MovieInfoViewModel
private var _binding:ActivityMainBinding?=null
private val binding get() = _binding!!
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
_binding= ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
val navHostFragment=supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment
navController=navHostFragment.navController
val repository=MovieRepository()
val viewModelProviderFactory=MovieInfoViewModelProvider(application,repository)
viewModel=ViewModelProvider(this,viewModelProviderFactory).get(MovieInfoViewModel::class.java)
}
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:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<androidx.fragment.app.FragmentContainerView
android:id="@+id/nav_host_fragment"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:defaultNavHost="true"
app:navGraph="@navigation/nav_graph"
tools:layout="@layout/fragment_list" />
清单文件
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.movieinfo">
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<application
android:name=".MovieApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.MovieInfo">
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
导航图 xml
<?xml version="1.0" encoding="utf-8"?>
<navigation 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/nav_graph"
app:startDestination="@id/listFragment">
<fragment
android:id="@+id/listFragment"
android:name="com.example.movieinfo.ui.fragment.ListFragment"
android:label="ListFragment" >
<action
android:id="@+id/action_listFragment_to_searchFragment"
app:destination="@id/searchFragment" />
</fragment>
<fragment
android:id="@+id/searchFragment"
android:name="com.example.movieinfo.ui.fragment.SearchFragment"
android:label="fragment_search"
tools:layout="@layout/fragment_search" >
</fragment>
要在应用程序模块的build.gradle文件中添加旧版本的库,您可以修改实现行,如下所示:
实现“androidx.navigation:navigation-fragment-ktx:2.3.3” 实现“androidx.navigation:navigation-ui-ktx:2.3.3”