Androidはドロップダウン・リフレッシュとアップロード・データ(ネットワーク要求データ)を実現


概要
アンドロイドの開発では、アップロードやドロップダウンリフレッシュの機能によく遭遇し、ネットワークリクエストでデータを入手してコントロールに追加し、以前は自分もネットでいくつかの文章を検索したことがあるが、基本的にはあまり役に立たず、効果が異なるか、貼られたコードが不完全で、機能が正常に使用できない(卵が痛い)ため、しばらく模索した後、ほぼOKなdemoを完成した.皆さんの参考に供します.問題があったら皆さんに指摘していただき、感謝の気持ちでいっぱいです.
古いしきたりで,まず効果図を貼る
使用するコントロールとツールの概要:
  • RefreshLayout(プルアップロードドロップダウンリフレッシュコントロール)
  • Adapter(データをロードするアダプタ)
  • RecyclerView(データをロードするviewコントロール)
  • Handler(ネットワーク通信)
  • さあ、コードをつけましょう!!!
    ネットワークを使用している以上、ネットワーク権限を入れなければなりません.
    
    

    レイアウトXML:
    
    
    
        
    
            
    
            
    
        
    
        
    
            
    
            
    
                
    
                
    
                
    
                
    
            
    
            
    
        
    
    
    

    注:このSmartRefreshLayoutはカスタムフレームワークで、GitHubから来ています.gradleに追加すればいいです.
    MainActivity.class
    /**
     * activity
     */
    public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    
        /** activity */
        Activity activity = this;
    
        /**    key */
        public static String Joke_APPKEY = "e9bbc8a5de090451bd5da96dc574a94a";
        /**          URL   */
        public static final String HTTPURLS = "http://v.juhe.cn/joke/randJoke.php?";
    
        /**        */
        private static Animation rotateAnimation;
    
        /**         */
        static final int SUCC_CODE = 0;
    
        /**            */
        ImageView joke_img_back, joke_img_load;
    
        /**      RV */
        RecyclerView joke_rv;
    
        /**          */
        JokeLVAdapter adapter;
    
        /**            ,   false */
        boolean isRef, isLoad = false;
    
        /** swf:             */
        RefreshLayout activity_joke_refreshLayout;
    
        /**   handler        handleMessage         */
        Handler handler = new Handler(){
            @Override
            public void handleMessage(Message msg) {
                //             ,    adapter    
                if(msg.arg1 == SUCC_CODE && isLoad || isRef){
                    adapter.notifyDataSetChanged();
                }
                //              ,     ,        RV 
                else if(msg.arg1 == SUCC_CODE){
                    joke_img_load.clearAnimation();
                    joke_img_load.setVisibility(View.GONE);
                    adapter = new JokeLVAdapter(activity, datas);
                    joke_rv.setLayoutManager(new LinearLayoutManager(activity));
                    joke_rv.setAdapter(adapter);
                    // rv item         ,  openWindow    
                    adapter.setLinster(new JokeLVAdapter.ItemOnClickLinster() {
                        @Override
                        public void textItemOnClick(View view, int position) {
                            Log.i("activity", "----->position=" + position);
                            //      
                            openWindow(position);
                        }
                    });
                }else{
                    //      ,    ,   
                    joke_img_load.clearAnimation();
                    joke_img_load.setVisibility(View.GONE);
                    Toast.makeText(activity, R.string.getDataError, Toast.LENGTH_SHORT).show();
                }
            }
        };
    
        /**
         *   position          
         * @param position
         */
        private void openWindow(int position) {
            Toast.makeText(activity, "    item    " + position, Toast.LENGTH_SHORT).show();
        }
    
        /**       ,             */
        List datas = new ArrayList<>();
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            //     
            requestWindowFeature(Window.FEATURE_NO_TITLE);
            setContentView(R.layout.activity_main);
    
            initView();
            initData();
            //       
            StatusBarCompat.setStatusBarColor(activity, ContextCompat.getColor(activity, R.color.cyan));
        }
    
        public void initView() {
            //    id
            joke_img_back = findViewById(R.id.joke_img_back);
            joke_img_load = findViewById(R.id.joke_img_load);
            joke_rv = findViewById(R.id.joke_rv);
            activity_joke_refreshLayout = findViewById(R.id.activity_joke_refreshLayout);
    
            //  refreshLayout     
            //    
            activity_joke_refreshLayout.setEnableOverScrollBounce(false);
    
            //                 
            activity_joke_refreshLayout.setDisableContentWhenRefresh(true);
            activity_joke_refreshLayout.setDisableContentWhenLoading(true);
    
            //                 (  true)
            activity_joke_refreshLayout.setEnableAutoLoadmore(false);
    
    
            /**
             *          
             */
            activity_joke_refreshLayout.setOnRefreshListener(new OnRefreshListener() {
                @Override
                public void onRefresh(RefreshLayout refreshlayout) {
                    Log.i("activity", "    ");
                    //              
                    isRef = true;
                    handler.post(getRefreshDatas);
                }
            });
    
            /**
             *          
             */
            activity_joke_refreshLayout.setOnLoadmoreListener(new OnLoadmoreListener() {
                @Override
                public void onLoadmore(RefreshLayout refreshlayout) {
                    Log.i("activity", "    ");
                    isLoad = true;
                    handler.post(getLoadmoreDatas);
                }
            });
    
            //  
            joke_img_back.setOnClickListener(this);
        }
    
        public void initData() {
            // xml          ,                    
            joke_img_load.setVisibility(View.VISIBLE);
            openA(activity, joke_img_load);
            //  
            handler.post(getDatas);
        }
    
        /**
         * getDatas
         */
        Runnable getDatas = new Runnable() {
            @Override
            public void run() {
                HttpRequest.get(HTTPURLS + "&key=" + Joke_APPKEY, new Callback() {
                    @Override
                    public void onFailure(Call call, IOException e) {
                        e.printStackTrace();
                    }
    
                    @Override
                    public void onResponse(Call call, Response response) throws IOException {
                        Log.i("activity", "      ");
                        String result = response.body().string();
                        JsonDta(result);
                    }
                });
            }
        };
    
        /**
         *   json
         * @param result
         */
        private void JsonDta(String result) {
            Message message = handler.obtainMessage();
            //  json      SJJokeNow  
            SJJokeNow obj = new Gson().fromJson(result, SJJokeNow.class);
            //    ,  handler      
            if(obj.getError_code() != 0){
                message.arg1 = obj.getError_code();
                handler.sendMessage(message);
            }else {
                //   ,   
                if(isRef){
                    Log.i("activity", "------>" + obj.getReason());
                    List json = new ArrayList<>();
                    for (int i = 0; i < obj.getResult().size(); i ++){
                        JokesNew info = new JokesNew();
                        info.setHashId(obj.getResult().get(i).getHashId());
                        info.setContent(obj.getResult().get(i).getContent());
                        info.setUnixtime(obj.getResult().get(i).getUnixtime());
                        json.add(info);
                    }
                    for(int i = 0 ; i < datas.size() ; i++) {
                        json.add(datas.get(i));
                    }
                    datas.clear();
                    for(int i = 0 ; i < json.size() ; i++) {
                        datas.add(json.get(i));
                    }
                    isRef = false;
                }else {
                    Log.i("activity", "------>" + obj.getReason());
                    for (int i = 0; i < obj.getResult().size(); i ++){
                        JokesNew info = new JokesNew();
                        info.setHashId(obj.getResult().get(i).getHashId());
                        info.setContent(obj.getResult().get(i).getContent());
                        info.setUnixtime(obj.getResult().get(i).getUnixtime());
                        datas.add(info);
                    }
                }
                message.arg1 = obj.getError_code();
                handler.sendMessage(message);
            }
        }
    
        /**
         *        
         */
        Runnable getRefreshDatas = new Runnable() {
            @Override
            public void run() {
                HttpRequest.get(HTTPURLS + "&key=" + Joke_APPKEY, new Callback() {
                    @Override
                    public void onFailure(Call call, IOException e) {
                        activity_joke_refreshLayout.finishRefresh(0000 , false);
                        e.printStackTrace();
                    }
    
                    @Override
                    public void onResponse(Call call, Response response) throws IOException {
                        Log.i("activity", "      ");
                        activity_joke_refreshLayout.finishRefresh(0000 , true);
                        String result = response.body().string();
                        JsonDta(result);
                    }
                });
            }
        };
    
        /**
         *        
         */
        Runnable getLoadmoreDatas = new Runnable() {
            @Override
            public void run() {
                HttpRequest.get(HTTPURLS + "&key=" + Joke_APPKEY, new Callback() {
                    @Override
                    public void onFailure(Call call, IOException e) {
                        e.printStackTrace();
                        activity_joke_refreshLayout.finishLoadmore(0000 , false);
                    }
    
                    @Override
                    public void onResponse(Call call, Response response) throws IOException {
                        Log.i("activity",  "      ");
                        activity_joke_refreshLayout.finishLoadmore(0000 , true);
                        String result = response.body().string();
                        JsonDta(result);
                    }
                });
            }
        };
    
        @Override
        public void onClick(View v) {
            int temdId = v.getId();
            if(temdId == R.id.joke_img_back){
                finish();
            }
        }
    
        /**
         *       
         * @param img
         */
        public static void openA(Activity activity, ImageView img){
            //  loading  
            rotateAnimation = AnimationUtils.loadAnimation(activity, R.anim.loading);
            LinearInterpolator interpolator = new LinearInterpolator();
            rotateAnimation.setInterpolator(interpolator);
            img.startAnimation(rotateAnimation);
        }
    
    }
    

    注:本文の注釈はかなりはっきり書いてあるので、あまり説明しません.
    JokeLVAdapter.class
    /**
     *         
     */
    public class JokeLVAdapter extends RecyclerView.Adapter {
    
        /**     */
        Activity context;
    
        /**     */
        List data;
    
        /**    */
        LayoutInflater inflater;
    
        /**
         *           ,            ,                         。
         */
        LruCache mMemoryCache;
    
        /**
         *    data      activity  
         * @param activity
         * @param datas
         */
        public JokeLVAdapter(Activity activity, List datas){
            this.context = activity;
            this.data = datas;
    
            //    
            inflater = LayoutInflater.from(activity);
    
    
            //             
            int maxMemory = (int) Runtime.getRuntime().maxMemory();
            int cacheSize = maxMemory / 8;
            mMemoryCache = new LruCache(cacheSize) {
                @Override
                protected int sizeOf(String key, BitmapDrawable drawable) {
                    return drawable.getBitmap().getByteCount();
                }
            };
        }
    
    
        /**
         *     ,   activity onCreate  
         * @param parent
         * @param viewType
         * @return
         */
        @Override
        public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.joke_lv_item, parent, false);
            return new ViewHolder(view);
        }
    
        /**
         *     
         * @param viewHolder
         * @param position
         */
        @Override
        public void onBindViewHolder(final ViewHolder viewHolder, int position) {
            viewHolder.joke_lv_txtconent.setText(data.get(position).getContent());
            viewHolder.joke_lv_txttime.setText("   :" + data.get(position).getUnixtime() + "");
    
            //  tag
            viewHolder.itemView.setTag(position);
        }
    
        /**
         *         
         * @return
         */
        @Override
        public int getItemCount() {
            return data.size();
        }
    
        /**
         * //    ViewHolder,    Item        
         */
        public class ViewHolder extends RecyclerView.ViewHolder {
    
            /**   item    */
            public TextView joke_lv_txttime;
            public TextView joke_lv_txtconent;
            public LinearLayout lin_alljoke;
    
            public ViewHolder(View rootView) {
                super(rootView);
                this.joke_lv_txtconent = rootView.findViewById(R.id.joke_lv_txtconent);
                this.joke_lv_txttime = rootView.findViewById(R.id.joke_lv_txttime);
                this.lin_alljoke = rootView.findViewById(R.id.lin_alljoke);
    
                //  item     
                this.lin_alljoke.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Linster.textItemOnClick(v, getPosition());
                    }
                });
            }
        }
    
        public ItemOnClickLinster Linster;
    
        public void setLinster(ItemOnClickLinster linster) {
            Linster = linster;
        }
    
        public interface ItemOnClickLinster{
            void textItemOnClick(View view, int position);
        }
    
    
    }
    

    注:同じように、注釈は簡単明瞭で、くだらない話は多くありません.続行、次へ:
    次のステップはないようですが、実は、全体の机能には难しいところはありません.コードを理解して、自分のプロジェクトの中で上手に使うことができればいいです.ニーズに応じて异なる実现方法をカスタマイズすることができます.ここのこの方法はただのものです.参考にしてください.また、どんな良い方法があるかをお勧めします.コードの不足も指摘できます.静かに皆さんの佳音を待っています!!
    Demoソースを添付しますが、GitHubがあまり熟練していないので、ここのリンクはcsdnです.
    ここをクリックしてソースをダウンロードして、早く、私をスタンプして...
    本稿ではGitHubのリフレッシュフレームワークを参照し、解釈権を持たないので、リフレッシュフレームワークをさらに理解したい場合は、次のアドレスでお読みください.https://github.com/scwang90/SmartRefreshLayout
    q:486789970 email:[email protected]
    何か問題があれば、皆さんの指導を歓迎します.文章を通じて学び合いたい.
    												---