AndroidはRecyclerViewのリフレッシュロードとサイドスライドメニューを統合したPullToRefresh

22474 ワード

この2,3日は通常のプロジェクトで使用されるリフレッシュロードとサイドスライドメニューを整理しました.PullToRefreshフレームには、RecyclerViewと、RecyclerViewを使用して実装されたサイドスライドメニューが追加されています.
まず効果図を見てみましょう.
ここはPullToRefreshフレームワークに基づいているので、ここではListViewを1つの代表(GridView,ScrollView,WebViewなど、使い方は基本的にListViewと同じ)、RecyclerViewとSwipeRecyclerViewの2つの使い方も似ていますが、少し違います.
使い方はListViewからご紹介します(PullToRefreshフレームワークの基本的な使い方):
pull_listView = (PullToRefreshListView) findViewById(R.id.pull_listView);
adapter = new ListViewAdapter(list, this);
//         : BOTH            , PULL_FROM_END      , PULL_FROM_START      ,DISABLED ,       
pull_listView.setMode(PullToRefreshBase.Mode.BOTH); 
pull_listView.setOnRefreshListener(new PullToRefreshBase.OnRefreshListener2() {
            @Override
            public void onPullDownToRefresh(PullToRefreshBase refreshView) {
                //       
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            Thread.sleep(MainActivity.SLEEP_TIME);
                            runOnUiThread(new Runnable() {
                                @Override
                                public void run() {
                                    list.clear();
                                    DataModel.initData(list, "ListView");
                                    adapter.notifyDataSetChanged();
                                    Toast.makeText(PullListViewActivity.this, "    ", Toast.LENGTH_SHORT).show();
                                    pull_listView.onRefreshComplete();
                                }
                            });
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }

                    }
                }).start();
            }

            @Override
            public void onPullUpToRefresh(PullToRefreshBase refreshView) {
                //       
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            Thread.sleep(MainActivity.SLEEP_TIME);
                            runOnUiThread(new Runnable() {
                                @Override
                                public void run() {
                                    DataModel.initData(list, "ListView");
                                    adapter.notifyDataSetChanged();
                                    pull_listView.onRefreshComplete();
                                    Toast.makeText(PullListViewActivity.this, "    ", Toast.LENGTH_SHORT).show();
                                }
                            });
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }

                    }
                }).start();
            }
        });

        pull_listView.setAdapter(adapter);

ここのAdapterは、普段よく使われている継承BaseAdapterの書き方です.
リフレッシュ・ロードのあるRecyclerViewの使用方法:
        pull_recyclerView = (PullToRefreshRecyclerView) findViewById(R.id.pull_recyclerView);

        recyclerView = pull_recyclerView.getRefreshableView();
        recyclerView.setLayoutManager(new LinearLayoutManager(this));

        pull_recyclerView.setMode(PullToRefreshBase.Mode.BOTH);
        pull_recyclerView.setOnRefreshListener(new PullToRefreshBase.OnRefreshListener2() {
            @Override
            public void onPullDownToRefresh(PullToRefreshBase refreshView) {
                //       
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            Thread.sleep(MainActivity.SLEEP_TIME);
                            runOnUiThread(new Runnable() {
                                @Override
                                public void run() {
                                    list.clear();
                                    DataModel.initData(list, "RecyclerView");
                                    adapter.notifyDataSetChanged();
                                    Toast.makeText(PullRecyclerViewActivity.this, "    ", Toast.LENGTH_SHORT).show();
                                    pull_recyclerView.onRefreshComplete();
                                }
                            });
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }

                    }
                }).start();
            }

            @Override
            public void onPullUpToRefresh(PullToRefreshBase refreshView) {
                //       
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            Thread.sleep(MainActivity.SLEEP_TIME);
                            runOnUiThread(new Runnable() {
                                @Override
                                public void run() {
                                    DataModel.initData(list, "RecyclerView");
                                    adapter.notifyDataSetChanged();
                                    Toast.makeText(PullRecyclerViewActivity.this, "    ", Toast.LENGTH_SHORT).show();
                                    pull_recyclerView.onRefreshComplete();
                                }
                            });
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }

                    }
                }).start();
            }
        });

        adapter = new RecylerViewAdapter(list);
        recyclerView.setAdapter(adapter);

