RecyclerView изначально не прокручивается плавно - PullRequest
0 голосов
/ 06 августа 2020

Я использую Tmdb API и показываю его в RecyclerView. RecyclerView сначала не прокручивается плавно, но затем работает нормально. Я пытался изменить высоту Recyclerview на 0dp или match_parent, но она все та же. Я также пробовал android: nestedScrollingEnabled = "true". Пожалуйста, помогите мне решить эту проблему в RecyclerView. Заранее спасибо. enter image description here

fragment_add.xml

<?xml version="1.0" encoding="utf-8"?>
  

AddFragment.kt

import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Toast
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProviders
import androidx.recyclerview.widget.LinearLayoutManager
import com.martiandeveloper.muuvi.R
import com.martiandeveloper.muuvi.adapter.RecyclerViewMovieAdapter
import com.martiandeveloper.muuvi.viewmodel.AddViewModel
import kotlinx.android.synthetic.main.fragment_add.*

class AddFragment : Fragment() {

    private lateinit var viewModel: AddViewModel
    private val adapter = RecyclerViewMovieAdapter(arrayListOf())

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        return inflater.inflate(R.layout.fragment_add, container, false)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        initUI()
    }

    private fun initUI() {
        viewModel = ViewModelProviders.of(this).get(AddViewModel::class.java)
        setRecyclerView()
        observe()
        viewModel.refreshData()
    }

    private fun setRecyclerView() {
        fragment_add_mainRV.layoutManager = LinearLayoutManager(context)
        fragment_add_mainRV.adapter = adapter
    }

    private fun observe() {
        viewModel.movieList.observe(viewLifecycleOwner, Observer { movieList ->
            movieList?.let {
                adapter.updateMovieList(it)
            }
        })

        viewModel.isError.observe(viewLifecycleOwner, Observer { isError ->
            isError?.let {
                setProgress(1F, true, View.GONE)
                if (it) {
                    setToast(resources.getString(R.string.something_went_wrong_please_try_again_later))
                }
            }
        })

        viewModel.isLoading.observe(viewLifecycleOwner, Observer { isLoading ->
            isLoading?.let {
                if (it) {
                    setProgress(.5F, false, View.VISIBLE)
                } else {
                    setProgress(1F, true, View.GONE)
                }
            }
        })
    }

    private fun setProgress(alpha: Float, enable: Boolean, visible: Int) {
        fragment_add_movieSeriesACT.alpha = alpha
        fragment_add_mainRV.alpha = alpha
        fragment_add_movieSeriesACT.isEnabled = enable
        fragment_add_mainPB.visibility = visible
    }

    private fun setToast(text: String) {
        Toast.makeText(context, text, Toast.LENGTH_SHORT).show()
    }
}

AddViewModel.kt

import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import com.martiandeveloper.muuvi.model.MovieResult
import com.martiandeveloper.muuvi.model.Movie
import com.martiandeveloper.muuvi.service.MovieService
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.CompositeDisposable
import io.reactivex.observers.DisposableSingleObserver
import io.reactivex.schedulers.Schedulers

class AddViewModel : ViewModel() {

    private val movieService = MovieService()
    private val disposable = CompositeDisposable()

    val movieList = MutableLiveData<List<Movie>>()
    val isError = MutableLiveData<Boolean>()
    val isLoading = MutableLiveData<Boolean>()

    fun refreshData() {
        isLoading.value = true
        disposable.add(
            movieService.getData().subscribeOn(Schedulers.newThread())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribeWith(object : DisposableSingleObserver<MovieResult>() {
                    override fun onSuccess(t: MovieResult) {
                        movieList.value = t.results
                        isError.value = false
                        isLoading.value = false
                    }

                    override fun onError(e: Throwable) {
                        isError.value = true
                        isLoading.value = false
                    }

                })
        )
    }
}

RecyclerViewMovieAdapter.kt

import android.content.Context
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
import com.martiandeveloper.muuvi.R
import com.martiandeveloper.muuvi.model.Movie
import kotlinx.android.synthetic.main.recyclerview_movie_item.view.*

class RecyclerViewMovieAdapter(private val movieList: ArrayList<Movie>) :
    RecyclerView.Adapter<RecyclerViewMovieAdapter.RecyclerViewMovieViewHolder>() {

    lateinit var context: Context

    class RecyclerViewMovieViewHolder(var view: View) : RecyclerView.ViewHolder(view)

    override fun onCreateViewHolder(
        parent: ViewGroup,
        viewType: Int
    ): RecyclerViewMovieViewHolder {
        context = parent.context
        val view = LayoutInflater.from(context)
            .inflate(R.layout.recyclerview_movie_item, parent, false)
        return RecyclerViewMovieViewHolder(view)
    }

    override fun getItemCount(): Int {
        return movieList.size
    }

    override fun onBindViewHolder(holder: RecyclerViewMovieViewHolder, position: Int) {
        holder.view.recyclerview_movie_item_movieTitleMTV.text =
            movieList[position].movieTitle
        holder.view.recyclerview_movie_item_movieVoteAverageMTV.text =
            movieList[position].movieVoteAverage.toString()
        Glide.with(context)
            .load("https://image.tmdb.org/t/p/w300${movieList[position].moviePosterPath}")
            .into(holder.view.recyclerview_movie_item_moviePosterIV)
    }

    fun updateMovieList(newMovieList: List<Movie>) {
        movieList.clear()
        movieList.addAll(newMovieList)
        notifyDataSetChanged()
    }
}

recyclerview_movie_item. xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center_vertical"
    android:paddingStart="16dp"
    android:paddingTop="8dp"
    android:paddingEnd="8dp"
    android:paddingBottom="8dp">

    <androidx.cardview.widget.CardView
        android:layout_width="80dp"
        android:layout_height="80dp"
        app:cardBackgroundColor="@android:color/transparent"
        app:cardCornerRadius="10dp"
        app:cardElevation="0dp">

        <ImageView
            android:id="@+id/recyclerview_movie_item_moviePosterIV"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:contentDescription="@string/app_name"
            android:scaleType="centerCrop"
            app:srcCompat="@drawable/default_user_image" />

    </androidx.cardview.widget.CardView>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:orientation="vertical">

        <com.google.android.material.textview.MaterialTextView
            android:id="@+id/recyclerview_movie_item_movieTitleMTV"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="@color/colorPrimary"
            android:textSize="18sp"
            android:textStyle="bold" />

        <com.google.android.material.textview.MaterialTextView
            android:id="@+id/recyclerview_movie_item_movieVoteAverageMTV"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="@color/colorPrimaryDark" />

    </LinearLayout>

</LinearLayout>

1 Ответ

1 голос
/ 06 августа 2020

Я считаю, что это связано с размером изображения, у меня была аналогичная проблема, попробуйте подогнать изображение, которое вы получаете с помощью скольжения, в просмотр изображений, я добавил centerCrop():

Glide.with(context).load("https://image.tmdb.org/t/p/w300${movieList[position].moviePosterPath}") .centerCrop().into(holder.view.recyclerview_movie_item_moviePosterIV);

Если это не так работа попробуйте поменять imageview scaletype или centerCrop() на fitCenter()

...