Kotlin Android Recycler внутри фрагмента с нижней навигацией не работает - PullRequest
0 голосов
/ 10 сентября 2018

Я пытаюсь разработать приложение для социальных сетей, в котором используются библиотеки Android Jetpack, но при использовании компонента навигации для навигации вниз по фрагментам внутри действия этот адаптер выдает ошибку LayoutInflator () , которая вызывает приложение для сбоя

Может ли кто-нибудь помочь мне через это:

enter image description here

Мой класс адаптера:

class FeedAdapter : PagedListAdapter<feed,FeedAdapter.ViewHolder>(FeedDiffCallBack()){
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        val userPost = LayoutInflater.from(parent.context)
                    .inflate(R.layout.feedrow,parent,false)
        return ViewHolder(userPost)
}

override fun onBindViewHolder(holder: ViewHolder, position: Int) {
    val feedItem = getItem(position)
    if(feedItem != null){
        holder.bind(feedItem)
    }
}

class ViewHolder(itemView:View):RecyclerView.ViewHolder(itemView) {
    //Retrieve data
    private val username:TextView = itemView.post_name

    private val userPic:ImageView = itemView.feedImage1
    private val location:TextView = itemView.postLocation
    private val time:TextView = itemView.postTime
    private val post:ImageView = itemView.postImage

    fun bind(feed: feed) = with(itemView){
        //TODO:Bind Data with View
            showFeedData(feed)

    }

    private fun showFeedData(feed: feed) {
        username.text = feed.username
        userPic.setImageURI(null)
        userPic.visibility = View.GONE
        location.text = feed.location
        time.text = feed.timeStamp.toString()
        post.setImageURI(Uri.parse(feed.mUrl))

    }

}

 }

class FeedDiffCallBack : DiffUtil.ItemCallback<feed>() {
override fun areItemsTheSame(oldItem:feed, newItem: feed): Boolean {
    return oldItem?.id == newItem?.id
}

override fun areContentsTheSame(oldItem: feed, newItem: feed): Boolean {
    return oldItem == newItem
}

}

Класс фрагмента:

class FeedFragment : Fragment() {

companion object {
    fun newInstance() = FeedFragment()
}

private lateinit var viewModel: FeedViewModel
override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
): View? {
    val view =  inflater.inflate(R.layout.feed_fragment, container, false)
    val context = getContext() ?: return view

    val factory = InjectorUtils.provideViewModelFactory(context)
    viewModel = 
 ViewModelProviders.of(this,factory).get(FeedViewModel::class.java)
    val adapter = FeedAdapter()
    view.findViewById<RecyclerView>(R.id.feedView).adapter = adapter
    view.findViewById<RecyclerView>(R.id.feedView).layoutManager = 
LinearLayoutManager(MyApplication.getContext())
    subscribeUI(adapter)
    return view
}

private fun subscribeUI(adapter: FeedAdapter) {
    viewModel.showFeed().observe(this, object:Observer<PagedList<feed>>{
        override fun onChanged(t: PagedList<feed>?) {
            adapter.submitList(t)
            adapter.notifyDataSetChanged()
        }

    })
}


override fun onActivityCreated(savedInstanceState: Bundle?) {
    super.onActivityCreated(savedInstanceState)
}

}

feed_row.xml Отдельная позиция для переработчика ->

<RelativeLayout
    android:id="@+id/postContainer"
    android:layout_margin="10dp"
    android:elevation="2dp"
    android:background="@drawable/bg_parent_rounded_corner"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <!--TODO:Change to Circle Image View-->
    <ImageView
        android:id="@+id/profileImage"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_marginTop="5dp"
        android:layout_marginLeft="5dp"
        android:adjustViewBounds="true"
        android:scaleType="fitCenter"

        />
    <LinearLayout
        android:id="@+id/postDetail_1"
        android:orientation="vertical"
        android:layout_marginTop="5dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="5dp"
        android:layout_marginRight="20dp"
        android:layout_alignParentRight="true">
        <TextView
            android:id="@+id/post_name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            style="@style/LabelStyle"
            android:textSize="15sp"
            android:fontFamily="@font/sf_pro_display_semibold" />
        <LinearLayout
            android:id="@+id/postDetail_2"
            android:orientation="horizontal"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">
            <TextView
                android:id="@+id/postLocation"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />
            <TextView
                android:id="@+id/postTime"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="120dp" />
        </LinearLayout>

    </LinearLayout>

    <ImageView
        android:id="@+id/postImage"
        android:layout_height="200dp"
        android:layout_width="match_parent"
        android:layout_below="@+id/postDetail_1"
        android:adjustViewBounds="true"
        android:scaleType="fitCenter"
        android:layout_marginTop="6dp"
       />



</RelativeLayout>

Ответы [ 2 ]

0 голосов
/ 11 сентября 2018

Это может помочь кому-то, ищущему то же исключение, быть очищенным: Что я сделал, так это то, что мой feed_row.xml выше включен в теги , и я изменил его таким образом, поэтому исключение было очищено:

до исключения:

<layout xmlns:android="http://schemas.android.com/apk/res/android">

После изменения этого исключения очищено:

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

Я не знаю, как это работает, но это сработало !!! Так что любой, кто знает, что там происходит, может объяснить, пожалуйста!

0 голосов
/ 11 сентября 2018

Ваша проблема может быть в этом методе,

override fun onBindViewHolder(holder: ViewHolder, position: Int) {
   val feedItem = getItem(position)
   if(feedItem != null){
      holder.bind(feedItem)
   }
}

Ваш ViewHolder использует poisition из параметра метода, который может быть несовместимым

Смотрите здесь ,

Итак, вы должны изменить строку на это:

val feedItem = getItem(holder.adapterPosition)

вместо

val feedItem = getItem(position)

Я надеюсь, что это решит проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...