把开源库导入之后,在自己的工程右击Android的library添加导入的开源工程,就能正常使用
使用方法:
<com.etsy.android.grid.StaggeredGridView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/grid_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:item_margin="8dp"
app:column_count="@integer/grid_column_count" />
mGridView = (StaggeredGridView) findViewById(R.id.grid_view);
一个一个看,首先是setScrollListener:
@Override
public void onScrollStateChanged(final AbsListView view, final int scrollState) {
Log.d(TAG, "onScrollStateChanged:" + scrollState);
}
@Override
public void onScroll(final AbsListView view, final int firstVisibleItem, final int visibleItemCount, final int totalItemCount) {
Log.d(TAG, "onScroll firstVisibleItem:" + firstVisibleItem +
" visibleItemCount:" + visibleItemCount +
" totalItemCount:" + totalItemCount);
// our handling
if (!mHasRequestedMore) {
int lastInScreen = firstVisibleItem + visibleItemCount;
if (lastInScreen >= totalItemCount) {
Log.d(TAG, "onScroll lastInScreen - so load more");
mHasRequestedMore = true;
onLoadMoreItems();
}
}
}
这部分代码的意思,主要看onScroll这个函数,实现的是滑动到底部,动态加载Item的功能,如果当前画面的firstVisibleItem+当前画面的Item数>=总的Item数,表明需要加载新的数据,扩张adapter的数据,还要保证在加载数据的过程中不要又启动加载,不然会乱数据的:
private void onLoadMoreItems() {
final ArrayList<String> sampleData = SampleData.generateSampleData();
for (String data : sampleData) {
mAdapter.add(data);
}
// stash all the data in our backing store
mData.addAll(sampleData);
// notify the adapter that we can update now
mAdapter.notifyDataSetChanged();
mHasRequestedMore = false;
}
这里的例子就是用mHasRequestedMore来控制的,进入加载数据之前把这个改true,然后再滑动就不能再开启加载了,直到这次加载完成之后才能再次启动加载的,在加载数据的函数中加载完了就把这个mHasRequestedMore设回去就行。如果使用的是线程来启动加载除了使用这种标志还可以判断线程是否active中来看是不是出于加载期间。
最后就是按Item的响应:
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
Toast.makeText(this, "Item Clicked: " + position, Toast.LENGTH_SHORT).show();
}
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id)
{
Toast.makeText(this, "Item Long Clicked: " + position, Toast.LENGTH_SHORT).show();
return true;
}