How to display input result in ListView using data binding

Viewed 22

I'm learning custom array adapters using data binding. EditText serves to input "text" when the button is pressed, the inputted text will appear in the listView. However, the text I typed in the EditText doesn't appear.

MainAcivity.java

private Model model = new Model();
private Handlers handlers = new Handlers();
private ViewModel viewModel = new ViewModel(model);
private ArrayList<Model> listItem = new ArrayList<>();
ActivityMainBinding mainBinding = DataBindingUtil.setContentView(this,R.layout.activity_main);


    handlers.setOnClickListener(new MyView.onClickListener() {
        @Override
        public void onDamn(Model model) {
            Model model1 = new Model();
            model1.setText(model1.getText());
            listItem.add(model1);
            viewModel.setAdapter(new CustomAdapter(MainActivity.this, listItem));
            viewModel.getAdapter().notifyDataSetChanged();
        }
    });

    mainBinding.setModel(model);
    mainBinding.setHandlers(handlers);
    mainBinding.setViewModel(viewModel);

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">

    <data>
        <variable
            name="model"
            type="com.example.list.Model" />
        <variable
            name="handlers"
            type="com.example.list.Handlers" />
        <variable
            name="viewModel"
            type="com.example.list.ViewModel" />
    </data>

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:padding="15dp">
        <EditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@={model.text}"
            android:layout_marginTop="10dp"
            app:layout_constraintTop_toTopOf="parent"
            android:layout_marginStart="30dp"
            android:layout_marginEnd="30dp"
            android:hint="hello"/>
        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:onClick="@{() -> handlers.onClickListener.onDamn(model)}"
            app:layout_constraintTop_toTopOf="parent"
            android:layout_marginTop="60dp"
            android:layout_marginStart="45dp"
            android:layout_marginEnd="45dp"
            android:text="damn !"
            android:backgroundTint="@color/black"/>
        <androidx.constraintlayout.widget.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_constraintTop_toTopOf="parent"
            android:layout_marginTop="170dp">
            <ListView
                android:adapter="@{viewModel.adapter}"
                tools:listitem="@layout/activity_item"
                android:layout_width="match_parent"
                android:layout_height="match_parent"/>
        </androidx.constraintlayout.widget.ConstraintLayout>
    </androidx.constraintlayout.widget.ConstraintLayout>



</layout>

activity_item.xml

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:tools="http://schemas.android.com/tools"
    xmlns:android="http://schemas.android.com/apk/res/android">

    <data>
        <variable
            name="viewModel"
            type="com.example.list.ViewModel" />
    </data>

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@{viewModel.modelText}"
            android:textColor="@color/black"
            android:hint="ITEM"
            android:textSize="30sp"
            tools:ignore="MissingConstraints" />
    </androidx.constraintlayout.widget.ConstraintLayout>


</layout>

Model.java

package com.example.list;

public class Model {
    private String text;

    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }
}


*

ViewModel.java*

package com.example.list;

import android.view.View;

import androidx.databinding.BaseObservable;
import androidx.databinding.Bindable;

public class ViewModel extends BaseObservable {
    private Model model;
    public ViewModel(Model model){
        this.model = model;
    }
    public void setModelText(String text){
        model.setText(text);
        notifyPropertyChanged(BR.modelText);
    }
    @Bindable
    public String getModelText(){
        return model.getText();
    }


    private CustomAdapter adapter;

    public void setAdapter(CustomAdapter adapter) {
        this.adapter = adapter;

    }

    public CustomAdapter getAdapter() {
        return adapter;
    }
}

CustomeAdapter

package com.example.list;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.databinding.DataBindingUtil;

import com.example.list.databinding.ActivityItemBinding;

import java.util.ArrayList;
import java.util.List;

public class CustomAdapter extends ArrayAdapter<Model> {
    private Context context;
    private ArrayList<Model> listItem = new ArrayList<>();

    public CustomAdapter(Context context, ArrayList<Model> listItem){
        super(context,0,listItem);
        this.context = context;
        this.listItem = listItem;
    }

    @NonNull
    @Override
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
        ActivityItemBinding itemBinding = null;
        Model model = listItem.get(position);

        if (convertView == null){
            itemBinding = DataBindingUtil.inflate(LayoutInflater.from(parent.getContext()),R.layout.activity_item,parent,false);
            convertView = itemBinding.getRoot();
        }
        ViewModel viewModel = new ViewModel(model);
        viewModel.setModelText(model.getText());

        itemBinding.setViewModel(viewModel);
        return super.getView(position, convertView, parent);
    }

    @Override
    public int getCount() {
        return listItem.size();
    }

    @Nullable
    @Override
    public Model getItem(int position) {
        return listItem.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    public CustomAdapter(@NonNull Context context, int resource) {
        super(context, resource);
    }

    public CustomAdapter(@NonNull Context context, int resource, int textViewResourceId) {
        super(context, resource, textViewResourceId);
    }

    public CustomAdapter(@NonNull Context context, int resource, @NonNull Model[] objects) {
        super(context, resource, objects);
    }

    public CustomAdapter(@NonNull Context context, int resource, int textViewResourceId, @NonNull Model[] objects) {
        super(context, resource, textViewResourceId, objects);
    }

    public CustomAdapter(@NonNull Context context, int resource, @NonNull List<Model> objects) {
        super(context, resource, objects);
    }

    public CustomAdapter(@NonNull Context context, int resource, int textViewResourceId, @NonNull List<Model> objects) {
        super(context, resource, textViewResourceId, objects);
    }
}
0 Answers
Related