Reputation: 1424
I have a listView
containing some Spinner
s. I want to update the Spinner
s when I select an item. For example:
{A, B, C}
{1, 2, 3, 4, 5}
{a, b, c, d, e, f, g, h}
If I select A, I want to have:
{A, B, C}
{1, 2}
{d, e, f, g, h}
And if I select 1 :
{A, B, C}
{1, 2}
{d, e, f}
I guess I have to update the adapters, but I'm a bit confused about the getView()
method and how to update the adapters.
I know how to have the good list, my problem is that the data don't update when I want (it's not shown).
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();
}
}
}
}
EDIT : I updated my code. I'm getting the correct data at the beginning but when I click on an item it doesn't update the others spinners even if the data seems to be the one I need in the log. Moreover, I am getting problems to get the correct spinner selected. I have a variable called "pos" which is supposed to be the position of my spinner in my listView but its value is always 0.
Thank you in advance for any help you can give me.
Upvotes: 1
Views: 270
Reputation: 1424
I finally solved my problem.
An adapter keeps the reference for the list we give it, so I had to declare different lists (not just make a list in my constructor then make something like list = db.getList()). Moreover, if we want to use notifyDataSetChanged() it works only if we use methods on the list it has in reference like add(), clear(), remove()... We can't reassign the list with something like list = db.getListUpdated().
For the problem of getting the right spinner in my list, I used the tags : I set a tag with the number of the spinner in my list on this spinner, then in my listener I use the Tag that I can find in my AdapterView to get the good spinner and all the things I need to get about it (like for example, the "type" of the spinner, "City" for a spinner containing cities).
Upvotes: 0
Reputation: 55340
You shouldn't need to change the getView()
logic. Just change the data associated to the adapters that must be updated, and call notifyDataSetChanged() on them. The view to which the adapter is bound will then update itself automatically.
Upvotes: 1