Проблема с использованием зависимого счетчика (Multiple spinner) в android - PullRequest
0 голосов
/ 09 марта 2020

Я пытаюсь заполнить значение следующего счетчика из предыдущего счетчика. В этом случае то, что я сделал, - это генерирование всех значений внутри средства вращения, независимо от того, какое значение я выберу в предыдущем вращателе, оно всегда показывает все значения в следующем вращателе. Я использую пять счетчиков, которые должны заполнить значения в соответствии с предыдущим. Здесь я использую библиотеку для счетчика. Библиотека выглядит следующим образом.

'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();}
}

Так как я могу избавиться от этой проблемы? Мне нужна помощь.

1 Ответ

0 голосов
/ 09 марта 2020

Вы объявляете все адаптеры одновременно в 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);
}
}

Кроме этой логики фильтрации c зависит от вашего варианта использования.

...