android数据绑定中的listview刷新

时间:2017-05-11 07:17:54

标签: android android-layout data-binding alertdialog android-databinding

我正在使用带有数据绑定概念的Android MVVM架构的应用程序之一。

问题是,当我更新xml的textview时,整个视图都会更新。所以listview会刷新并滚动到顶部位置。我希望在onItem click事件发生时限制listview。

以下xml包含listview。

 <layout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:bind="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools">

        <data>

            <variable
                name="kenoservicesVM"
                type="com.naushad.kenocustomer.landing.KenoServicesVM" />
            <variable
                name="kenoservice"
                type="com.naushad.kenocustomer.landing.KenoService" />

        </data>

        <FrameLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@color/nliveo_transparent"
            android:paddingEnd="20sp"
            android:paddingStart="20sp">

            <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:orientation="vertical">

                <TextView
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:paddingLeft="10dp"
                    android:paddingTop="10dp"
                    android:text="Total"
                    android:textColor="@color/white" />

                <ScrollView
                    android:id="@+id/SCROLLER_ID"
                    android:layout_width="fill_parent"
                    android:layout_height="160sp"
                    android:layout_margin="0sp"
                    android:background="@color/nliveo_transparent"
                    android:fillViewport="true"
                    android:scrollbars="none">

                    <ListView
                        android:id="@+id/lstServices"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
    android:onItemClick="@{kenoservicesVM::onItemClick}"
                        bind:items="@{kenoservicesVM.mList}">

                    </ListView>
                    <!--android:onItemClick="@{kenoservicesVM::onItemClick}"-->
                </ScrollView>
                >

                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:orientation="horizontal"
                    android:weightSum="2">

                    <TextView
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:layout_weight="1"
                        android:paddingLeft="10dp"
                        android:paddingTop="10dp"
                        android:text="Total"
                        android:textColor="@color/white" />

                    <TextView
                        android:id="@+id/totalCharges"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:layout_weight="1"
                        android:gravity="right"
                        android:paddingRight="10dp"
                        android:paddingTop="10dp"

                        android:textColor="@color/white" />
                    <!--android:text="@{kenoservicesVM.totalPrice ?? @string/_0_aed}"-->

                </LinearLayout>

                <RelativeLayout
                    android:id="@+id/your_btn_id"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content">

                    <ImageView
                        android:id="@+id/bgNext"
                        android:layout_width="match_parent"
                        android:layout_height="40dp"
                        android:layout_marginBottom="5dip"
                        android:layout_marginTop="15dip"
                        android:alpha="0.5"
                        android:src="@drawable/blue_round_light_bg" />

                    <Button
                        android:id="@+id/btn_add_card"
                        android:layout_width="fill_parent"
                        android:layout_height="40dp"
                        android:layout_marginBottom="5dip"
                        android:layout_marginTop="15dip"
                        android:background="@drawable/blue_next_bg" />
                </RelativeLayout>

            </LinearLayout>
        </FrameLayout>
    </layout>

以下viewmodel类表示我在xml中使用的viewmodel。

public class KenoServicesVM extends BaseObservable {
    public ObservableArrayList<KenoService> mList = new ObservableArrayList<>();
    private Context mContext;
    @NonNull
    private String mTotalPrice;
    int selectedServiceCharges=0;
    private int bar;

    public ObservableField<String> price;
    Handler handler;

    public KenoServicesVM(List<KenoService> list, Context mContext) {
        mList.addAll(list);
        this.mContext = mContext;
    }

    @NonNull
    public String getTotalPrice() {
        return mTotalPrice;
    }

    public void setTotalPrice(@NonNull String totalPrice) {
        this.mTotalPrice = totalPrice;
//        notifyPropertyChanged(BR.kenoservicesVM);
//        notifyPropertyChanged(BR.totalPrice);
        notifyChange();
//        notifyPropertyChanged(BR.kenoservicesVM);
    }

    @BindingAdapter("bind:items")
    public static void bindList(ListView view, ObservableArrayList<KenoService> list) {
        CustomListAdapter adapter = new CustomListAdapter(list);
        view.setAdapter(adapter);
    }

    public void onItemClick(AdapterView<?> arg0, View arg1,
                            int position, long arg3) {
        if(position == 0) return;
        if(mList.get(position).getSelected())
            mList.get(position).setSelected(false);
        else
            mList.get(position).setSelected(true);


        for (int i=0 ;i<mList.size();i++){
            KenoService keno = mList.get(i);
            if(keno.getSelected())
                selectedServiceCharges +=Integer.parseInt(keno.getKenoServiceCharge());
        }
        /*handler =  new Handler();
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                handler.post(new Runnable() {
                    @Override
                    public void run() {

                        price = new ObservableField<>(selectedServiceCharges +" AED");
                    }
                });

            }
        };
        new Thread(runnable).start();*/

        setTotalPrice(selectedServiceCharges  +" AED");
//        dialogueServicesBinding.totalCharges.setText(selectedServiceCharges +" AED");

//        mTotalPrice = selectedServiceCharges +" AED";
//        ModuleManager.startActivity(ModuleManager.DISPATCH_MODULE, DispatchModule.STATE_FORGOTPASSWORD, (Activity) mContext);
    }
}

我是Android数据绑定概念的新手。当我点击listview项目并刷新视图时,请帮我解决这个问题。提前谢谢。

2 个答案:

答案 0 :(得分:4)

您需要使用Bindable作为属性。

@NonNull
@Bindable
public String getTotalPrice() {
    return mTotalPrice;
}

这将创建BR.totalPrice字段,您可以调用

notifyPropertyChanged(BR.totalPrice);

并且文本应该随之更新

android:text="@{kenoservicesVM.totalPrice ?? @string/_0_aed}"

此外@NonNull是您可能无法容纳的承诺。考虑添加默认值。

答案 1 :(得分:0)

抱歉,由于声誉我不能发表评论,但我之前碰到了类似的问题之一,你可以在你的setTotalPrice方法中传递mList并定位,然后调用notifyItemChanged而不是notifyChange,这样它只会更新列表中指定位置的项目

public void setTotalPrice(@NonNull String totalPrice, int position, ObservableArrayList<KenoService> mList, TextView totalCharges) {
    this.mTotalPrice = totalPrice;
    mList.notifyItemChanged(position);
    totalCharges.setText(//whatever u need here);
    totalCharges.invalidate(); 
}