效果图:
代码实现
- EndlessGridLayoutActivity.java
/**
* 带HeaderView的分页加载GridLayout RecyclerView
*/
public class EndlessGridLayoutActivity extends AppCompatActivity {
/**
* 服务器端一共多少条数据
*/
private static final int TOTAL_COUNTER = 154;
/**
* 每一页展示多少条数据
*/
private static final int REQUEST_COUNT = 40;
/**
* 已经获取到多少条数据了
*/
private static int mCurrentCounter = 0;
private LRecyclerView mRecyclerView = null;
private MyAdapter mDataAdapter = null;
private PreviewHandler mHandler = new PreviewHandler(this);
private LRecyclerViewAdapter mLRecyclerViewAdapter = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.sample_ll_activity);
mRecyclerView = findViewById(R.id.list);
//setLayoutManager must before setAdapter
GridLayoutManager manager = new GridLayoutManager(this, 2);
mRecyclerView.setLayoutManager(manager);
// mDataAdapter = new DataAdapter(this);
mDataAdapter = new MyAdapter(this);
mLRecyclerViewAdapter = new LRecyclerViewAdapter(mDataAdapter);
mRecyclerView.setAdapter(mLRecyclerViewAdapter);
//设置头部加载颜色
mRecyclerView.setHeaderViewColor(R.color.colorAccent, R.color.dark, android.R.color.white);
//设置底部加载颜色
mRecyclerView.setFooterViewColor(R.color.colorAccent, R.color.dark, android.R.color.white);
//设置底部加载文字提示
mRecyclerView.setFooterViewHint("拼命加载中", "已经全部为你呈现了", "网络不给力啊,点击再试一次吧");
int spacing = getResources().getDimensionPixelSize(R.dimen.dp_4);
mRecyclerView.addItemDecoration(SpacesItemDecoration.newInstance(spacing, spacing, manager.getSpanCount(), Color.GRAY));
mRecyclerView.setHasFixedSize(true);
mLRecyclerViewAdapter.addHeaderView(View.inflate(this, R.layout.sample_header, null));
mRecyclerView.setOnRefreshListener(new OnRefreshListener() {
@Override
public void onRefresh() {
mCurrentCounter = 0;
mDataAdapter.clear();
requestData();
}
});
mRecyclerView.setOnLoadMoreListener(new OnLoadMoreListener() {
@Override
public void onLoadMore() {
if (mCurrentCounter < TOTAL_COUNTER) {
// loading more
requestData();
} else {
//the end
mRecyclerView.setNoMore(true);
}
}
});
mRecyclerView.refresh();
mLRecyclerViewAdapter.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(View view, int position) {
//点击item处理
Toast.makeText(EndlessGridLayoutActivity.this,position+"",Toast.LENGTH_SHORT).show();
}
});
//设置滚动相关的式样
// mRecyclerView.setRefreshProgressStyle(ProgressStyle.LineScale);
// mRecyclerView.setArrowImageView(R.mipmap.ic_launcher);
}
private void notifyDataSetChanged() {
mLRecyclerViewAdapter.notifyDataSetChanged();
}
private void addItems(ArrayList<ItemModel> list) {
mDataAdapter.addAll(list);
mCurrentCounter += list.size();
}
private class PreviewHandler extends Handler {
private WeakReference<EndlessGridLayoutActivity> ref;
PreviewHandler(EndlessGridLayoutActivity activity) {
ref = new WeakReference<>(activity);
}
@Override
public void handleMessage(Message msg) {
final EndlessGridLayoutActivity activity = ref.get();
if (activity == null || activity.isFinishing()) {
return;
}
switch (msg.what) {
case -1:
int currentSize = activity.mDataAdapter.getItemCount();
//模拟组装40个数据
ArrayList<ItemModel> newList = new ArrayList<>();
for (int i = 0; i < 40; i++) {
if (newList.size() + currentSize >= TOTAL_COUNTER) {
break;
}
ItemModel item = new ItemModel();
item.id = currentSize + i;
item.title = "item" + (item.id);
newList.add(item);
}
activity.addItems(newList);
activity.mRecyclerView.refreshComplete(1);
break;
case -2:
activity.notifyDataSetChanged();
break;
case -3:
activity.mRecyclerView.refreshComplete(10);
activity.notifyDataSetChanged();
activity.mRecyclerView.setOnNetWorkErrorListener(new OnNetWorkErrorListener() {
@Override
public void reload() {
requestData();
}
});
break;
}
}
}
/**
* 模拟请求网络
*/
private void requestData() {
new Thread() {
@Override
public void run() {
super.run();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//如果网络正常,则
mHandler.sendEmptyMessage(-1);
}
}.start();
}
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_list_drag, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == android.R.id.home) {
finish();
} else if (item.getItemId() == R.id.menu_grid) {
mRecyclerView.setLayoutManager(new GridLayoutManager(this, 2));
mRecyclerView.setAdapter(mLRecyclerViewAdapter);//必须重新setAdapter
} else if (item.getItemId() == R.id.menu_linear) {
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
}
return true;
}
}
- MyAdapter.java
public class MyAdapter extends RecyclerView.Adapter {
protected Context mContext;
private LayoutInflater mInflater;
protected List<ItemModel> mDataList = new ArrayList<>();
private View itemView;
public MyAdapter(Context context) {
mContext = context;
mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
itemView = mInflater.inflate(R.layout.sample_item_text, parent, false);
return new MyViewHolder(itemView);
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
ItemModel item = mDataList.get(position);
TextView titleText = holder.itemView.findViewById(R.id.info_text);
titleText.setText(item.title);
}
@Override
public int getItemCount() {
return mDataList.size();
}
private class MyViewHolder extends RecyclerView.ViewHolder {
public MyViewHolder(View itemView) {
super(itemView);
}
}
public void addAll(ArrayList<ItemModel> list) {
int lastIndex = this.mDataList.size();
if (this.mDataList.addAll(list)) {
notifyItemRangeInserted(lastIndex, list.size());
}
}
public void clear() {
mDataList.clear();
notifyDataSetChanged();
}
}
- ItemModel.java
public class ItemModel {
public long id;
public String title;
public int imgRes;
public String imgUrl;
public int height ;
public int type;
}