You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android中AutoCompleteTextView的数据绑定(Java+MVVM架构实现咨询)

Android Java MVVM实现AutoCompleteTextView数据绑定

1. 启用Data Binding

在app模块的build.gradle中开启Data Binding支持:

android {
    ...
    buildFeatures {
        dataBinding true
    }
}

2. 定义数据实体类

创建选项对应的实体类Item.java:

public class Item {
    private String name;

    public Item(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

3. 实现ViewModel层

创建AutoCompleteViewModel.java,负责提供数据源和处理选中逻辑:

import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;
import java.util.ArrayList;
import java.util.List;

public class AutoCompleteViewModel extends ViewModel {
    // 下拉选项数据源
    private final MutableLiveData<List<Item>> itemList = new MutableLiveData<>();
    // 选中的选项
    private final MutableLiveData<Item> selectedItem = new MutableLiveData<>();

    public AutoCompleteViewModel() {
        // 初始化模拟数据
        List<Item> items = new ArrayList<>();
        items.add(new Item("北京"));
        items.add(new Item("上海"));
        items.add(new Item("广州"));
        items.add(new Item("深圳"));
        itemList.setValue(items);
    }

    public MutableLiveData<List<Item>> getItemList() {
        return itemList;
    }

    public MutableLiveData<Item> getSelectedItem() {
        return selectedItem;
    }

    public void setSelectedItem(Item item) {
        selectedItem.setValue(item);
    }
}

4. 自定义适配Adapter

实现AutoCompleteAdapter.java,继承ArrayAdapter适配数据:

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import java.util.List;

public class AutoCompleteAdapter extends ArrayAdapter<Item> {

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

    @NonNull
    @Override
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
        if (convertView == null) {
            convertView = LayoutInflater.from(getContext()).inflate(android.R.layout.simple_dropdown_item_1line, parent, false);
        }
        TextView textView = convertView.findViewById(android.R.id.text1);
        Item item = getItem(position);
        if (item != null) {
            textView.setText(item.getName());
        }
        return convertView;
    }
}

5. 布局文件(Data Binding绑定)

创建activity_main.xml,通过Data Binding关联ViewModel:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <data>
        <variable
            name="viewModel"
            type="com.example.yourpackage.AutoCompleteViewModel" />
    </data>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:padding="16dp">

        <AutoCompleteTextView
            android:id="@+id/autoCompleteTextView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="输入城市名称"
            android:completionThreshold="1" />

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="16dp"
            android:text="选中的城市: @{viewModel.selectedItem.name}" />
    </LinearLayout>
</layout>

6. Activity中完成绑定与逻辑处理

在MainActivity.java中初始化ViewModel、Adapter,并设置选中监听:

import androidx.appcompat.app.AppCompatActivity;
import androidx.databinding.DataBindingUtil;
import androidx.lifecycle.ViewModelProvider;
import android.os.Bundle;
import android.widget.AdapterView;
import com.example.yourpackage.AutoCompleteAdapter;
import com.example.yourpackage.AutoCompleteViewModel;
import com.example.yourpackage.databinding.ActivityMainBinding;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
        
        // 获取ViewModel实例
        AutoCompleteViewModel viewModel = new ViewModelProvider(this).get(AutoCompleteViewModel.class);
        binding.setViewModel(viewModel);
        binding.setLifecycleOwner(this);
        
        // 初始化Adapter并绑定到AutoCompleteTextView
        AutoCompleteAdapter adapter = new AutoCompleteAdapter(this, android.R.layout.simple_dropdown_item_1line, viewModel.getItemList().getValue());
        binding.autoCompleteTextView.setAdapter(adapter);
        
        // 监听选项选中事件,更新ViewModel中的选中数据
        binding.autoCompleteTextView.setOnItemClickListener((parent, view, position, id) -> {
            Item selected = (Item) parent.getItemAtPosition(position);
            viewModel.setSelectedItem(selected);
        });
    }
}

核心说明

  • completionThreshold:控制输入多少字符后触发下拉建议,示例中设为1。
  • LifecycleOwner:绑定后ViewModel的LiveData会自动感知页面生命周期,实时更新UI。
  • 选中值传递:通过点击监听获取选中项,通知ViewModel更新selectedItem,布局中的TextView会自动同步显示选中内容。

内容的提问来源于stack exchange,提问作者Garima

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 05:00:32