Added search view

This commit is contained in:
M66B 2015-10-25 11:11:46 +01:00
parent 310872f432
commit b2a59b695a
9 changed files with 85 additions and 6 deletions

View File

@ -6,10 +6,12 @@ import android.content.SharedPreferences;
import android.net.VpnService;
import android.os.AsyncTask;
import android.preference.PreferenceManager;
import android.support.v4.view.MenuItemCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.SearchView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
@ -117,9 +119,38 @@ public class ActivityMain extends AppCompatActivity implements SharedPreferences
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.main, menu);
MenuItem searchItem = menu.findItem(R.id.menu_search);
SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem);
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
applyFilter(query);
return true;
}
@Override
public boolean onQueryTextChange(String newText) {
applyFilter(newText);
return true;
}
});
searchView.setOnCloseListener(new SearchView.OnCloseListener() {
@Override
public boolean onClose() {
applyFilter(null);
return true;
}
});
return true;
}
private void applyFilter(String query) {
if (adapter != null)
adapter.getFilter().filter(query);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle item selection

View File

@ -10,15 +10,19 @@ import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.Filter;
import android.widget.Filterable;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.List;
public class RuleAdapter extends RecyclerView.Adapter<RuleAdapter.ViewHolder> {
public class RuleAdapter extends RecyclerView.Adapter<RuleAdapter.ViewHolder> implements Filterable {
private static final String TAG = "NetGuard.RuleAdapter";
private List<Rule> listRule;
private List<Rule> listAll;
private List<Rule> listSelected;
public static class ViewHolder extends RecyclerView.ViewHolder {
public View view;
@ -40,12 +44,14 @@ public class RuleAdapter extends RecyclerView.Adapter<RuleAdapter.ViewHolder> {
}
public RuleAdapter(List<Rule> listRule) {
this.listRule = listRule;
listAll = listRule;
listSelected = new ArrayList<>();
listSelected.addAll(listRule);
}
@Override
public void onBindViewHolder(final ViewHolder holder, int position) {
final Rule rule = listRule.get(position);
final Rule rule = listSelected.get(position);
holder.ivIcon.setImageDrawable(rule.getIcon(holder.view.getContext()));
holder.tvName.setText(rule.name);
@ -84,6 +90,40 @@ public class RuleAdapter extends RecyclerView.Adapter<RuleAdapter.ViewHolder> {
holder.cbOther.setOnCheckedChangeListener(cbListener);
}
@Override
public Filter getFilter() {
return new Filter() {
@Override
protected FilterResults performFiltering(CharSequence query) {
List<Rule> listResult = new ArrayList<>();
if (query == null)
listResult.addAll(listAll);
else {
query = query.toString().toLowerCase();
for (Rule rule : listAll)
if (rule.name.toLowerCase().contains(query))
listResult.add(rule);
}
FilterResults result = new FilterResults();
result.values = listResult;
result.count = listResult.size();
return result;
}
@Override
protected void publishResults(CharSequence query, FilterResults result) {
listSelected.clear();
if (result == null)
listSelected.addAll(listAll);
else
for (Rule rule : (List<Rule>) result.values)
listSelected.add(rule);
notifyDataSetChanged();
}
};
}
@Override
public RuleAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return new ViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.rule, parent, false));
@ -91,6 +131,6 @@ public class RuleAdapter extends RecyclerView.Adapter<RuleAdapter.ViewHolder> {
@Override
public int getItemCount() {
return listRule.size();
return listSelected.size();
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 396 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 247 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 465 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 728 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 915 B

View File

@ -1,5 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:netguard="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/menu_search"
android:icon="@drawable/ic_search_white_24dp"
android:title="@string/menu_search"
netguard:actionViewClass="android.support.v7.widget.SearchView"
netguard:showAsAction="ifRoom|collapseActionView" />
<item
android:id="@+id/menu_vpn_settings"
android:title="@string/menu_vpn_settings" />

View File

@ -1,6 +1,7 @@
<resources>
<string name="app_name">NetGuard</string>
<string name="app_copyright">Copyright \u00A9 2015 by M. Bokhorst (M66B)</string>
<string name="menu_search">Search</string>
<string name="menu_vpn_settings">VPN settings</string>
<string name="menu_about">About</string>
</resources>