ここでは、RecyclerViewのリフレッシュロードとそれ自体のプロパティ設定が別々に制御されていることに注意してください.つまり、PullToRefreshRecyclerViewによってリフレッシュロードを制御するだけです.setLayoutManagerについては、setAdapterはgetRefreshableView()によってRecyclerViewの参照を得る必要があります.
最後にサイドスライドメニュー付きのRecyclerViewですが、ここでは特に厳振傑大神に感謝します.彼が書いたこれは私が今出会った比較的良いサイドスライドメニューです.会社のプロジェクトの需要によって、ただ1つのサイドスライド機能が必要かもしれないので、ここで私は彼のソースコードから単独で右側のサイドスライドメニュー機能を提出して、次に使い方を見てみましょう:まず、正常なインスタンス化で、リフレッシュロードモードを設定して、ロードリスニングを設定します.
        pull_swipe_recyclerView = (PullToRefreshSwipeRecyclerView) findViewById(R.id.pull_swipe_recyclerView);

        pull_swipe_recyclerView.setMode(PullToRefreshBase.Mode.BOTH);
        pull_swipe_recyclerView.setOnRefreshListener(new PullToRefreshBase.OnRefreshListener2() {
            @Override
            public void onPullDownToRefresh(PullToRefreshBase refreshView) {
                //       
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            Thread.sleep(MainActivity.SLEEP_TIME);
                            runOnUiThread(new Runnable() {
                                @Override
                                public void run() {
                                    list.clear();
                                    DataModel.initData(list, "SwipeRecyclerView");
                                    adapter.notifyDataSetChanged();
                                    Toast.makeText(PullSwipeRecyclerViewActivity.this, "    ", Toast.LENGTH_SHORT).show();
                                    pull_swipe_recyclerView.onRefreshComplete();
                                }
                            });
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }).start();
            }

            @Override
            public void onPullUpToRefresh(PullToRefreshBase refreshView) {
                //       
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            Thread.sleep(MainActivity.SLEEP_TIME);
                            runOnUiThread(new Runnable() {
                                @Override
                                public void run() {
                                    DataModel.initData(list, "SwipeRecyclerView");
                                    adapter.notifyDataSetChanged();
                                    pull_swipe_recyclerView.onRefreshComplete();
                                    Toast.makeText(PullSwipeRecyclerViewActivity.this, "    ", Toast.LENGTH_SHORT).show();
                                }
                            });
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }

                    }
                }).start();
            }
        });

次に、私たちの上のRecyclerViewと同じように、getRefreshableView()でSwipeMenuRecyclerViewを入手し、初期化方法を設定します.
        swipe_recyclerView = pull_swipe_recyclerView.getRefreshableView();
        swipe_recyclerView.setLayoutManager(new LinearLayoutManager(this));
        //       
        swipe_recyclerView.setSwipeMenuCreator(creator);
        //           
        swipe_recyclerView.setSwipeMenuItemClickListener(menuItemClickListener);

