更新多个微调器

时间:2014-05-05 15:59:04

标签: android spinner android-adapter

我有listView包含一些Spinner个。我想在选择项目时更新Spinner。例如:

  • Spinner 1:{A, B, C}
  • Spinner 2:{1, 2, 3, 4, 5}
  • Spinner 3:{a, b, c, d, e, f, g, h}

如果我选择A,我希望:

  • Spinner 1:{A, B, C}
  • Spinner 2:{1, 2}
  • Spinner 3:{d, e, f, g, h}

如果我选择1:

  • Spinner 1:{A, B, C}
  • Spinner 2:{1, 2}
  • Spinner 3:{d, e, f}

我想我必须更新适配器,但我对getView()方法以及如何更新适配器感到有点困惑。

我知道如何获得好的列表,我的问题是数据在我想要时不会更新(它没有显示)。

public class CustomSpinnerAdapter extends BaseAdapter {

    private Context context;
    private ArrayList<Critere> navDrawerItems;
    private int pos;
    public HashMap<String, String> criteres_modif;
    private ArrayList<String> list;
    private ArrayAdapter<String> dataAdapter;
    private ArrayList<Spinner> spinnerList;

    public CustomSpinnerAdapter(Context context,
            ArrayList<Critere> navDrawerItems) {
        this.context = context;
        this.navDrawerItems = navDrawerItems;
        criteres_modif = new HashMap<String, String>();
        spinnerList = new ArrayList<Spinner>();
    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return navDrawerItems.size();
    }

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return navDrawerItems.get(position);
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if (convertView == null) {
            LayoutInflater mInflater = (LayoutInflater) context
                    .getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
            convertView = mInflater.inflate(R.layout.drawer_list_item, null);
            TextView tv = (TextView) convertView.findViewById(R.id.drawerTitle);
            if (tv != null) {
                tv.setText(navDrawerItems.get(position).getLabel());
                spinnerList.add((Spinner) convertView
                        .findViewById(R.id.drawerSpinner));
                DatabaseHelper db = new DatabaseHelper(Catalogue.activity);
                list = db.getCritereDistinct(navDrawerItems.get(position)
                        .getTableCritere(), criteres_modif);
                dataAdapter = new ArrayAdapter<String>(Catalogue.activity,
                        R.layout.item_single_text, list);
                spinnerList.get(position).setAdapter(dataAdapter);
                pos = position;
                spinnerList.get(position).setOnItemSelectedListener(
                        new OnItemSelectedListener() {
                            @Override
                            public void onItemSelected(AdapterView<?> arg0,
                                    View arg1, int arg2, long arg3) {
                                if (arg2 != 0) {

                                    Log.w("Bad pos","pos : " + pos); // Always 0, it must be between 0 and 5 depending on the spinner selected
                                    if (!criteres_modif
                                            .containsKey(navDrawerItems
                                                    .get(pos).getTableCritere())) {
                                        criteres_modif.put(
                                                navDrawerItems.get(pos)
                                                        .getTableCritere(),
                                                navDrawerItems.get(pos)
                                                        .getList().get(arg2));
                                        Log.w("Key not exist", "Clé : "
                                                + navDrawerItems.get(pos)
                                                        .getTableCritere()
                                                + " Val : "
                                                + navDrawerItems.get(pos)
                                                        .getList().get(arg2));
                                    } else {
                                        criteres_modif.remove(navDrawerItems
                                                .get(pos).getTableCritere());
                                        criteres_modif.put(
                                                navDrawerItems.get(pos)
                                                        .getTableCritere(),
                                                navDrawerItems.get(pos)
                                                        .getList().get(arg2));
                                        Log.w("Key exists", "Clé : "
                                                + navDrawerItems.get(pos)
                                                        .getTableCritere()
                                                + " Val : "
                                                + navDrawerItems.get(pos)
                                                        .getList().get(arg2));
                                    }
                                    updateNavSpinners(pos);
                                }
                            }

                            @Override
                            public void onNothingSelected(AdapterView<?> arg0) {
                                // TODO Auto-generated method stub
                            }
                        });
            }
        }
        return convertView;
    }

    public void updateNavSpinners(int position) {
        DatabaseHelper db = new DatabaseHelper(Catalogue.activity);
        for (int i = 0; i < navDrawerItems.size(); i++) {
            if (position != i) {
                navDrawerItems.get(i).setList(
                        db.getCritereDistinct(navDrawerItems.get(i)
                                .getTableCritere(), criteres_modif));
                ((BaseAdapter) spinnerList.get(i).getAdapter())
                        .notifyDataSetChanged();
            }
        }
    }
}

编辑:我更新了我的代码。我在开始时获得正确的数据,但是当我点击某个项目时,即使数据似乎是我在日志中需要的数据,它也不会更新其他的微调器。此外,我遇到问题,以选择正确的微调器。我有一个名为“pos”的变量,它应该是我的listView中我的微调器的位置,但它的值始终为0.

提前感谢您提供任何帮助。

2 个答案:

答案 0 :(得分:1)

您不需要更改getView()逻辑。只需更改与必须更新的适配器关联的数据,然后在其上调用notifyDataSetChanged()。然后,适配器绑定到的视图将自动更新。

答案 1 :(得分:0)

我终于解决了我的问题。

适配器保留了我们给它的列表的引用,所以我必须声明不同的列表(不只是在我的构造函数中创建一个列表,然后创建类似list = db.getList())。 此外,如果我们想使用notifyDataSetChanged(),它只有在我们在列表中使用方法时才有效,如add(),clear(),remove()...我们不能用列表之类的东西重新分配列表= db.getListUpdated()。

对于在我的列表中获取正确的微调器的问题,我使用了标签:我在此微调器上设置了一个带有微调器编号的标签,然后在我的监听器中我使用了我可以找到的标签我的AdapterView得到了好的微调器和我需要的所有东西(例如,微调器的“类型”,包含城市的微调器的“城市”)。