Added ArrayAdapterCompat so addAll doesn't need to be wrapped in a guard condition.

This commit is contained in:
Peter Serwylo 2014-02-11 10:12:29 +11:00
parent ef784dffa8
commit 7ca6db9555
2 changed files with 59 additions and 26 deletions

View File

@ -0,0 +1,22 @@
package org.fdroid.fdroid.compat;
import android.annotation.TargetApi;
import android.os.Build;
import android.widget.ArrayAdapter;
import java.util.List;
public class ArrayAdapterCompat {
@TargetApi(11)
public static <T> void addAll(ArrayAdapter<T> adapter, List<T> list) {
if (Build.VERSION.SDK_INT >= 11) {
adapter.addAll(list);
} else {
for (T category : list) {
adapter.add(category);
}
}
}
}

View File

@ -3,7 +3,9 @@ package org.fdroid.fdroid.views.fragments;
import android.database.ContentObserver;
import android.database.Cursor;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.support.v4.app.LoaderManager;
import android.util.Log;
import android.view.LayoutInflater;
@ -12,6 +14,7 @@ import android.view.ViewGroup;
import android.widget.*;
import org.fdroid.fdroid.Preferences;
import org.fdroid.fdroid.R;
import org.fdroid.fdroid.compat.ArrayAdapterCompat;
import org.fdroid.fdroid.data.AppProvider;
import org.fdroid.fdroid.views.AppListAdapter;
import org.fdroid.fdroid.views.AvailableAppListAdapter;
@ -43,6 +46,36 @@ public class AvailableAppsFragment extends AppListFragment implements
return adapter;
}
private class CategoryObserver extends ContentObserver {
private ArrayAdapter adapter;
public CategoryObserver(ArrayAdapter<String> adapter) {
super(null);
this.adapter = adapter;
}
@Override
public void onChange(boolean selfChange) {
// Wanted to just do this update here, but android tells
// me that "Only the original thread that created a view
// hierarchy can touch its views."
getActivity().runOnUiThread( new Runnable() {
@Override
public void run() {
adapter.clear();
List<String> catList = AppProvider.Helper.categories(getActivity());
ArrayAdapterCompat.addAll(adapter, catList);
}
});
}
@Override
public void onChange(boolean selfChange, Uri uri) {
onChange(selfChange);
}
}
private Spinner createCategorySpinner() {
final List<String> categories = AppProvider.Helper.categories(getActivity());
@ -52,36 +85,14 @@ public class AvailableAppsFragment extends AppListFragment implements
// functionality do its stuff.
spinner.setId(R.id.categorySpinner);
final ArrayAdapter<String> adapter = new ArrayAdapter<String>(
getActivity(), android.R.layout.simple_spinner_item, categories);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(
getActivity(), android.R.layout.simple_spinner_item, categories);
adapter.setDropDownViewResource(
android.R.layout.simple_spinner_dropdown_item);
android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);
getActivity().getContentResolver().registerContentObserver(
AppProvider.getContentUri(), false,
new ContentObserver(null) {
@Override
public void onChange(boolean selfChange) {
// Wanted to just do this update here, but android tells
// me that "Only the original thread that created a view
// hierarchy can touch its views."
getActivity().runOnUiThread( new Runnable() {
@Override
public void run() {
adapter.clear();
adapter.addAll(AppProvider.Helper.categories(getActivity()));
// adapter.notifyDataSetChanged();
}
});
}
@Override
public void onChange(boolean selfChange, Uri uri) {
onChange(selfChange);
}
}
);
AppProvider.getContentUri(), false, new CategoryObserver(adapter));
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override