aed*_*777 2 android android-recyclerview
我的ViewHolder意思是根据在RecyclerView带a 的两个列的左侧还是右侧出现不同的外观GridLayoutManager。注意视图两侧的连接线:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="wrap_content"
android:layout_marginTop="12px"
android:layout_marginBottom="12px"
android:layout_gravity="center"
android:gravity="center_vertical"
android:layout_height="wrap_content"
android:id="@+id/citation_select_holder">
<ImageView
android:src="@drawable/connector_line"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:id="@+id/citation_select_connector_right"/>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="348px"
android:layout_height="104px"
android:layout_weight="1"
android:background="@drawable/button_background_white"
android:id="@+id/citation_select_citation_holder">
<LinearLayout android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_centerVertical="true"
android:layout_alignParentLeft="true"
android:layout_marginLeft="28px"
>
<TextView
tools:text="123456"
android:textAppearance="@style/citation_select_item_number"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/citation_select_citation_number_text"/>
<TextView
tools:text="Pay by: Nov 18th, 2019"
android:textAppearance="@style/citation_select_item_due_date"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/citation_select_due_date_text"/>
<TextView
tools:text="a category label"
android:textAppearance="@style/citation_select_item_category"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/citation_select_category_text"/>
</LinearLayout>
<TextView
tools:text="$10.00"
android:textAppearance="@style/citation_select_item_cost"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:id="@+id/citation_select_cost_text" android:layout_marginRight="28px"/>
</RelativeLayout>
<ImageView
android:src="@drawable/connector_line"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:id="@+id/citation_select_connector_left"/>
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)
onBindViewHolder调用时,远离视图所在一侧的连接器线将消失,并且边距也会相应更新。
if (position % 2 == 0) {
holder.itemView.findViewById<ImageView>(R.id.citation_select_connector_left).visibility = View.GONE
val marginLayoutParams1 = holder.citationHolder.layoutParams as GridLayoutManager.LayoutParams
marginLayoutParams1.setMargins(0, 12, 12, 12)
holder.itemView.findViewById<LinearLayout>(R.id.citation_select_holder).layoutParams =
marginLayoutParams1
} else {
holder.itemView.findViewById<ImageView>(R.id.citation_select_connector_right).visibility = View.GONE
val marginLayoutParams2 = holder.citationHolder.layoutParams as GridLayoutManager.LayoutParams
marginLayoutParams2.setMargins(12, 12, 0, 12)
holder.itemView.findViewById<LinearLayout>(R.id.citation_select_holder).layoutParams =
marginLayoutParams2
}
Run Code Online (Sandbox Code Playgroud)
滚动仅通过屏幕上的按钮以六个增量完成。前两页正常加载:
但是模式在引用14时就开始崩溃了。请注意,引文编号对应的是视图在以下位置的位置RecyclerView:
发生了什么改变行为?
我想我知道有什么可以帮助您解决此问题的。我假设它正在重用旧视图,这是RecyclerView应该的,并且在代码中的任何地方都没有一行将这些connector行的可见性设置回可见的状态。
您应该同时添加GONE可见性的代码以将另一个设置为可见:
if (position % 2 == 0) {
holder.itemView.findViewById<ImageView>(R.id.citation_select_connector_right).visibility = View.VISIBLE
holder.itemView.findViewById<ImageView>(R.id.citation_select_connector_left).visibility = View.GONE
val marginLayoutParams1 = holder.citationHolder.layoutParams as GridLayoutManager.LayoutParams
marginLayoutParams1.setMargins(0, 12, 12, 12)
holder.itemView.findViewById<LinearLayout>(R.id.citation_select_holder).layoutParams =
marginLayoutParams1
} else {
holder.itemView.findViewById<ImageView>(R.id.citation_select_connector_left).visibility = View.VISIBLE
holder.itemView.findViewById<ImageView>(R.id.citation_select_connector_right).visibility = View.GONE
val marginLayoutParams2 = holder.citationHolder.layoutParams as GridLayoutManager.LayoutParams
marginLayoutParams2.setMargins(12, 12, 0, 12)
holder.itemView.findViewById<LinearLayout>(R.id.citation_select_holder).layoutParams =
marginLayoutParams2
}
Run Code Online (Sandbox Code Playgroud)
该RecyclerView会重用一些旧观点,对不对?好吧,由于这两行都VISIBLE在开头,因此您假设这是它们的默认状态。但是,当您设置线条时,GONE您永远不会将它们放回可见状态,因此,如果RecyclerView重用该视图,则不会在其中添加边距,而只会丢失连接线。您总是希望每行代码onBindViewHolder都包含匹配的行以将其还原。