Merge pull request #591 from jjbillings/guild-search-bar

Guild Search Bar - Issue #513
This commit is contained in:
Phillip Thelen 2016-08-16 18:20:46 +02:00 committed by GitHub
commit 43a63794bc
5 changed files with 124 additions and 3 deletions

View file

@ -0,0 +1,30 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="fill_parent"
android:layout_width="fill_parent"
android:orientation="vertical">
<android.support.design.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/coordinatorLayout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.habitrpg.android.habitica.ui.helpers.RecyclerViewEmptySupport
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbarSize="3dp"
android:scrollbarThumbVertical="@color/md_grey_500"
android:scrollbars="vertical" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/empty_view"
style="@style/EmptyView"/>
</android.support.design.widget.CoordinatorLayout>
</LinearLayout>

View file

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context="com.habitrpg.android.habitica.ui.activities.MainActivity">
<item
android:id="@+id/action_guild_search"
android:title="@string/guild_search_hint"
android:orderInCategory="103"
android:visible="true"
app:showAsAction="always"
app:actionViewClass="android.support.v7.widget.SearchView"/>
</menu>

View file

@ -254,6 +254,7 @@ To start, which parts of your life do you want to improve?</string>
<string name="privacy">Privacy</string>
<string name="write_message">Write Message</string>
<string name="post">Post</string>
<string name="guild_search_hint">Search for guilds</string>
<string name="todo_due" formatted="false">Due: %s</string>
<string name="daily_streak" formatted="false">current streak: %d</string>

View file

@ -13,21 +13,26 @@ import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.Filter;
import android.widget.Filterable;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.List;
import butterknife.BindView;
import butterknife.ButterKnife;
public class PublicGuildsRecyclerViewAdapter extends RecyclerView.Adapter<PublicGuildsRecyclerViewAdapter.GuildViewHolder> {
public class PublicGuildsRecyclerViewAdapter extends RecyclerView.Adapter<PublicGuildsRecyclerViewAdapter.GuildViewHolder> implements Filterable{
public APIHelper apiHelper;
private List<Group> publicGuildList;
private List<Group> fullPublicGuildList;
private List<String> memberGuildIDs;
public void setPublicGuildList(List<Group> publicGuildList) {
this.publicGuildList = publicGuildList;
this.fullPublicGuildList = new ArrayList<>(publicGuildList);
this.notifyDataSetChanged();
}
@ -94,6 +99,44 @@ public class PublicGuildsRecyclerViewAdapter extends RecyclerView.Adapter<Public
return this.memberGuildIDs != null && this.memberGuildIDs.contains(guild.id);
}
@Override
public Filter getFilter() {
return new Filter() {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
List<Group> filteredGuilds = null;
if(constraint.length() == 0) {
filteredGuilds = fullPublicGuildList;
} else {
filteredGuilds = getFilteredResults(constraint.toString().toLowerCase());
}
FilterResults results = new FilterResults();
results.values = filteredGuilds;
return results;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
publicGuildList = (List<Group>) results.values;
PublicGuildsRecyclerViewAdapter.this.notifyDataSetChanged();
}
};
}
protected List<Group> getFilteredResults(String query) {
List<Group> filteredGuilds = new ArrayList<>();
for(Group guild : fullPublicGuildList) {
if(guild.name.toLowerCase().contains(query)) {
filteredGuilds.add(guild);
}
}
return filteredGuilds;
}
static class GuildViewHolder extends RecyclerView.ViewHolder {
@BindView(R.id.nameTextView)

View file

@ -4,14 +4,20 @@ import com.habitrpg.android.habitica.R;
import com.habitrpg.android.habitica.components.AppComponent;
import com.habitrpg.android.habitica.ui.adapter.social.PublicGuildsRecyclerViewAdapter;
import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment;
import com.habitrpg.android.habitica.ui.helpers.UiUtils;
import com.habitrpg.android.habitica.ui.menu.DividerItemDecoration;
import com.magicmicky.habitrpgwrapper.lib.models.Group;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.content.ContextCompat;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.SearchView;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
@ -20,7 +26,7 @@ import java.util.List;
import butterknife.BindView;
import butterknife.ButterKnife;
public class PublicGuildsFragment extends BaseMainFragment {
public class PublicGuildsFragment extends BaseMainFragment implements SearchView.OnQueryTextListener {
List<String> memberGuildIDs;
List<Group> guilds;
@ -30,13 +36,14 @@ public class PublicGuildsFragment extends BaseMainFragment {
private View view;
private PublicGuildsRecyclerViewAdapter viewAdapter;
private SearchView guildSearchView;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
super.onCreateView(inflater, container, savedInstanceState);
if (view == null) {
view = inflater.inflate(R.layout.fragment_recyclerview, container, false);
view = inflater.inflate(R.layout.fragment_guild_recyclerview, container, false);
unbinder = ButterKnife.bind(this, view);
recyclerView.setLayoutManager(new LinearLayoutManager(this.activity));
@ -76,4 +83,30 @@ public class PublicGuildsFragment extends BaseMainFragment {
});
}
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.menu_public_guild, menu);
MenuItem searchItem = menu.findItem(R.id.action_guild_search);
guildSearchView = (SearchView)searchItem.getActionView();
SearchView.SearchAutoComplete theTextArea = (SearchView.SearchAutoComplete) guildSearchView.findViewById(R.id.search_src_text);
theTextArea.setHintTextColor(ContextCompat.getColor(this.activity,R.color.white));
guildSearchView.setQueryHint(getString(R.string.guild_search_hint));
guildSearchView.setOnQueryTextListener(this);
}
@Override
public boolean onQueryTextSubmit(String s) {
viewAdapter.getFilter().filter(s);
UiUtils.dismissKeyboard(this.activity);
return true;
}
@Override
public boolean onQueryTextChange(String s) {
viewAdapter.getFilter().filter(s);
return true;
}
}