我有listView
包含一些Spinner
个。我想在选择项目时更新Spinner
。例如:
{A, B, C}
{1, 2, 3, 4, 5}
{a, b, c, d, e, f, g, h}
如果我选择A,我希望:
{A, B, C}
{1, 2}
{d, e, f, g, h}
如果我选择1:
{A, B, C}
{1, 2}
{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.
提前感谢您提供任何帮助。
答案 0 :(得分:1)
您不需要更改getView()
逻辑。只需更改与必须更新的适配器关联的数据,然后在其上调用notifyDataSetChanged()。然后,适配器绑定到的视图将自动更新。
答案 1 :(得分:0)
我终于解决了我的问题。
适配器保留了我们给它的列表的引用,所以我必须声明不同的列表(不只是在我的构造函数中创建一个列表,然后创建类似list = db.getList())。 此外,如果我们想使用notifyDataSetChanged(),它只有在我们在列表中使用方法时才有效,如add(),clear(),remove()...我们不能用列表之类的东西重新分配列表= db.getListUpdated()。
对于在我的列表中获取正确的微调器的问题,我使用了标签:我在此微调器上设置了一个带有微调器编号的标签,然后在我的监听器中我使用了我可以找到的标签我的AdapterView得到了好的微调器和我需要的所有东西(例如,微调器的“类型”,包含城市的微调器的“城市”)。