У меня есть практически все в одном макете, в котором есть все необходимое для основного канала моего приложения. Все переменные элементы (изображения, миниатюры видео .. Et c.) Этот макет создается из фрагмента, который имеет список элементов, содержащих статьи с одного сайта, и из этого фрагмента я передаю URL-адрес, с которого я анализирую информацию в моем newsDetailsParser. В некоторых представлениях, где у меня мало текста, изображения не дублируются, но в других, в которых много текста, каждый раз, когда я прокручиваю экран сверху вниз или назад, он дублируется. И дублирует только изображение, любой другой элемент, такой как текст, заголовок, подзаголовок, я вижу правильно. Я не знаю, почему это происходит, и мне нужна помощь.
Видео с моей проблемой
Этот проект на GitHub
Может быть, вы посоветовали отключить обновление (onScroll или onClick, я не знаю, какое именно) этого представления после первого открытия?
Это изображение представляет собой статью с несколькими строками текста и когда я прокручиваю все в порядке
статья с небольшим количеством текста после прокрутки (все в порядке)
Но это происходит, когда я пытаюсь прокрутить статью с большим количеством текста
до прокрутки
после нескольких прокруток
Функция, с которой я начинаю это намерение
adapter.setOnItemClickListener { item: Item<GroupieViewHolder>, view ->
val newsAdapter = item as NewsAdapter
val intent = Intent(view.context, NewsDetails::class.java)
intent.putExtra("refUrl", newsAdapter.getRef())
startActivity(view.context, intent, intent.extras)
}
Класс элемента
class NewsDetailsItem(val title: String, var imgRef: String,
val subTitle: String, val text: String,
val videoRef: String, val detailsName: String,
val detailsString: String, val titleText : String) {
constructor() : this("","","","","", "","","")
}
Основной класс
class NewsDetails : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.fragment_activity_news_details)
var refUrl: String? = intent.extras?.getString("refUrl")
intent.extras?.clear()
val adapter = GroupAdapter<GroupieViewHolder>()
adapter.add(NewsDetailsAdapter(NewsDetailsItem("", "", "", "", "", "", "", "")))
recycler_view_news_details.adapter = adapter
NewsDetailsParser.fetchData(refUrl, recycler_view_news_details)
}
}
Анализатор классов
class NewsDetailsParser {
companion object {
fun fetchData(refUrl: String?, recycler_view_news_details: RecyclerView) {
GlobalScope.launch {
try {
val document = Jsoup.connect(refUrl).get()
val adapter = GroupAdapter<GroupieViewHolder>()
val elementHeader = document.select("div[class=article-page__header]")
val elementPagePoster = document.select("div[class=article-page__poster]")
val elementLeftAside = document.getElementsByClass("staff__item")
var elementContent1 = document.select("div[class=introduction]")
elementContent1 = elementContent1.select("p")
val elementContent2 = document.select("div[class=article-page__article layout__content-col]")
println("ELEMENT 1 : $elementContent1")
//println("ELEMENT 2 : $elementContent2")
for(i in 0 until elementHeader.size) {
val title = elementHeader
.select("h1")
.eq(i)
.text()
val subTitle = elementHeader
.select("p")
.eq(i)
.text()
adapter.add(NewsDetailsAdapter(NewsDetailsItem(title, "", "", "", "", "", "", "")))
adapter.add(NewsDetailsAdapter(NewsDetailsItem("", "", subTitle, "", "", "", "", "")))
}
for(i in 0 until elementPagePoster.size) {
var imgRef = elementPagePoster
.select("img")
.attr("srcset")
imgRef = imgRef.dropLast(3)
adapter.add(NewsDetailsAdapter(NewsDetailsItem("", imgRef, "", "", "", "", "", "")))
}
for(i in 0 until elementLeftAside.size) {
var detailsName = elementLeftAside[i]
.select("span[class=position uppercase]")
.text()
var detailsString = elementLeftAside[i]
.select("span")
.not("span[class=position uppercase]")
.text()
adapter.add(NewsDetailsAdapter(NewsDetailsItem("", "", "", "", "", detailsName, "", "")))
adapter.add(NewsDetailsAdapter(NewsDetailsItem("", "", "", "", "", "", detailsString, "")))
}
for(i in 0 until elementContent1.size) {
val text = elementContent1
.select("p")
.eq(i)
.text()
adapter.add(NewsDetailsAdapter(NewsDetailsItem("", "", "", text, "", "", "", "")))
}
GlobalScope.launch(Dispatchers.Main) {
recycler_view_news_details.adapter = adapter
}
} catch (e : IOException) {
e.printStackTrace()
}
}
}
}
}
Адаптер класса
class NewsDetailsAdapter(private val newsDetailsItem: NewsDetailsItem) : Item<GroupieViewHolder>() {
@SuppressLint("SetTextI18n")
override fun bind(viewHolder: GroupieViewHolder, position: Int) {
//title
viewHolder.itemView.row_title_news_details_item.text = newsDetailsItem.title
//subTitle
viewHolder.itemView.row_subTitle_news_details_item.text = newsDetailsItem.subTitle
//image
if(newsDetailsItem.imgRef != "") {
Picasso.get().load(newsDetailsItem.imgRef).into(viewHolder.itemView.row_img_news_details_item)
}
//detailsName
viewHolder.itemView.row_left_aside_title_news_details_name_item.text = newsDetailsItem.detailsName
//detailsString
viewHolder.itemView.row_left_aside_title_news_details_string_item.text = newsDetailsItem.detailsString
//text
viewHolder.itemView.row_text_news_details_item.text = " ${newsDetailsItem.text}"
}
override fun getLayout(): Int {
return R.layout.news_details_item
}
}
xml макет товара:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/row_img_news_details_item"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:contentDescription="@string/image"
android:layout_marginTop="-15dp"/>
<TextView
android:id="@+id/row_title_news_details_item"
android:layout_width="wrap_content"
android:layout_marginTop="3dp"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:text=""
android:textSize="30sp"
android:textColor="@color/black"
android:textStyle="bold"
android:gravity="center"
android:textColorHighlight="@color/black"/>
<TextView
android:id="@+id/row_subTitle_news_details_item"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=""
android:layout_centerHorizontal="true"
android:layout_marginTop="10dp"
android:textSize="16sp"
android:gravity="center"
android:textColor="@color/black"
android:textColorHighlight="@color/black"
android:textStyle="italic"/>
<TextView
android:id="@+id/row_left_aside_title_news_details_name_item"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="start"
android:textSize="20sp"
android:textStyle="bold"
android:textColor="@color/black"
android:text=""
android:layout_marginStart="20dp"
android:layout_marginTop="0dp"
/>
<TextView
android:id="@+id/row_left_aside_title_news_details_string_item"
android:layout_width="200dp"
android:layout_height="wrap_content"
android:gravity="start"
android:textSize="18sp"
android:textColor="@color/black"
android:text=""
android:layout_marginStart="20dp"
android:layout_marginTop="-6dp"
/>
<TextView
android:id="@+id/row_text_title_news_details_item"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="start"
android:textSize="20sp"
android:textStyle="bold"
android:layout_marginStart="10dp"
android:layout_marginTop="10dp"
android:text=""
android:textColor="@color/black"/>
<TextView
android:id="@+id/row_text_news_details_item"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="start"
android:textSize="18sp"
android:textStyle="italic"
android:text=""
android:textColor="@color/black" />
</RelativeLayout>
макет этого намерения (xml):
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:background="@color/white"
android:id="@+id/fragment_news_details">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_view_news_details"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</RelativeLayout>