一般在筛选某些条件后需要重新发送网络请求更新数据
下面是的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做出进一步的改变是合法的,但要注意不要让自己陷入死循环,因为你所做的任何更改将导致再次递归调用此方法。
于是对上面的代码做修改,我直接在筛选选择器的结果里面加上一个接口回调,在回调里面发送请求。
对代码