次に、サイドスライドメニューとメニュークリックイベントを追加する方法を示します.
    /**
     *         
     */
    private OnSwipeMenuItemClickListener menuItemClickListener = new OnSwipeMenuItemClickListener() {
        /**
         * Item           。
         * @param closeable       closeable.       。
         * @param adapterPosition adapterPosition.        item Adapter position。
         * @param menuPosition    menuPosition.      position。      Item   2 MenuItem,    position     0、1,
         */
        @Override
        public void onItemClick(Openable closeable, int adapterPosition, int menuPosition) {
            closeable.smoothCloseMenu();//         。

            Toast.makeText(PullSwipeRecyclerViewActivity.this, "adapter Position : " + adapterPosition + " , menuposition : " + menuPosition, Toast.LENGTH_SHORT).show();
        }

    };

    /**
     *       
     */
    SwipeMenuCreator creator = new SwipeMenuCreator() {
        @Override
        public void onCreateMenu(SwipeMenu swipeRightMenu, int viewType) {
            String str = "";
            int color = 0;
            int width = getResources().getDimensionPixelSize(R.dimen.dp_70);
            int widthdel = getResources().getDimensionPixelSize(R.dimen.dp_70);
            // viewType       Adapter   getItemViewType   ;
//            switch (viewType) {
//                case 0:
//                    width = getResources().getDimensionPixelSize(R.dimen.dp_70);
//                    str = "  ";
//                    color = R.color.c_2ecc71;
//                    widthdel = getResources().getDimensionPixelSize(R.dimen.dp_70);
//                    break;
//                case 1:
//                    width = getResources().getDimensionPixelSize(R.dimen.dp_100);
//                    widthdel = getResources().getDimensionPixelSize(R.dimen.dp_70);
//                    str = "    ";
                    color = R.color.c_ff7a7a;
//                    break;
//                case 3:
//                    width = 0;
//                    widthdel = 0;
//                    break;
//            }
            str = "  ";
            //      ,     ,         。
            SwipeMenuItem deleteItem = new SwipeMenuItem(PullSwipeRecyclerViewActivity.this)
                    .setBackgroundDrawable(color)
                    .setText(str) //   ,         ,   。。
                    .setTextColor(Color.WHITE)
                    .setTextSize(16)
                    .setWidth(width)
                    .setHeight(getResources().getDimensionPixelSize(R.dimen.dp_70));
            swipeRightMenu.addMenuItem(deleteItem);//             。

            SwipeMenuItem addItem = new SwipeMenuItem(PullSwipeRecyclerViewActivity.this)
                    .setBackgroundDrawable(R.color.color_99)
                    .setText("  ")
                    .setTextColor(Color.WHITE)
                    .setTextSize(16)
                    .setWidth(widthdel)
                    .setHeight(getResources().getDimensionPixelSize(R.dimen.dp_70));
            swipeRightMenu.addMenuItem(addItem); //            。

        }
    };

上のいくつかの注釈は、どのようにコントロールするかを知っていると信じています.
次にこのSwipeMenuRecyclerViewのAdapterについてお話しします.上の2つは基本的にオリジナルのアダプタの書き方ですが、このAdaperはSwipeMenuAdapterを継承する必要があります.下に私のDemoのサイドスライドAdapterを直接貼ります.
    class SwipeRecyclerViewAdapter extends SwipeMenuAdapter<SwipeRecyclerViewAdapter.ViewHolder> {

        private List list;

        public SwipeRecyclerViewAdapter(List list) {
            this.list = list;
        }

        @Override
        public View onCreateContentView(ViewGroup parent, int viewType) {
            return LayoutInflater.from(parent.getContext()).inflate(android.R.layout.simple_list_item_1, parent, false);
        }

        @Override
        public ViewHolder onCompatCreateViewHolder(View realContentView, int viewType) {
            return new ViewHolder(realContentView);
        }

        @Override
        public void onBindViewHolder(ViewHolder holder, int position) {
            holder.textView.setText(list.get(position));
        }

        @Override
        public int getItemCount() {
            return list.size();
        }

        class ViewHolder extends RecyclerView.ViewHolder {
            TextView textView;

            public ViewHolder(View itemView) {
                super(itemView);
                textView = (TextView) itemView.findViewById(android.R.id.text1);
            }
        }
    }

基本的な使い方はこれだけですが、PullToRefresh Moduleに統合されています.必要なものがあればDemoを直接ダウンロードし、pulltorefresh Moduleを参照すればいいです.
GitHubアドレスが嬉しいなら、ついでにスターにあげてもいいですよ.
参照リンク:http://blog.csdn.net/xuehuayous/article/details/50387089 http://blog.csdn.net/yanzhenjie1003/article/details/52115566