Android 드롭다운 플러시 및 업로드 데이터(네트워크 요청 데이터)

간단한 소개
안드로이드 개발에서 우리는 상단 로드와 하단 리셋 기능을 자주 만나게 된다. 인터넷을 통해 데이터를 요청하고 컨트롤에 추가한다. 이전에 자신도 인터넷에서 글을 검색한 적이 있지만 기본적으로 쓸모가 크지 않다. 효과가 다르거나 붙인 코드가 완전하지 않아서 기능을 정상적으로 사용할 수 없다(매우 아프다).그래서 한참을 더듬은 후에 대체적으로 OK된 데모를 완성하여 여러분에게 참고하도록 했습니다.문제가 있으면 여러분의 지적을 바랍니다. 감격해 마지 않습니다.
낡은 관습에 먼저 효과도를 붙이다
사용된 컨트롤 및 도구 소개:
4
  • RefreshLayout(업로드 드롭다운 리셋 컨트롤) 4
  • 4
  • 어댑터(데이터 로드 어댑터)
  • 4
  • RecyclerView(데이터를 로드하는view 컨트롤)
  • 4
  • Handler(네트워크 통신)
  • 자, 코드를 시작합시다!!!
    기왕 네트워크를 사용한 이상 네트워크 권한을 넣어야 한다
    
    

    레이아웃 XML:
    
    
    
        
    
            
    
            
    
        
    
        
    
            
    
            
    
                
    
                
    
                
    
                
    
            
    
            
    
        
    
    
    

    주: 이 SmartRefresh Layout은 사용자 정의 프레임워크입니다. 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);
        }
    
    
    }
    

    주: 동상, 주석이 간단명료하고 쓸데없는 말이 많지 않습니다.계속, 다음:
    다음 단계는 없을 것 같은데, 사실은 전체 기능에 이해하기 어려운 부분이 없다. 코드를 이해하고 자신의 프로젝트에서 숙련되게 사용하면 된다. 수요에 따라 서로 다른 실현 방식을 맞춤형으로 만들 수 있다. 이곳의 이런 방식은 단지 하나의 참고일 뿐이다. 그리고 어떤 좋은 방법이 있으면 나에게 추천할 수 있다.코드의 부족도 지적할 수 있습니다. 여러분의 좋은 소식을 기다리겠습니다!!
    데모 원본을 첨부합니다. GitHub에 익숙하지 않기 때문에, 이곳의 링크는 csdn입니다.
    여기 누르면 원본 다운로드, 빨리, 찔러, 찔러...
    본고는 GitHub의 리셋 프레임워크를 인용하여 해석권을 가지지 않습니다. 리셋 프레임워크에 대해 더 알고 싶으면 아래 주소로 가서 읽으십시오.https://github.com/scwang90/SmartRefreshLayout
    q:486789970 email:[email protected]
    만약 무슨 문제가 있으면 여러분의 지도를 환영합니다.서로 연결되어 문장을 통해 서로 배울 수 있기를 바랍니다.
    												---    
    

    좋은 웹페이지 즐겨찾기