简体   繁体   中英

data binding is not binding the data with xml in android

want to implementing data binding. I implemented the code, data is comming from API, but it is not binding with xml and not showing any error. So I am confused where is the problem..Kindly help me.

My code

content_policy_info.xml

<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <data>
        <variable
            name="policyinfo"
            type="com.exlservice.lifeprov1.service.model.GetPolicyInfoResponse" />

        <variable
            name="surrenderquote"
            type="com.exlservice.lifeprov1.service.model.SurrenderQuoteResponse" />
    </data>
<android.support.constraint.ConstraintLayout
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:id="@+id/c1"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:context=".view.ui.PolicyInfo"
    tools:showIn="@layout/app_bar_policy_info">
    <android.support.v4.widget.NestedScrollView
        android:layout_width="match_parent"
        android:background="#223d50"
        android:layout_height="match_parent">
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical">
            <LinearLayout android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:orientation="vertical"
                android:background="@drawable/policy_prime_info_bg"
                android:layout_marginTop="20dp"
                android:layout_marginLeft="10dp"
                android:layout_marginRight="10dp"
                >
                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="8dp"
                    android:orientation="horizontal">

                    <TextView
                        android:layout_width="0dp"
                        android:layout_marginLeft="5dp"
                        android:layout_height="wrap_content"
                        android:text="@{policyInfo.ProductId}"
                        android:textColor="#76c6db"
                        android:layout_weight="1"
                        android:typeface="serif"
                        android:textStyle="bold"
                        android:id="@+id/id_fc_first_key"/>
                    <TextView
                        android:layout_width="0dp"
                        android:textColor="#76c6db"
                        android:textStyle="bold"
                        android:typeface="serif"
                        android:layout_height="wrap_content"
                        android:text="@{policyInfo.Contract}"
                        android:layout_weight="1"
                        android:id="@+id/id_fc_second_key"/>

                </LinearLayout>
           </LinearLayout>
    </android.support.v4.widget.NestedScrollView>
</android.support.constraint.ConstraintLayout>
</layout>

Policyinfo.java

public class PolicyInfo extends AppCompatActivity
    implements NavigationView.OnNavigationItemSelectedListener {
APIInterface apiInterface;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    binding= DataBindingUtil.setContentView(this,R.layout.activity_policy_info);
    Intent intent = getIntent();
    String sCompanyCode = intent.getStringExtra("CompanyCode");
    String sPolicyNumber = intent.getStringExtra("PolicyNumber");
    String sWayPoint = intent.getStringExtra("WayPoint");
    Log.e("onCreate: ",sCompanyCode+"   "+sPolicyNumber );
    SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
    String currentTime = sdf.format(new Date());
    SurrenderQuoteInput surrenderQuoteInput = new SurrenderQuoteInput();
    surrenderQuoteInput.setCoderID("TRN7");
    surrenderQuoteInput.setCompanyCode("01");   
    PolicyDetailsReq policyDetailsReq= new PolicyDetailsReq();
    policyDetailsReq.setCoderID("TRN7");

    getPolicyInfoRequest.setPolicyDetailsReq(policyDetailsReq);

    PolicyInfoViewModel.Factory factory = new PolicyInfoViewModel.Factory(
            **getApplication(),getPolicyInfoRequest,surrenderQuoteRequest);
    PolicyInfoViewModel viewModel =
            ViewModelProviders.of(this,factory).get(PolicyInfoViewModel.class);
    **observeViewModel**(viewModel);**

    // show it
    pd.show();
    DrawerLayout drawer =  findViewById(R.id.drawer_layout);
    ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
            this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
    drawer.addDrawerListener(toggle);
    toggle.syncState();

    NavigationView navigationView =  findViewById(R.id.nav_view);
    navigationView.setNavigationItemSelectedListener(this);

}
private void **observeViewModel**(final PolicyInfoViewModel viewModel) {
    // Update the list when the data changes
    viewModel.getPolicyInfoResponsetObservable().observe(this, new Observer<GetPolicyInfoResponse>() 
{
        @Override
        public void onChanged(@Nullable GetPolicyInfoResponse getPolicyInfoResponse) {
            if(getPolicyInfoResponse!=null) {
                viewModel.setPolicyInfoResult(getPolicyInfoResponse);
                binding.setPolicyinfo(getPolicyInfoResponse);
            }

        }

    });
}

This code is for navigation drawer activity, where my all components is in content_policy_info.xml. Please help me out.

Databinding is a VERY useful tool and can save a lot of work time if done properly. I would really recommend reading this guide before trying to implement something on your own. Here I am just highlighting the main steps in the data binding setup

  1. Make sure to enable databinding in your app: In your app gradle add

    dataBinding { enabled = true }

  2. Create a binding specific for your xml file:

    ContentPolicyInfoBinding binding = DataBindingUtil.setContentView(this,R.layout.content_policy_info);

(Maybe you made a mistake there by inflating activity_policy_info instead?

  1. Set binding parameters once as ObservablFields if those parameters should change over time

    ObservablField<GetPolicyInfoResponse> policyInfoField = new ObservablField(); ... binding.policyinfo = policyInfoField;

  2. Change xml to match:

    <import type="com.exlservice.lifeprov1.service.model.GetPolicyInfoResponse"/> <variable name="policyinfo" type="android.databinding.ObservableField&lt;GetPolicyInfoResponse&gt;"/>

  3. Update policyInfoField when new policyInfo arrives

    policyInfoField.set(getPolicyInfoResponse)


But more preferably use a view model, set its fields as bindable. That makes it possible to update the view just by changing fields of the model.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM