简体   繁体   English

如何在具有动态下拉菜单的 Android 中制作表格

[英]How can I make a form in Android which has dynamic drop down

I am very new to android and I am making a form in android.我对 android 很陌生,我正在 android 中制作表格。 I want this form to have 2 drop down list.我希望这个表格有 2 个下拉列表。 In first drop down user has to select the state and the second drop down should show cities of that state only from which user can select any city/district. In first drop down user has to select the state and the second drop down should show cities of that state only from which user can select any city/district.

What you are mentioning dropdown here in android we called it spinner.There is default spinner in android and also you have the option to customize your spinner Here is the official documentation by google how you can use it您在 android 中提到的下拉列表我们称之为微调器。android 中有默认微调器,您还可以选择自定义微调器这是谷歌的官方文档,您可以如何使用它

https://developer.android.com/guide/topics/ui/controls/spinner https://developer.android.com/guide/topics/ui/controls/spinner

[1]. [1]。 After selecting item of your country dropdown like选择您所在国家/地区下拉列表的项目后,例如

spinner_country.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
                if(i>0)
                {
                   //Load your spinner of state and call your data regarding country
                }
            }

            @Override
            public void onNothingSelected(AdapterView<?> adapterView) {

            }
        });

First you need to create 2 different model like below:首先,您需要创建 2 个不同的 model,如下所示:

Create City and State data model like below:创建城市和 State 数据 model 如下所示:

public class State{
    private int id;
    private String name;

    public State(int id, String name){
       this.id=id;
       this.name=name;
    }

    public int getId(){
       return id;
    }

    public void setId(int id){
       this.id= id;
    }
    public String getName(){
       return name;
    }

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

}


public class City{
    private int id;
    private String name;
    private int stateId;

    public State(int id, String name, int stateId){
       this.id=id;
       this.name=name;
       this.stateId=stateId;
    }

    public int getId(){
       return id;
    }

    public void setId(int id){
       this.id= id;
    }
    public String getName(){
       return name;
    }

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

    public int getStateId(){
       return stateId;
    }

    public void setStateId(int id){
       this.stateId= id;
    }

}

Now you need to create Custom Spinner adapter for State:现在您需要为 State 创建自定义微调器适配器:

public class StateSpinnerAdapter extends ArrayAdapter<State> {

    public StateSpinnerAdapter (Context context, ArrayList<State> dataList) {
        super(context, 0, dataList);
    }

    @NonNull
    @Override
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
        return initView(position, convertView, parent);
    }

    @Override
    public View getDropDownView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
        return initView(position, convertView, parent);
    }

    private View initView(int position, View convertView, ViewGroup parent) {
        if (convertView == null) {
            convertView = LayoutInflater.from(getContext()).inflate(
                    R.layout.spinner_row, parent, false
            );
        }
        TextView textViewName = convertView.findViewById(R.id.tv_name);
        District currentItem = getItem(position);
        if (currentItem != null) {
            textViewName.setText(currentItem.getName());
        }
        return convertView;
    }
}

Now you need to make CitySpinnerAdapter like below:现在你需要像下面这样制作 CitySpinnerAdapter:

public class CitySpinnerAdapter extends ArrayAdapter<City> {

    public CitySpinnerAdapter (Context context, ArrayList<City> dataList) {
        super(context, 0, dataList);
    }

    @NonNull
    @Override
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
        return initView(position, convertView, parent);
    }

    @Override
    public View getDropDownView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
        return initView(position, convertView, parent);
    }

    private View initView(int position, View convertView, ViewGroup parent) {
        if (convertView == null) {
            convertView = LayoutInflater.from(getContext()).inflate(
                    R.layout.spinner_row, parent, false
            );
        }
        TextView textViewName = convertView.findViewById(R.id.tv_name);
        Upazila currentItem = getItem(position);
        if (currentItem != null) {
            textViewName.setText(currentItem.getName());
        }
        return convertView;
    }
}

Now MainActivity should be like this:现在 MainActivity 应该是这样的:

public class MainActivity extends AppCompatActivity{

    private Context mContext;
    private Activity mActivity;
    private ArrayList<State> states;
    private ArrayList<City> cities;

    private StateSpinnerAdapter stateAdapter;
    private CitySpinnerAdapter cityAdapter;

   private Spinner spState, spCity;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        initVariable();
        initView();
        initListener();
    }

    private void initVariable() {
        mContext = getApplicationContext();
        mActivity = MainActivity.this;


        states = new ArrayList<>();
        cities = new ArrayList<>();
    }
    private void initView() {
        setContentView(R.layout.activity_main);
        spState = findViewById(R.id.spState);
        spCity = findViewById(R.id.cityState);

        stateAdapter = new StateSpinnerAdapter(mContext,states);
        spState.setAdapter(stateAdapter);

        cityAdapter = new CitySpinnerAdapter(mContext,cities);
        spCity.setAdapter(cityAdapter);

        loadStateData();

    }

    private void initListener(){
        spState.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
                loadCityData(states.get(i).getId());
            }

            @Override
            public void onNothingSelected(AdapterView<?> adapterView) {

            }
        });


    }

    private void loadStateData(){
       states.add(new State(1,"state 1"));
       states.add(new State(2,"state 1"));
       states.add(new State(3,"state 1"));
       states.add(new State(4,"state 1"));
       stateAdapter.notifyDataSetChanged();

    }

    private loadCityData(int stateId){
       ArrayList<City> cityList= new ArrayList<>();
       cityList.add(new City(1,"City 1", 1));
       cityList.add(new City(2,"City 2", 1));
       cityList.add(new City(3,"City 3", 2));
       cityList.add(new City(4,"City 4", 2));
       cityList.add(new City(5,"City 5", 3));
       cityList.add(new City(6,"City 6", 3));
       cityList.add(new City(7,"City 7", 4));
       cityList.add(new City(8,"City 8", 4));

       cities.addAll(cityList.stream().filter(city -> city.getStateId == stateId).collect(Collectors.toList()));
       cityAdapter.notifyDataSetChanged();

    }

}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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