簡體   English   中英

如何突出顯示“回收者視圖”的單行或項目,以及將突出顯示的行滾動到屏幕頂部

[英]How to Highlight Single Row or Item of Recycler View and Scroll the Highlighted Row to Top of screen

我想高亮顯示一行recyclerview並依次發出聲音,然后將高亮顯示行滾動到屏幕頂部,這就是我所做的:

屏幕截圖

這里是它的代碼:

 fun AnimateToSurahAlFeel(recyclerView: RecyclerView, layoutManager: LinearLayoutManager, currentPosition: Int) {

        var position: Int = currentPosition / 1000


        when (position) {


            0 -> {
                recyclerView.smoothScrollToPosition(0)
                recyclerView.getChildAt(0).isSelected = true

            }
            4 -> {
                recyclerView.smoothScrollToPosition(1)
                recyclerView.getChildAt(0).isSelected = false
                recyclerView.getChildAt(1).isSelected = true
            }
            11 -> {
                recyclerView.smoothScrollToPosition(2)
                recyclerView.getChildAt(1).isSelected = false
                recyclerView.getChildAt(2).isSelected = true
            }
            17 -> {
                recyclerView.smoothScrollToPosition(3)
                recyclerView.getChildAt(2).isSelected = false
                recyclerView.getChildAt(3).isSelected = true
            }
            21 -> {
                recyclerView.smoothScrollToPosition(4)
                recyclerView.getChildAt(3).isSelected = false
                recyclerView.getChildAt(4).isSelected = true
            }
            28 -> {
                recyclerView.smoothScrollToPosition(5)
                recyclerView.getChildAt(4).isSelected = false

                if (recyclerView.getChildAt(5) != null)
                    recyclerView.getChildAt(5).isSelected = true
            }

        }
    }

在函數中currentPosition是媒體播放器的當前位置

此代碼中的問題是:

在屏幕快照中,當前不可見第4行和第5行,當突出顯示第4行和第5行時應用崩潰並給出Null Pointer Exception,據我所知,這兩個行尚未創建,這就是為什么

recyclerview.getChildAt(4)recyclerview.getChildAt(5)返回null並導致應用程序崩潰。

現在

  1. 如何修復recyclerview.getchildAt(4)或recyclerview.getchildAt(5)返回null且getChildAt(position)返回n-1行的App崩潰,因此無論如何我都會發生recyclerview.getchildAt(5)的App崩潰想要n行,因為我要突出顯示所有行

  2. 如何將突出顯示的行滾動到位置0(在頂部),即行0從屏幕上移,行1移到該位置,依此類推...

我想這樣實現,突出顯示的一個在頂部,當另一行突出顯示時,它將從屏幕上消失

圖片

您需要時間來綁定View 只為前。 您可以發布動作。

....
 17 -> {
                recyclerView.smoothScrollToPosition(3)
                new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {

                      recyclerView.getChildAt(2).isSelected = false
                      recyclerView.getChildAt(3).isSelected = true
                }, 500);
            }
....

但是我強烈建議您使用一些狀態Collection ,它將保存和處理運行和顯示Views

這是因為回收者視圖並沒有將所有視圖都誇大,而只顯示了可見的視圖。 這是設計使然,不應加以修改。 就個人而言,我認為您應該使用回收功能。

您需要在適配器中使所選狀態成為模型的一部分-適配器中的項目。 假設這稱為RowItem ,因此在您的適配器中,將有一個RowItem的列表。 除了兩種語言的文本外,您還需要添加所選狀態。 然后,只需獲取列表的適配器,將正確的位置設置為selected,然后取消選擇所需的適配器即可。

例如,在您的適配器中:

fun select(position: Int) {
  data[position].selected = true
  notifyItemChanged(position)
  // deselect all other positions that you don't want selected
}

綁定視圖持有者后,您可以執行以下操作:

public void onBindViewHolder(ViewHolder viewHolder, int position) {
   val item = data[position]
   viewHolder.itemView.selected = item.selected
   // take care of the rest of the views
}

data將是存儲RowItem的列表。

現在,您可以毫無問題地滾動並將該項設置為選中。 一旦該視圖在回收者視圖中可見,適配器將設置正確的狀態。

可以這么說,因為您的問題中沒有適配器代碼,所以我有點猜測,但是我認為這個想法很容易理解。 您需要更改適配器中的狀態,並讓回收站視圖的實現為您處理它。 畢竟,這樣做的目的是讓回收者視圖根據適配器所適配的模型來回收您的視圖。

請記住,您始終可以從回收者視圖本身獲取適配器。 最后,您可以執行以下操作:

...
0 -> {
     recyclerView.smoothScrollToPosition(0)
     (recyclerView.adapter as MyAdapter).select(0)
}

這里MyAdapter將是您的適配器的類名

對於滾動部分,你可以看看這個

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM