Android RecyclerView (四)总结(一)-(三)并且实现下拉刷新数据,上拉加载数据功能
2016-12-03 22:49
701 查看
我们使用的代码还是为以前文章写的。
这一次我们主要实现的是下拉刷新数据,和上拉加载数据,这里我都用Thread.sleep(xxx)的方法来模拟获取数据等待。
首先我们下拉刷新的时候要用到:
SwipeRefreshLayout
来看一下如何在布局文件中使用它:
这里可以看到我们给view设置了一个class就是android.support.v4.widget.SwipeRefreshLayout
这个组件,
接下来我们看一下代码部分
这里是我们一个下拉刷新的实现方法,
上拉加载数据。我们通过设置监听器的方式来实现
当然我们肯定要用到线程和Handler处理。
下面我把整个从(一)到(四)的代码复制出来给大家看看。
这里我用AS创建工程的时候选择的是Basic Activity 这样我们可以用它的
onOptionsItemSelected 来切换布局.
首先是 content_activity.xml
这里主要就是一个.SwipeRefreshLayout里面有一个RecyclerView控件
然后看一下 item_activity.xml
这里就是我们RecyclerView 的Item的一个布局文件。
接下来就是 menu文件下的item_menu.xml
这里就是为我们的PopMenu设置了一个Item选项,用于长按弹出删除菜单栏。
MyAdapter
这个就是RecyclerView的适配器,这里面我们写出了他的设置监听器方法,并且也有我们写好的删除Item的函数。
接下来就是MainActivity
这里面的就是用了SwipeRefreshLayout来实现下拉刷新,然后通过给RecyclerView添加setOnScrollListener来实现上拉加载。
并且我们写了一个Menu,点击后出现菜单切换manager来实现不同的布局。并且public void showPopMenu(View view,final int pos)这个函数也实现了显示出一个菜单栏并且删除Item的方法,然后在LongOnClickListener里调用这个方法就可以了。
这个就是RecyclerView学习的整个过程,其中还有很多不足的地方,只是为了记录一下自己的学习过程,希望大神多多提出意见,勿喷。谢谢。
这一次我们主要实现的是下拉刷新数据,和上拉加载数据,这里我都用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 XRecyclerView简单实现上拉刷新,下拉加载
- 手把手教你实现Android RecyclerView上拉加载功能
- PullToRefreshRecyclerView——带上拉刷新下拉加载功能的RecyclerView
- Android Recyclerview实现上拉加载更多功能
- RecycleView控件的使用(三) 实现上拉加载更多下拉刷新功能
- 手把手教你实现Android RecyclerView上拉加载功能
- Android之 RecyclerView,CardView 详解和相对应的上拉刷新下拉加载
- Android实现RecyclerView下拉刷新效果
- MVP模式的OKhttp请求网络数据,xrecyclerview上拉刷新,下拉加载
- RecyclerView之下拉刷新、下拉加载的实现
- Android RecyclerView下拉刷新 & 上拉加载更多
- RecyclerView实现上啦刷新下拉加载
- Android开发之RecyclerView的上拉刷新和下拉加载
- angularjs实现上拉加载和下拉刷新数据功能
- Android RecyclerView上拉加载更多功能回弹实现代码
- android 自定义listview——实现上拉刷新下拉加载的功能
- RecyclerView+SwipeRefreshLayout实 4000 现上拉刷新,下拉加载更多的功能
- Android下拉刷新库,利用viewdraghelper实现,集成了下拉刷新,底部加载更多,数据初始加载显示loading等功能
- MVP实现RecyclerView上拉刷新,下拉加载
- 教你实现Android RecyclerView上拉加载功能