Android app开发中刷新问题的详解

 private void init() {
        //布局设置
        mRvNewListLayout.setLayoutManager(new LinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL, false));

        //设置 数据
        mNewsListAdapter = new NewsListAdapter(mShowItems);
        mRvNewListLayout.setAdapter(mNewsListAdapter);

        //设置下拉刷新
        mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                if (mLOADSTATE == LOADSTATE.NONE) {

                    mLOADSTATE = LOADSTATE.LOADING;
                    refresh();
                } else {
                   ToastUtil.showToast("亲,正在下拉中,请勿刷新");
                }
                //下拉刷新
                //重新请求数据
                //使用框架重新请求数据
            }
        });
        mRvNewListLayout.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {

                super.onScrollStateChanged(recyclerView, newState);
            //只有现行布局才能找到最后一条,通过布局管理器,获取最后一个条目

                if (mLOADSTATE == LOADSTATE.NONE) {

                    LinearLayoutManager linearLayoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
                    int lastVisibleItemPosition = linearLayoutManager.findLastVisibleItemPosition();

                    if (lastVisibleItemPosition == mShowItems.size() - 1 && newState == RecyclerView.SCROLL_STATE_IDLE) {
                        //请求数据,刷新数据 ,刷新数据前告诉系统刷新的状态
                        mLOADSTATE = LOADSTATE.MORELOADING; //上拉加载
                        refresh();
                    }
                } else {
                    ToastUtil.showToast("别再扯犊子了");
                }

            }
        });
    }

    public enum LOADSTATE {
        //定义刷新的状态  范围确定,总共只有这几种状态
        NONE,  //空闲
        LOADING , //下拉刷新
        MORELOADING // 上拉加载更多

    }

    //定义当前的状态
    private LOADSTATE mLOADSTATE = LOADSTATE.NONE;
    @Override
    protected Object rquestData() {

        //recyclerView操作数据永远在请求数据之后


        //请求头部
        //不是上拉刷新的时候,才去请求头布局

        if (mLOADSTATE!= LOADSTATE.MORELOADING) {
            newHeadBean = LoadData.getInstance().getBeanData("http://www.oschina.net/action/apiv2/banner?catalog=1", NewHeadBean.class);
        }

        String requestUrl = "http://www.oschina.net/action/apiv2/news?pageToken=";

        //根据当前的的状态请求我们的地址
        if (mLOADSTATE == LOADSTATE.MORELOADING) {
            requestUrl = requestUrl + mpageToken;
        } else {
            requestUrl = "http://www.oschina.net/action/apiv2/news?pageToken=";
        }
        //请求身体
        NewBodyBean newBodyBean = LoadData.getInstance().getBeanData(requestUrl, NewBodyBean.class);
        //为了防止空指针,进行判空
        if (newBodyBean != null && newBodyBean.getResult() != null && newBodyBean.getResult().getNextPageToken() != null) {

            mpageToken = newBodyBean.getResult().getNextPageToken(); //下一页
        }

        //数据判断的逻辑

        if (mShowItems.size() > 0) {
            //添加的数据跟身体有关,与头部无关
            if (newBodyBean != null && newBodyBean.getResult() != null && newBodyBean.getResult().getItems() != null && newBodyBean.getResult().getItems().size() > 0) {
                if (mLOADSTATE != LOADSTATE.MORELOADING) {
                    mShowItems.clear();
                }
                mShowItems.addAll(newBodyBean.getResult().getItems());
            } else {
                ToastUtil.showToast("网络异常,加载失败");
            }
        } else {
            if (newBodyBean != null && newBodyBean.getResult() != null && newBodyBean.getResult().getItems() != null && newBodyBean.getResult().getItems().size() > 0) {
                //直接添加数据
                mShowItems.addAll(newBodyBean.getResult().getItems());
            } else {
                //不处理也行,处理就返回null
                return null;
            }
        }

        //处理头部了
        mShowItems.add(0,newHeadBean);
        //判断当前下拉的模式
//        //在上拉加载更多时候不会清空数据
//        if (mLOADSTATE != LOADSTATE.MORELOADING ) {
//            mShowItems.clear();
//        }
//        //在加载数据之前,把头部和脚步数据干掉
//        for (int i = 0; i < mShowItems.size(); i++) {
//            if (mShowItems.get(i) instanceof HeadType) {
//                mShowItems.remove(i);
//            }
//        }
                               //这么写太麻烦了,考虑一个方法,自动的加进去



            //头部应该加在0的位置
//        mShowItems.add(0,newHeadBean);
//
//        mShowItems.addAll(newBodyBean.getResult().getItems());

        //底部必须手动
       // mShowItems.add(new FootBean());

        //更新adapter
        Utils.runOnUIThread(new Runnable() {
            @Override
            public void run() {
                //刷新
             //   mNewsListAdapter.notifyDataSetChanged();
                //停止刷新的方法
                mNewsListAdapter.updataData();
                //更改状态
                mLOADSTATE = LOADSTATE.NONE;
                mSwipeRefreshLayout.setRefreshing(false);
                //注意状态的反转
            }
        });


        return mShowItems;
    }
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,首先你需要明确的是,开发一个完整的购票应用不是一件简单的事情,需要涉及到前端UI设计、后端数据库设计、交互逻辑实现等多个方面。因此,在这里我只能给你提供一个简单的购票代码示例,帮助你了解一下如何在Android Studio编写购票代码。 以下是一个简单的购票代码示例: 1. 首先,在XML布局文件,你需要设计一个购票界面,包括购票日期、出发站点、到达站点、座位类型等相关控件。例如: ``` <EditText android:id="@+id/date" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="请选择购票日期" /> <EditText android:id="@+id/start_station" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="请输入出发站点" /> <EditText android:id="@+id/end_station" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="请输入到达站点" /> <Spinner android:id="@+id/seat_type" android:layout_width="match_parent" android:layout_height="wrap_content" android:prompt="请选择座位类型" android:entries="@array/seat_type_array" /> <Button android:id="@+id/submit" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="提交" /> ``` 2. 接下来,在Java代码,你需要对这些控件进行监听,并且完成购票逻辑。例如: ``` public class MainActivity extends AppCompatActivity { private EditText mDateEditText; private EditText mStartStationEditText; private EditText mEndStationEditText; private Spinner mSeatTypeSpinner; private Button mSubmitButton; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mDateEditText = findViewById(R.id.date); mStartStationEditText = findViewById(R.id.start_station); mEndStationEditText = findViewById(R.id.end_station); mSeatTypeSpinner = findViewById(R.id.seat_type); mSubmitButton = findViewById(R.id.submit); mSubmitButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { String date = mDateEditText.getText().toString(); String startStation = mStartStationEditText.getText().toString(); String endStation = mEndStationEditText.getText().toString(); String seatType = mSeatTypeSpinner.getSelectedItem().toString(); // TODO: 完成购票逻辑 } }); } } ``` 3. 最后,在购票逻辑,你需要完成以下几个步骤: - 验证输入的购票日期、出发站点、到达站点是否合法; - 查询数据库,获取符合条件的车票信息; - 验证座位类型是否可用,如果可用则进行预订; - 更新数据库,将预订信息保存。 以上是一个简单的购票代码示例,希望能够帮助你入门。当然,实际开发,还需要考虑一些其他的问题,例如安全性、性能优化等等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值