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学习的整个过程,其中还有很多不足的地方,只是为了记录一下自己的学习过程,希望大神多多提出意见,勿喷。谢谢。

0 0
原创粉丝点击