筛选条件后发送请求

一般在筛选某些条件后需要重新发送网络请求更新数据

下面是的xml布局:

<LinearLayout
        android:layout_width="match_parent"
        android:layout_height="40dp"
        android:background="@color/blue_395eff">

        <TextView
            android:id="@+id/txt_area_selector"
            android:hint="地区"
            style="@style/txt_selextor"/>

        <TextView
            android:id="@+id/txt_salary_selector"
            android:hint="薪资"
            style="@style/txt_selextor"/>

        <TextView
            android:id="@+id/txt_experience_selector"
            android:hint="经验"
            style="@style/txt_selextor"/>
        <TextView
            android:id="@+id/txt_extent_selector"
            android:hint="规模"
            style="@style/txt_selextor"/>
    </LinearLayout>

筛选条件弹出选择器进行选择,运行效果图如下:

这里写图片描述

选择器参考地址https://github.com/gzu-liyujiang/AndroidPicker,代码如下:

/**
     * //Wheel选择
     * @param activity
     * @param txtShow  要显示的文本位置
     * @param items  数据源
     */
    public static void onTextSelect(Activity activity, final TextView txtShow, String[] items) {
        OptionPicker picker = new OptionPicker(activity,items);
        picker.setGravity(Gravity.BOTTOM);
        picker.setTopBackgroundColor(0xFFEEEEEE);
        picker.setLineVisible(true);
        picker.setTopLineColor(0xFF999999);
        if (txtShow != null) {
            picker.setSelectedItem(txtShow.getText().toString());
        } else {
            picker.setSelectedIndex(0);
        }
        picker.setOnOptionPickListener(new OptionPicker.OnOptionPickListener() {
            @Override
            public void onOptionPicked(int position, String option) {
                String txt = option;
                txtShow.setText(txt);
            }
        });
        picker.show();
    }

现在需要实现的是:筛选每个条件后重新向后台发送请求更新数据。
最初的思路是:点击筛选按钮先调用上面的选择器将选中的内容显示在对应的文本上,再通过textview的 textView.addTextChangedListener(new TextWatcher(){})方法,在它里面的afterTextChanged()内部发送请求方法,下面贴下代码:

public class MainActivity extends AppCompatActivity implements View.OnClickListener {


    private TextView Area, Salary, Experience, Extent;
    String[] Areas=new String[]{"北京","深圳","厦门","广州","上海"};
    String[] Salarys=new String[]{"1k-3k","3k-5k","5k-7k","7k-9k","9k+"};
    String[] Experiences =new String[]{"不限","应届生","1-3年","3-5年","5年以上"};
    String[] Extents=new String[]{"0-20人","20-50人","50-100人","100-500人","500人以上"};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        getInitView();
    }

    private void getInitView() {
        Area = (TextView) findViewById(R.id.txt_area_selector);
        Salary = (TextView) findViewById(R.id.txt_salary_selector);
        Experience = (TextView) findViewById(R.id.txt_experience_selector);
        Extent = (TextView) findViewById(R.id.txt_extent_selector);

        Area.setOnClickListener(this);
        Salary.setOnClickListener(this);
        Experience.setOnClickListener(this);
        Extent.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.txt_area_selector://地区
                TextSelectLast( Area, Areas);
                break;
            case R.id.txt_salary_selector://薪资
                TextSelectLast( Salary, Salarys);
                break;
            case R.id.txt_experience_selector://经验
                TextSelectLast( Experience, Experiences);
                break;
            case R.id.txt_extent_selector://规模
                TextSelectLast( Extent, Extents);
                break;
        }
    }

    private void TextSelectOne(TextView textView,String[] strings){
        CommonMethod.onTextSelect(this, textView, strings);
        textView.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }
            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {

            }
            @Override
            public void afterTextChanged(Editable s) {
                RequestList();
            }
        });
    }
    //发送请求的方法
    private void RequestList(){
        /**
         * 省略,使用下面的log,Toast代替
         */
        Log.i("筛选条件后发送一个请求:",".......................请求发送成功");
        Toast.makeText(this,"请求发送成功",Toast.LENGTH_SHORT).show();

    }
}

但是根据打印的log,同一个筛选按钮,第一次点击筛选后会发送一个请求,第二次筛选就会发送两次请求,以此类推,到第n次会发送n个请求。

寻找官方文档解释说,点击这方法会发生递归累加,所以后面会发生多次请求,原文文档如下:
afterTextChanged
It is legitimate to make further changes to s from this callback, but be careful not to get yourself into an infinite loop, because any changes you make will cause this method to be called again recursively.
从这个回调对s做出进一步的改变是合法的,但要注意不要让自己陷入死循环,因为你所做的任何更改将导致再次递归调用此方法。

于是对上面的代码做修改,我直接在筛选选择器的结果里面加上一个接口回调,在回调里面发送请求。
对代码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值