Android RecyclerView (四)总结(一)-(三)并且实现下拉刷新数据,上拉加载数据功能
来源:互联网 发布:java算法 编辑:程序博客网 时间:2024/06/14 00:35
我们使用的代码还是为以前文章写的。
这一次我们主要实现的是下拉刷新数据,和上拉加载数据,这里我都用Thread.sleep(xxx)的方法来模拟获取数据等待。
首先我们下拉刷新的时候要用到:
SwipeRefreshLayout
来看一下如何在布局文件中使用它:
................................ <view android:id="@+id/swipeRefreshLayout" android:layout_width="match_parent" class="android.support.v4.widget.SwipeRefreshLayout" android:layout_height="match_parent" ><android.support.v7.widget.RecyclerView android:id="@+id/recycler_view" android:layout_width="match_parent" android:layout_height="match_parent"></android.support.v7.widget.RecyclerView> </view>
这里可以看到我们给view设置了一个class就是android.support.v4.widget.SwipeRefreshLayout
这个组件,
接下来我们看一下代码部分
private SwipeRefreshLayout swipeRefreshLayout;swipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipeRefreshLayout);swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { //重新获取数据 //获取完成swipeRefreshLayout.setRefreshing(false); }});
这里是我们一个下拉刷新的实现方法,
上拉加载数据。我们通过设置监听器的方式来实现
recyclerview.setOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); if (newState == RecyclerView.SCROLL_STATE_IDLE && lastVisibleItem + 1 == adapter.getItemCount()) { swipeRefreshLayout.setRefreshing(true); //分页获取数据 //获取完成swipeRefreshLayout.setRefreshing(false); } } @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); lastVisibleItem = mLayoutManager.findLastVisibleItemPosition(); } });
当然我们肯定要用到线程和Handler处理。
下面我把整个从(一)到(四)的代码复制出来给大家看看。
这里我用AS创建工程的时候选择的是Basic Activity 这样我们可以用它的
onOptionsItemSelected 来切换布局.
首先是 content_activity.xml
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/content_main" android:layout_width="match_parent" android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior" tools:context="com.example.administrator.leranrecycleerview2.MainActivity" tools:showIn="@layout/activity_main"> <view android:id="@+id/swipeRefreshLayout" android:layout_width="match_parent" class="android.support.v4.widget.SwipeRefreshLayout" android:layout_height="match_parent" ><android.support.v7.widget.RecyclerView android:id="@+id/recycler_view" android:layout_width="match_parent" android:layout_height="match_parent"></android.support.v7.widget.RecyclerView> </view></RelativeLayout>
这里主要就是一个.SwipeRefreshLayout里面有一个RecyclerView控件
然后看一下 item_activity.xml
<?xml version="1.0" encoding="utf-8"?><FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="72dp" android:background="#ffdede" android:layout_margin="3dp"><TextView android:id="@+id/textView" android:layout_width="72dp" android:layout_gravity="center" android:layout_height="wrap_content"/></FrameLayout >
这里就是我们RecyclerView 的Item的一个布局文件。
接下来就是 menu文件下的item_menu.xml
<?xml version="1.0" encoding="utf-8"?><menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"><item android:id="@+id/removeItem" android:title="删除" app:showAsAction="never" ></item></menu>
这里就是为我们的PopMenu设置了一个Item选项,用于长按弹出删除菜单栏。
MyAdapter
public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { private Context mContext; private List<String> infos ; private LayoutInflater inflater; public interface OnItemOnClickLisener{ void onItemOnClickListener(View view ,int pos); void onItemLongOnClickListener(View view,int pos); } private OnItemOnClickLisener onClickLisener; public void setItemOnClickListener(OnItemOnClickLisener listener){ this.onClickLisener=listener; } public MyAdapter(Context mContext,List<String> infos){ this.mContext = mContext; this.infos = infos; } public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(this.mContext).inflate(R.layout.activity_item,parent,false); ViewHolder viewHolder = new ViewHolder(view); return viewHolder; } @Override public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) { ViewHolder viewHolder = (ViewHolder) holder; viewHolder.getTextView().setText(infos.get(position)); if(onClickLisener!=null){ holder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { int pos = holder.getLayoutPosition(); onClickLisener.onItemOnClickListener(holder.itemView,pos); } }); holder.itemView.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View view) { int pos = holder.getLayoutPosition(); onClickLisener.onItemLongOnClickListener(holder.itemView,pos); return false; } }); } } public void removeItem(int pos){ infos.remove(pos); notifyItemRemoved(pos); } public void removeAll(){ notifyDataSetChanged(); } class ViewHolder extends RecyclerView.ViewHolder{ private TextView textView; public ViewHolder(View itemView) { super(itemView); textView = (TextView) itemView.findViewById(R.id.textView); } public TextView getTextView(){ return textView; } } public int getItemCount() { return infos.size(); }}
这个就是RecyclerView的适配器,这里面我们写出了他的设置监听器方法,并且也有我们写好的删除Item的函数。
接下来就是MainActivity
public class MainActivity extends AppCompatActivity { private RecyclerView rcView; private LinearLayoutManager manager; private MyAdapter myAdapter; private SwipeRefreshLayout swipeRefreshLayout; private List<String> info; Thread thread ; Handler handler = new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); if(msg.what==2){ info.clear(); refreshData(); myAdapter = new MyAdapter(MainActivity.this,info); rcView.setAdapter(myAdapter); swipeRefreshLayout.setRefreshing(false); }else if(msg.what==1){ for(int i=0;i<=10;i++) info.add("123"); myAdapter = new MyAdapter(MainActivity.this,info); rcView.setAdapter(myAdapter); swipeRefreshLayout.setRefreshing(false); } } }; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); rcView = (RecyclerView) findViewById(R.id.recycler_view); manager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL,false); info = new ArrayList<String>(); myAdapter = new MyAdapter(this,info); loadData(); rcView.setLayoutManager(manager); rcView.setAdapter(myAdapter); rcView.setItemAnimator(new DefaultItemAnimator()); swipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipeRefreshLayout); swipeRefreshLayout.setColorSchemeResources(R.color.colorAccent,R.color.colorPrimary,R.color.cardview_dark_background,R.color.cardview_shadow_start_color); swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { new Thread(new Runnable() { @Override public void run() { try { Thread.sleep(2000); handler.sendEmptyMessage(2); } catch (InterruptedException e) { e.printStackTrace(); } } }).start(); } }); rcView.setOnScrollListener(new RecyclerView.OnScrollListener() { int lastVisibleItem; public void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); if(newState==RecyclerView.SCROLL_STATE_IDLE&&lastVisibleItem+1==myAdapter.getItemCount()){ swipeRefreshLayout.setRefreshing(true); new Thread(new Runnable() { @Override public void run() { try { Thread.sleep(2000); handler.sendEmptyMessage(1); } catch (InterruptedException e) { e.printStackTrace(); } } }).start(); } } @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); lastVisibleItem = manager.findLastVisibleItemPosition(); } }); myAdapter.setItemOnClickListener(new MyAdapter.OnItemOnClickLisener() { @Override public void onItemOnClickListener(View view, int pos) { Toast.makeText(MainActivity.this, "点击"+pos, Toast.LENGTH_SHORT).show(); } @Override public void onItemLongOnClickListener(View view, int pos) { showPopMenu(view,pos); } }); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); fab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) .setAction("Action", null).show(); } }); } public void loadData(){ for(int i=0;i<=15;i++){ info.add("Item:"+i); } } public void refreshData(){ for(int i=0;i<=15;i++){ info.add("Item:"); } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement switch (id){ case R.id.action_listView: manager = new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false); rcView.setLayoutManager(manager); break; case R.id.action_gridView: rcView.setLayoutManager(new GridLayoutManager(this,3)); break; case R.id.action_hr_gridView: rcView.setLayoutManager(new StaggeredGridLayoutManager(6,StaggeredGridLayoutManager.HORIZONTAL)); break; case R.id.action_straggerView: break; } return super.onOptionsItemSelected(item); } public void showPopMenu(View view,final int pos){ PopupMenu popupMenu = new PopupMenu(this,view); popupMenu.getMenuInflater().inflate(R.menu.item_menu,popupMenu.getMenu()); popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { public boolean onMenuItemClick(MenuItem item) { myAdapter.removeItem(pos); return false; } }); popupMenu.setOnDismissListener(new PopupMenu.OnDismissListener() { @Override public void onDismiss(PopupMenu menu) { Toast.makeText(getApplicationContext(), "关闭PopupMenu", Toast.LENGTH_SHORT).show(); } }); popupMenu.show(); }}
这里面的就是用了SwipeRefreshLayout来实现下拉刷新,然后通过给RecyclerView添加setOnScrollListener来实现上拉加载。
并且我们写了一个Menu,点击后出现菜单切换manager来实现不同的布局。并且public void showPopMenu(View view,final int pos)这个函数也实现了显示出一个菜单栏并且删除Item的方法,然后在LongOnClickListener里调用这个方法就可以了。
这个就是RecyclerView学习的整个过程,其中还有很多不足的地方,只是为了记录一下自己的学习过程,希望大神多多提出意见,勿喷。谢谢。
- Android RecyclerView (四)总结(一)-(三)并且实现下拉刷新数据,上拉加载数据功能
- Android-RecyclerView使用(三) 实现下拉刷新,上拉自动加载
- Android RecyclerView(八)设置自定义 下拉刷新 与 上拉加载数据
- Android之实现ListView的“下拉刷新”、“上拉加载”、“自动加载”功能(一)
- RecyclerView下拉刷新上拉加载(一)
- RecyclerView 下拉刷新和上拉加载(一)
- 封装RecyclerView,实现下拉刷新,上拉加载功能
- SwipeRefreshLayout+RecyclerView实现下拉刷新上拉加载功能
- android 打造真正的下拉刷新上拉加载recyclerview(三):下拉刷新上拉加载
- android 打造真正的下拉刷新上拉加载recyclerview(三):下拉刷新上拉加载
- RecyclerView的下拉刷新数据 与上拉加载更多
- RecyclerView实现上拉加载,下拉刷新
- RecyclerView实现上拉加载,下拉刷新
- Android中RecyclerView实现下拉刷新上拉加载更多
- android 简单实现 RecyclerView 下拉刷新上拉加载
- Android 实现RecyclerView的下拉刷新和上拉加载
- SwipeRefreshLayout配合RecyclerView实现下拉刷新和上拉加载更多以及没有数据的显示
- SwipeRefreshLayout配合RecyclerView实现下拉刷新和上拉加载更多以及没有数据的显示
- 安卓开发应用中的 短音频播放 SoundPooll的使用
- 辗转相除法之枚举法条件运算符求最大公约数
- 图论中的贪婪算法_最小生成树
- 微信SEO怎么做呢?
- 韩国民众游行要总统下台
- Android RecyclerView (四)总结(一)-(三)并且实现下拉刷新数据,上拉加载数据功能
- 安卓使用系统提供videoview播放视频
- 主题等.ppt及活动内容.ppt文档规范要求
- hadoop 2.6.0完全分布式安装
- swift可选类型
- Linux chrome/firefox flash过期问题解决办法
- Android Fragment 从源码的角度去解析(下)
- 安卓开发 加载图片到内存
- 11月30日 && 12月2日 && 12月3日 课堂笔记