我正在使用带有数据绑定概念的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项目并刷新视图时,请帮我解决这个问题。提前谢谢。
答案 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();
}