安卓中的内置搜索:不借助网络,和后台的协助实现本地轻量级数据的处理
先简单的形容两句,这两天有点堕落了,不但没有总结一些项目中用到的技术,而且在项目的开发中,行进的速度也是有点慢的,所以打算趁着开学前的这十几天时间内吧,再多学点知识咯,再多总结一些遇到的问题,供以后的自己和同样也遇到问题的大家参考,嘿嘿,努力,努力,努力~
好,下面我们正式开始,在项目中遇到这样一个问题,需要让用户可以在客户端内选择国家,当然会出现一个列表(recyclerview)让用户来点选,但是无奈国家太多,所以我们要加一个搜索的功能,我当时说好简单的需求啊,用户输入了什么,我只需要把内容获取到,发送到后台,让后台去处理,然后轻轻松松给我返回数据嘛,然后我放到我的recyclerview里面,但是后来大家沟通了一下,这个需求确实有那么一点点的不合理,因为国家是不会轻易改变的,而且放在本地处理这些数据,确实会让它变得界面更加友好。
在本地实现搜索功能:我上网简单的了解了几种方式,主流的方式都是推荐用数据库,然后运用到数据库的读写和搜索的功能,但是我认为很没有必要呀,因为一共就那么些国家,我认为完全可以写在手机里面,所以我有了如下的做法。
思路:利用String类中的s.contains("xxx")这个方法就可以,把含有关键字的内容过滤出来,放到一个list里面就可以。然后把这个list当做数据源,提供给recyclerview就可以了,然后我们就实现我们的做法咯。
下面我们看一下代码:
/**
* Created by linSir on 16/8/6.选择国家的界面
*/
public class SelectCountry extends AppCompatActivity {
@BindView(R.id.rc_select_country) RecyclerView mRl;
@BindView(R.id.select_country_select) EditText ed;
@BindView(R.id.search_country_select) ImageView search;
private SelectCountryAdapter mAdapter;
String[] countries = {"中国", "美国", "日本", "新加坡", "意大利", "英国", "澳大利亚", "马来西亚", "泰国", "韩国", "马尔代夫", "法国", "德国"};
List countryChecked = new ArrayList();
List allCountry = new ArrayList();
@Override protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_select_country);
ButterKnife.bind(this);
mAdapter = new SelectCountryAdapter();
for (int i = 0; i < countries.length; i++) {
allCountry.add(countries[i]);
}
mRl.setLayoutManager(new LinearLayoutManager(this));
mRl.addOnItemTouchListener(new RecyclerItemClickListener(this, onItemClickListener));
mRl.setAdapter(mAdapter);
mAdapter.refresh(allCountry);
}
@OnClick(R.id.search_country_select)
public void select() {
for (int i = 0; i < countries.length; i++) {
if (countries[i].contains(ed.getText().toString())) {
countryChecked.add(countries[i]);
}
}
mAdapter.refresh(countryChecked);
countryChecked.clear();
}
private RecyclerItemClickListener.OnItemClickListener onItemClickListener = new RecyclerItemClickListener.OnItemClickListener() {
@Override
public void onItemClick(View view, int position) {
Intent intent = new Intent(SelectCountry.this, SelectCity.class);
startActivity(intent);
}
};
}
在上面的代码中我们定义了一个coutries的字符串数组,里面保存的都是一些国家名,然后通过一个for循环把他们加到list中,然后当我们刚开始初始化的时候,把这个list当做数据源,在后来输入框中输入了内容,然后我们通过这个字符串和list中的每一个都比较一次,符合我们要求的,即包含所输入字符串的就放到一个新的list里面,然后把新的list传给recyclerview就可以,就实现了检索的功能,当然我们传给recyclerview之后还要清空我们的list,在我的代码里面我还加入了跳转到选择城市的代码大家喜欢的话可以看看,不喜欢可以无视,同样为了大家可以直接把我的代码拿去用,我会为大家粘上xml,和adapter的代码。
main_acitivity.xml的代码:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<RelativeLayout
android:id="@+id/rl_all_address"
android:layout_width="match_parent"
android:layout_height="56dp">
<EditText
android:id="@+id/select_country_select"
android:layout_width="match_parent"
android:layout_height="44dp"
android:layout_marginLeft="12dp"
android:layout_marginRight="20dp"
android:layout_toRightOf="@+id/back_select_country"
android:hint=" 请输入要搜索的国家"
android:textColor="#545353"
android:textSize="18sp"/>
<ImageView
android:id="@+id/search_country_select"
android:layout_width="44dp"
android:layout_height="44dp"
android:layout_alignEnd="@+id/select_country_select"
android:layout_alignParentTop="true"
android:layout_alignRight="@+id/select_country_select"
android:focusable="true"
android:focusableInTouchMode="true"
android:padding="12dp"
android:src="@mipmap/search"/>
<ImageView
android:id="@+id/back_select_country"
android:layout_width="27dp"
android:layout_height="27dp"
android:layout_margin="12dp"
android:src="@mipmap/back"/>
</RelativeLayout>
<android.support.v7.widget.RecyclerView
android:id="@+id/rc_select_country"
android:layout_width="match_parent"
android:layout_height="match_parent">
</android.support.v7.widget.RecyclerView>
</LinearLayout>
recyclerview的adapter的代码:
/**
* Created by linSir on 16/8/6.选择国家的适配器
*/
public class SelectCountryAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private List<String> mList;
private int DEFAULT = 0;
public SelectCountryAdapter() {
mList = new ArrayList<>();
}
public void refresh(List<String> list) {
mList.clear();
mList.addAll(list);
notifyDataSetChanged();
}
public void clear() {
mList.clear();
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return new AddressItemViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_select_country, parent, false));
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
bindView((AddressItemViewHolder) holder, mList.get(position));
}
private void bindView(AddressItemViewHolder holder, String data) {
String address;
holder.countryName.setText(data);
}
@Override
public int getItemCount() {
return mList.size();
}
public static class AddressItemViewHolder extends RecyclerView.ViewHolder {
private TextView countryName;
public AddressItemViewHolder(View itemView) {
super(itemView);
countryName = (TextView) itemView.findViewById(R.id.item_country_name);
}
}
}
最后好人做到底~把实现点击事件的接口给大家加上:
RecyclerItemClickListener:
/**
* Created by linSir on 2016/7/9.recycler单项的点击事件
*/
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
public class RecyclerItemClickListener implements RecyclerView.OnItemTouchListener {
private OnItemClickListener mListener;
public interface OnItemClickListener {
void onItemClick(View view, int position);
}
GestureDetector mGestureDetector;
public RecyclerItemClickListener(Context context, OnItemClickListener listener) {
mListener = listener;
mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
@Override
public boolean onSingleTapUp(MotionEvent e) {
return true;
}
});
}
@Override
public boolean onInterceptTouchEvent(RecyclerView view, MotionEvent e) {
View childView = view.findChildViewUnder(e.getX(), e.getY());
if (childView != null && mListener != null && mGestureDetector.onTouchEvent(e)) {
mListener.onItemClick(childView, view.getChildAdapterPosition(childView));
}
return false;
}
@Override
public void onTouchEvent(RecyclerView view, MotionEvent motionEvent) {
}
@Override
public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
// do nothing
}
}
好了,到现在就把我在项目中收获到的东西都分享给大家了,如果感觉写的不错的话,可以点个❤️哦~~ 也可以关注一下笔者 ~~ 有什么问题,就留言和我一起讨论吧 ~~