I have a ListView where I want to display items from more than one adapters, for example two SimpleCursorAdapter
s that come from different queries. Each adapter has its own layout, which don't have to be the same.
I tried with the following wrapper class:
public class MultiListAdapter implements ListAdapter {
private List<ListAdapter> adapters;
private static class PositionResult {
ListAdapter adapter;
int position;
PositionResult(ListAdapter adapter, int position) {
this.adapter = adapter;
this.position = position;
}
}
private PositionResult getInternalPosition(int position) {
int i = 0;
int result = position;
for (ListAdapter adapter: adapters) {
int count = adapter.getCount();
if (result < count) {
return new PositionResult(adapter, result);
}
result -= count;
++i;
}
return null;
}
public MultiListAdapter(List<ListAdapter> adapters) {
this.adapters = adapters;
}
@Override
public int getCount() {
int result = 0;
int i = 0;
for (ListAdapter adapter: adapters) {
int c = adapter.getCount();
result += c;
}
return result;
}
@Override
public Object getItem(int position) {
PositionResult p = getInternalPosition(position);
return p.adapter.getItem(p.position);
}
@Override
public long getItemId(int position) {
PositionResult p = getInternalPosition(position);
return p.adapter.getItemId(p.position);
}
@Override
public int getItemViewType(int position) {
PositionResult p = getInternalPosition(position);
return p.adapter.getItemViewType(p.position);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
PositionResult p = getInternalPosition(position);
return p.adapter.getView(p.position, convertView, parent);
}
@Override
public int getViewTypeCount() {
int result = 0;
for (ListAdapter adapter: adapters) {
result += adapter.getViewTypeCount();
}
return result;
}
@Override
public boolean hasStableIds() {
for (ListAdapter adapter: adapters) {
if (!adapter.hasStableIds()) {
return false;
}
}
return true;
}
@Override
public boolean isEmpty() {
for (ListAdapter adapter: adapters) {
if (!adapter.isEmpty()) {
return false;
}
}
return true;
}
@Override
public void registerDataSetObserver(DataSetObserver observer) {
for (ListAdapter adapter: adapters) {
adapter.registerDataSetObserver(observer);
}
}
@Override
public void unregisterDataSetObserver(DataSetObserver observer) {
for (ListAdapter adapter: adapters) {
adapter.unregisterDataSetObserver(observer);
}
}
@Override
public boolean areAllItemsEnabled() {
for (ListAdapter adapter: adapters) {
if (!adapter.areAllItemsEnabled()) {
return false;
}
}
return true;
}
@Override
public boolean isEnabled(int position) {
PositionResult p = getInternalPosition(position);
return p.adapter.isEnabled(p.position);
}
}
This works if I only have a few elements in each list. But if it has more, and I need to scroll, then the list breaks completely, displays the elements mixed up, and when I click on them, they even give me different positions than their real position.
What's wrong with the code above?