1.recyclerview外包裹一个SwipeRefreshLayout
2.适配器
package com.example.test.okgoframework.adapter; import android.content.Context; import android.support.annotation.NonNull; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import com.example.test.okgoframework.R; import java.util.List; public class LoadMorAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { private Context context; private List<String> data; private int footaccount = 1; private int ITEM_FOOTTYPE = 2; private int ITEM_CONTENTTYPE = 3; public LoadMorAdapter(Context context, List<String> data) { this.context = context; this.data = data; } @Override public int getItemViewType(int position) { if (footaccount != 0 && position >= ( data.size())) { return ITEM_FOOTTYPE; } else { return ITEM_CONTENTTYPE; } } @NonNull @Override public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { if (viewType == ITEM_FOOTTYPE) { //加载更多item布局 View view = LayoutInflater.from(context).inflate(R.layout.item_footer, parent, false); return new FootHolder(view); } else if (viewType == ITEM_CONTENTTYPE) { View view = LayoutInflater.from(context).inflate(R.layout.item_loadmor, parent, false); return new ContentHolder(view); } return null; } @Override public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { if (holder instanceof ContentHolder){ ((ContentHolder) holder).item.setText(data.get(position)); }else if (holder instanceof FootHolder){} } @Override public int getItemCount() { return data.size()+footaccount; } public class FootHolder extends RecyclerView.ViewHolder { public FootHolder(View itemView) { super(itemView); } } public class ContentHolder extends RecyclerView.ViewHolder { private final TextView item; public ContentHolder(View itemView) { super(itemView); item = itemView.findViewById(R.id.text); } } }
3.activity
package com.example.test.okgoframework.activity; import android.annotation.SuppressLint; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.support.annotation.Nullable; import android.support.v4.widget.SwipeRefreshLayout; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import com.example.test.okgoframework.R; import com.example.test.okgoframework.adapter.LoadMorAdapter; import java.util.ArrayList; import java.util.List; public class LoadMorActivity extends Activity { List<String> data; @SuppressLint("HandlerLeak") Handler handler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); refreshLayout.setRefreshing(false); } }; private SwipeRefreshLayout refreshLayout; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_loadmor); initData(); initView(); } private void initView() { RecyclerView recyclerView = findViewById(R.id.recyclerview); refreshLayout = findViewById(R.id.refreshlayout); final LoadMorAdapter adapter = new LoadMorAdapter(this, data); LinearLayoutManager manager = new LinearLayoutManager(this); recyclerView.setLayoutManager(manager); recyclerView.setAdapter(adapter); refreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { handler.sendEmptyMessageDelayed(100, 4000); List<String> headData = new ArrayList<>(); for (int i = 0; i < 3; i++) { headData.add("这是刷新后的数据" + i); } data.clear(); data.addAll(0, headData); adapter.notifyDataSetChanged(); refreshLayout.setRefreshing(false); } }); recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); if (newState == RecyclerView.SCROLL_STATE_IDLE) { if (isSlideToBottom(recyclerView)) { List<String> newData = new ArrayList<>(); for (int i = 0; i < 3; i++) { newData.add("新数据~~~" + i); } data.addAll(newData); adapter.notifyDataSetChanged(); } } } }); } public static boolean isSlideToBottom(RecyclerView recyclerView) { if (recyclerView == null) { return false; } if (recyclerView.computeVerticalScrollExtent() + recyclerView.computeVerticalScrollOffset() >= recyclerView.computeVerticalScrollRange()) { return true; } return false; } private void initData() { data = new ArrayList<>(); for (int i = 0; i < 20; i++) { data.add("this is title" + i); } } }