============ async-expandable-list contains 2 View classes: CollectionView and AsyncExpandableListView.
Gradle:
compile 'com.ericliu.asyncexpandablelist:asyncexpandablelist:1.1.0'
Please make sure you have jcenter() in your project's repository. Check build.gradle file under the project's root directory. Add the following lines if they are missing.
allprojects {
repositories {
jcenter()
}
}
CollectionView displays a list of headers and sub-items:
AsyncExpandableListView displays a list of headers and loads a sub-list under a header when a header item is clicked. The loading of sub-items can be done asynchronously and there are callbacks to populate the data into the list when it's done loading.
<com.ericliu.asyncexpandablelist.CollectionView
android:id="@+id/collectionView"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
public class MainActivity extends Activity implements CollectionViewCallbacks<String, News> {
private CollectionView<String, News> mCollectionView;
private CollectionView.Inventory<String, News> inventory;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mCollectionView = (CollectionView) findViewById(R.id.collectionView);
mCollectionView.setCollectionCallbacks(this);
// the inventory represent all the whole data structure that's gonna be populated into the list.
inventory = new CollectionView.Inventory<>();
int groupOrdinal = 0; // groupOrdinal dictates the sequence of groups to be displayed in the list
CollectionView.InventoryGroup<String, News> group1 = inventory.newGroup(groupOrdinal);
// creating objects to be populated into the list.
News news1 = new News();
...
News news2 = new News(); ......
.......
// set the header item, in this case, it is simply a String.
group1.setHeaderItem("Top Stories");
// add items under this header.
group1.addItem(news1);
group1.addItem(news2);
group1.addItem(news3);
....
mCollectionView.updateInventory(inventory);
All done, the list will display the exact header-items structure.
<com.ericliu.asyncexpandablelist.async.AsyncExpandableListView
android:id="@+id/asyncExpandableCollectionView"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
public class AsyncActivity extends Activity implements AsyncExpandableListViewCallbacks<String, News> {
private AsyncExpandableListView<String, News> mAsyncExpandableListView;
private CollectionView.Inventory<String, News> inventory;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_async);
mAsyncExpandableListView = (AsyncExpandableListView) findViewById(R.id.asyncExpandableCollectionView);
mAsyncExpandableListView.setCallbacks(this);
void onStartLoadingGroup(int groupOrdinal)
method in the AsyncExpandableListViewCallbacks will be triggered on the header item click events, which gives the client a change to trigger loading sub-item data calls. When the call comes back, the client should call the method onFinishLoadingGroup(mGroupOrdinal, items)
on the AsyncExpandableListView instance to display the data as well as updating UI. inventory = new CollectionView.Inventory<>();
CollectionView.InventoryGroup<String, News> group1 = inventory.newGroup(0); // groupOrdinal is the smallest, displayed first
group1.setHeaderItem("Top Stories");
CollectionView.InventoryGroup<String, News> group2 = inventory.newGroup(2); // 2 is the second smallest ordinal, displayed second
group2.setHeaderItem("World");
CollectionView.InventoryGroup<String, News> group3 = inventory.newGroup(3);
group3.setHeaderItem("Australia");
CollectionView.InventoryGroup<String, News> group4 = inventory.newGroup(4);
group4.setHeaderItem("International");
CollectionView.InventoryGroup<String, News> group5 = inventory.newGroup(5);
group5.setHeaderItem("Businesses");
CollectionView.InventoryGroup<String, News> group6 = inventory.newGroup(6);
group6.setHeaderItem("Technology");
mAsyncExpandableListView.updateInventory(inventory);
@Override
public void onStartLoadingGroup(int groupOrdinal) {
new LoadDataTask(groupOrdinal, mAsyncExpandableListView).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}
```
* When the data come back, call ``` onFinishLoadingGroup(mGroupOrdinal, items); ``` to display data.
```java
mAsyncExpandableListView.onFinishLoadingGroup(mGroupOrdinal, items);
Inspired by CollectionView in Google iosche