Как я могу предотвратить потерю состояния ScratchView при использовании его вместе с адаптером? - PullRequest
0 голосов
/ 11 июня 2019

В настоящее время я пытаюсь создать скроллируемую сетку ScratchViews, но представления, которые уже были поцарапаны пользователем, выглядят как не поцарапанные, когда пользователь прокручивает вниз и снова делает резервную копию, потому что адаптер перерисовывает каждый из взгляды возвращаются в исходное состояние без царапин.

Я пробовал решения, опубликованные здесь: Я хочу, чтобы мой RecyclerView не перерабатывал некоторые элементы , но предотвращение повторного использования представлений, по-видимому, не препятствует их перерисовке.

Вот мой код:

Фрагмент:

class ScratchOffGameFragment : Fragment() { 

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

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

        var data = ArrayList<ScratchOffGameItem>()

        for (i in 1..20) {
            var aux = ScratchOffGameItem()
            data.add(aux)
        }

        scratchOffGameRecycle.layoutManager = GridLayoutManager(context, 3)
        val scratchOffGameAdapter = ScratchOffGameAdapter(activity!!,data)

       scratchOffGameRecycle.recycledViewPool.setMaxRecycledViews(1,0);
       scratchOffGameRecycle.adapter = scratchOffGameAdapter
    }

Адаптер:

class ScratchOffGameAdapter(var context: Context, private val mData: ArrayList<ScratchOffGameItem>) : RecyclerView.Adapter<ScratchOffGameAdapter.ViewHolder>() {

    private val mInflater: LayoutInflater = LayoutInflater.from(context)
    inner class ViewHolder internal constructor(itemView: View) : RecyclerView.ViewHolder(itemView)

    @NonNull
    override fun onCreateViewHolder(@NonNull parent: ViewGroup, viewType: Int): ViewHolder {
        val view = mInflater.inflate(R.layout.scratch_off_game_item, parent, false)
        return ViewHolder(view)
    }


    // binds the data to the TextView in each cell
    override fun onBindViewHolder(@NonNull holder: ViewHolder, position: Int) {
        holder.setIsRecyclable(false)
    }

    override fun onViewAttachedToWindow(holder: ViewHolder) {
        super.onViewAttachedToWindow(holder)
        ScratchoffController(context)
            .setThresholdPercent(0.80)
            .setTouchRadiusDip(context, 30)
            .attach(holder.itemView.scratch_view, holder.itemView.scratch_view_behind)

    }

    // total number of cells
    override fun getItemCount(): Int {
        return mData.size
    }


    override fun getItemViewType(position: Int): Int {
        return 1
    }

}

Элемент, окрашиваемый адаптером (scratch_off_game_item.xml):

<FrameLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/achievementItem"
    android:layout_width="110dp"
    android:layout_height="90dp"
    android:layout_gravity="center_horizontal"
    android:layout_marginLeft="30dp"
    android:layout_marginTop="20dp"
    android:layout_marginRight="30dp"
    android:background="@drawable/achievements_border">

    <RelativeLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" >

        <RelativeLayout
            android:id="@+id/scratch_view_behind"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@color/white" >

            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:fontFamily="@font/zing_rust_demo_base"
                android:gravity="center"
                android:text="20"
                android:textColor="@color/black"
                android:textSize="24sp"
                android:layout_centerInParent="true"/>
        </RelativeLayout>

        <com.jackpocket.scratchoff.views.ScratchableLinearLayout
            android:id="@+id/scratch_view"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:gravity="center"
            android:background="@color/gold" >
            <ImageView
                android:layout_width="73dp"
                android:layout_height="42dp"
                android:src="@drawable/scratch_here_ic" />
        </com.jackpocket.scratchoff.views.ScratchableLinearLayout>
    </RelativeLayout>
</FrameLayout>

И RecyclerView:

<android.support.v7.widget.RecyclerView
    android:id="@+id/scratchOffGameRecycle"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_below="@id/youWin"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="10dp"
    android:layout_marginRight="50dp"
    android:layout_marginBottom="10dp"
    android:background="@drawable/bg_gold_rectangle"
    android:columnWidth="100dp"
    android:numColumns="3" />

В качестве дополнительной информации я использовал следующие библиотеки: 'com.jackpocket: scratchoff: 1.3.0', 'com.github.cooltechworks: ScratchView: v1.1' в сочетании с утилизатором и сеткой. просмотров безрезультатно.

1 Ответ

0 голосов
/ 19 июня 2019

В итоге я изменил библиотеку scratchoff на эту: 'com.goibibo.libs: scratchcardview: 0.1.6' ('com.jackpocket: scratchoff: 1.3.0' возникли проблемы с настройкой прослушивателя внутри OnBindViewHolder метод) и компромисс, чтобы сохранить только полностью поцарапанные виды, а не частично поцарапанные. Вот модификации, которые я сделал:

OnBindViewHolder:

override fun onBindViewHolder(@NonNull holder: ViewHolder, position: Int) {
    holder.itemView.number.text = mData[position].number
    var scratchRelativeLayoutView = holder.itemView.scratch_card
    holder.setIsRecyclable(false)

    if(mData[position].isScratched && scratchRelativeLayoutView!=null) {
        scratchRelativeLayoutView.visibility = View.GONE
        holder.itemView.numberHidden.text = mData[position].number
        holder.itemView.numberHidden.visibility = View.VISIBLE
    }
    else {
        scratchRelativeLayoutView.setStrokeWidth(5)
        scratchRelativeLayoutView.setScratchView(R.layout.lyt_scratch) // scratchable layout
        scratchRelativeLayoutView.setRevealListener(object : ScratchRelativeLayoutView.IRevealListener {
            override fun onRevealed(tv: ScratchRelativeLayoutView) {
                mData[position].isScratched = true
            }

            override fun onRevealPercentChangedListener(siv: ScratchRelativeLayoutView, percent: Float) {
                if (percent>0.5) {
                    siv.reveal()
                }
            }
        })
    }
}

scratch_off_game_item.xml

<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/achievementItem"
    android:layout_width="90dp"
    android:layout_height="90dp">

    <TextView
        android:id="@+id/numberHidden"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fontFamily="@font/zing_rust_demo_base"
        android:gravity="center"
        android:text="23"
        android:background="@color/white_scratch_off"
        android:textColor="@color/black"
        android:textSize="24sp"
        android:layout_gravity="center"/>

    <com.goibibo.libs.views.ScratchRelativeLayoutView
        android:id="@+id/scratch_card"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/white_scratch_off">

        <TextView
            android:id="@+id/number"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:fontFamily="@font/zing_rust_demo_base"
            android:gravity="center"
            android:textColor="@color/black"
            android:textSize="24sp"
            android:layout_centerInParent="true"/>
     </com.goibibo.libs.views.ScratchRelativeLayoutView>
 </FrameLayout>
...