【问题标题】:Problem with using depended spinner (Multiple spinner) in android在android中使用依赖微调器(多个微调器)的问题
【发布时间】:2020-06-20 23:40:09
【问题描述】:

我正在尝试从前一个微调器中填充下一个微调器的值。在这种情况下,我所做的是在微调器中生成所有值,这意味着,无论我在前一个微调器中选择哪个值,它始终会在下一个微调器中显示所有值。我正在使用五个微调器,它们需要根据前一个来填充值。在这里,我使用微调器的库。库如下。

'com.toptoche.searchablespinner:searchablespinnerlibrary:1.3.1'

在这里,我将分享我的整个代码/类以供您参考。没有错误,我在各自的微调器中获取所有值,但我想根据前一个获取值。这是我的代码。

import androidx.appcompat.app.AppCompatActivity;
import com.toptoche.searchablespinnerlibrary.SearchableSpinner;

public class Catchment extends AppCompatActivity implements AdapterView.OnItemSelectedListener {

public ArrayAdapter<String> regionAdapter;
public ArrayAdapter<String> districtAdapter;
public ArrayAdapter<String> upzAdapter;
public ArrayAdapter<String> unionAdapter;
public ArrayAdapter<String> villageAdapter;
public String[] Region = {"1", "2",
};
public String[] District = {"1","2","3","4","5","6","7","8",};
public String[] Upz = {"1","2"...."23";
public String[] Union = {"1","2"...."25"..."50"...."115"};
public String[] Village = { "1","2"...."25"..."50"...."150"...."500"...."947"   };
Button catchment_code;
SearchableSpinner spinner_region, spinner_district, spinner_upz, spinner_union, spinner_village;
String[] region_code;
String[] district_code;
String[] upz_code;
String[] union_code;
String[] vill_code;
int positions;
String test;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_catchment);

    spinner_region = (SearchableSpinner) findViewById(R.id.region);
    spinner_district = (SearchableSpinner) findViewById(R.id.district);
    spinner_upz = (SearchableSpinner) findViewById(R.id.upz);
    spinner_union = (SearchableSpinner) findViewById(R.id.union);
    spinner_village = (SearchableSpinner) findViewById(R.id.village);

    catchment_code = findViewById(R.id.catchment_code);


    // Set spninner adapter
    regionAdapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, Region);
    districtAdapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, District);
    upzAdapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, Upz);
    unionAdapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, Union);
    villageAdapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, Village);

    //Set dropdown to the spinner
    regionAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    districtAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    upzAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    unionAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    villageAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

    //assign to spinner
    spinner_region.setAdapter(regionAdapter);
    spinner_district.setAdapter(districtAdapter);
    spinner_upz.setAdapter(upzAdapter);
    spinner_union.setAdapter(unionAdapter);
    spinner_village.setAdapter(villageAdapter);

    spinner_region.setOnItemSelectedListener(this);
    spinner_district.setOnItemSelectedListener(this);
    spinner_upz.setOnItemSelectedListener(this);
    spinner_union.setOnItemSelectedListener(this);
    spinner_village.setOnItemSelectedListener(this);
}

@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {

    if (parent.getId() == R.id.region) {
        positions = spinner_region.getSelectedItemPosition();
        region_code = this.getResources().getStringArray(R.array.region_code);
        //Toast.makeText(this, region_code[positions], Toast.LENGTH_SHORT).show();
    }
    if (parent.getId() == R.id.district) {
        positions = spinner_district.getSelectedItemPosition();
        district_code = this.getResources().getStringArray(R.array.district_code);
        //Toast.makeText(this, district_code[positions], Toast.LENGTH_SHORT).show();
    }
    if (parent.getId() == R.id.upz) {
        positions = spinner_upz.getSelectedItemPosition();
        upz_code = this.getResources().getStringArray(R.array.upz_code);
        //Toast.makeText(this, upz_code[positions], Toast.LENGTH_SHORT).show();
    }
    if (parent.getId() == R.id.village) {
        positions = spinner_village.getSelectedItemPosition();
        vill_code = this.getResources().getStringArray(R.array.village_code);
        //Toast.makeText(this, vill_code[positions], Toast.LENGTH_LONG).show();
    }
    if (parent.getId() == R.id.union) {
        positions = spinner_union.getSelectedItemPosition();
        union_code = this.getResources().getStringArray(R.array.union_code);
        //Toast.makeText(this, union_code[positions], Toast.LENGTH_SHORT).show();
    }
    if (!(vill_code == null || region_code == null || district_code == null || upz_code == null ||
            union_code == null)) {
        test = region_code[positions] +
                district_code[positions] +
                upz_code[positions] +
                union_code[positions] + vill_code[positions];
        Toast.makeText(this, test, Toast.LENGTH_SHORT).show();
    }
    catchment_code.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            Intent intent = new Intent(Catchment.this, Participant_Details.class);
            intent.putExtra("catment_code", test);
            startActivity(intent);


        }
    });

    //Toast.makeText(this, union_code[positions]+upz_code[positions], Toast.LENGTH_SHORT).show();
}

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

@Override
public void onBackPressed() {
    Intent intent = new Intent(Catchment.this, SplashScreen.class);
    Catchment.this.startActivity(intent);
    Catchment.this.finish();}
}

那么我怎样才能摆脱这个问题呢?我需要帮助。

【问题讨论】:

    标签: android arrays filter android-spinner


    【解决方案1】:

    您在 onCreate() 中一次声明所有适配器。

    而是在 onCreate() 中只声明第一个适配器并使用空值声明其他适配器。

            @Override
        protected void onCreate(Bundle savedInstanceState) {
         --------;
         // Set spninner adapter
            regionAdapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, Region);
            districtAdapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, new String[]());
            upzAdapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, new String[]());
            unionAdapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, new String[]());
            villageAdapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, new String[]());
    
    ------
           spinner_region.setOnItemSelectedListener(this);
    }
    

    现在在 itemSelectedListener 上,如果需要,过滤所需的值并将值添加到下一个所需的适配器并通知值以及将侦听器添加到下一个微调器(添加侦听器取决于您,您希望如何处理这些事情)

    @Override
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
          if (parent.getId() == R.id.region) {
         positions = spinner_region.getSelectedItemPosition();
         String[] filteredDistrict = District.filter(Region[position]) // District.filter is not any predefined function, assuming some filter needed for selected Districts
         districtAdapter.addValues(filteredDistrict);
         districtAdapter.notifyDataSetChanged()
         spinner_district.setOnItemSelectedListener(this);
    }
    }
    

    除此之外的过滤逻辑取决于您的用例。

    【讨论】:

    • 感谢您的反馈,但不幸的是 District.filter 这不起作用。有什么建议吗?
    • 这将是您必须定义的一些函数,用于根据区域选择过滤区域列表。
    • 你能帮我举个例子吗?
    • 好的,假设您在 Regions、District 等之间有一些映射。因此,如果您将 Regions 作为 {"2","3", "5"} 并将 Districts 作为 {"2", "4", "6", "3", "9", "5", "10" },而不是添加一个过滤器,将区域值映射为可被选定区域值整除,因此如果选择“2”作为区域,则过滤后的区域值将变为 {"2", "4", "6", 10} 。希望这会有所帮助
    • 我收到了@Sunny,但我不知道该怎么做?
    猜你喜欢
    • 2012-04-12
    • 1970-01-01
    • 1970-01-01
    • 2016-07-20
    • 1970-01-01
    • 2012-06-02
    • 1970-01-01
    • 2020-05-12
    • 1970-01-01
    相关资源
    最近更新 更多