簡體   English   中英

將更改的變量傳遞給RecyclerView Adapter

[英]Passing changing variables to RecyclerView Adapter

我有一個自定義的RecyclerView.Adapter ,用於呈現列表的布局。 在父活動中,我有兩個可以從UI更改的變量。 這些參數用於呈現RecyclerView項的一部分。

我知道我可以通過Adapter構造函數傳遞一些數據,但這是一次性的事情。 如何將數據傳遞到適配器並即時更改它?

使您的適配器實現自定義接口,在其中定義用於傳遞/獲取數據的方法。

您始終可以將所需的任何公共方法添加到適配器,然后直接調用它們。 您可以保存到您的適配器參考您的Activity或鑄鐵的結果recyclerView.getAdapter()

mAdapter = new YourAdapter();
mRecyclerView.setAdapter(mAdapter);
...
mAdapter.yourCustomMethod(data);

要么

YourAdapter adapter = (YourAdapter) recyclerView.getAdapter();
...
adapter.yourCustomMethod(data);

最佳方法

使用DataBinding 使用DataBinding您可以將類中的字段標記為@Bindable ,然后調用notifyPropertyChanged(BR.field_name)來更新該屬性的顯示方式。 這是小教程:

class Test extends BaseObservable{
@Bindable
String testString;

...

    public void setTestString(String newStr){
        this.testString = newStr;
        notifyPropertyChanged(BR.testString);
    }
...
}

並在您的布局中

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

<data>
    <variable
        name="test"
        type="com.yout.package.name.Test"/>
</data>
<FrameLayout 
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" 
        android:text="@{test.testString}"/>
</FrameLayout>
</layout>

通過這種方式,您可以簡單地遍歷Test對象的List並調用setTestString來更新所有視圖(僅更新相關的TextView )。 是有關如何開始使用DataBinding的指南

體面的方法

在您的RecyclerView.Adapter您有方法notifyItemChanged(int position, Object payload) 只需調用此方法並將更新作為payload參數傳遞即可。 然后是一個onBindViewHolder(VH holder, int position, List<Object> payloads) ,您可以在其中更新視圖。

那就是當您使用RecyclerView.Adapter的notifyDataSetChanged()方法(如docs此處所述 )通過您的UI 立即更新RecyclerView中的數據時。

在適配器內部,您可以添加如下方法:

public void setPropX(yourType propxVal){
    mPropX = propXVal; //Set the value of you property
    notifyDataSetChanged(); //Redraw all the elements
}

在您的活動中存儲適配器的全局引用,然后在需要時調用上面的函數

暫無
暫無

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

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