#java #android #android-recyclerview
#java #Android #android-recyclerview
Вопрос:
Я не могу понять, как реализовать представление поиска для фильтрации по коду, который у меня есть сейчас. Этот код создает новый адаптер, который получает имя пользователя, город и их изображение. Я создал представление поиска, но я не знаю, как реализовать его в этом коде, большинство руководств, которые я просмотрел, имеют свои собственные адаптеры, но я создаю один здесь.
Я попробовал несколько руководств, но безуспешно.
public class SearchFragment extends Fragment {
private RecyclerView usersList;
private RecyclerView.Adapter usersListAdapter;
private DatabaseReference databaseReference;
private DatabaseReference userDatabase;
private DatabaseReference checkName;
private FirebaseAuth firebaseAuth;
private String currentUserID;
private View view;
private SearchView searchID;
public SearchFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
view = inflater.inflate(R.layout.fragment_search, container, false);
usersList = view.findViewById(R.id.search_users);
searchID = view.findViewById(R.id.search);
firebaseAuth = FirebaseAuth.getInstance();
currentUserID = firebaseAuth.getCurrentUser().getUid();
databaseReference = FirebaseDatabase.getInstance().getReference().child("Users");
userDatabase = FirebaseDatabase.getInstance().getReference();
checkName = userDatabase.child("Users").child(currentUserID).child("name");
usersList.setHasFixedSize(true);
usersList.setLayoutManager(new LinearLayoutManager(getContext()));
return view;
}
@Override
public void onStart() {
super.onStart();
databaseReference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull final DataSnapshot dataSnapshot) {
final FirebaseRecyclerOptions<Users> options = new FirebaseRecyclerOptions.Builder<Users>()
.setQuery(databaseReference, Users.class)
.build();
FirebaseRecyclerAdapter adapter = new FirebaseRecyclerAdapter<Users, SearchFragment.UsersViewHolder>(options) {
@Override
protected void onBindViewHolder(@NonNull SearchFragment.UsersViewHolder holder, int position, @NonNull final Users users) {
String checkID = currentUserID;
String checkID1 = dataSnapshot.child("").getValue().toString();
holder.setName(users.getName());
holder.setCity(users.getCity());
holder.setImage(users.getImage());
final String user_ID = getRef(position).getKey();
final String user_Name = users.getName();
final String user_Img = users.getImage();
/*if(user_ID == checkID){
holder.setIsRecyclable(false);
holder.mView.setVisibility(View.INVISIBLE);
holder.mView.setVisibility(View.GONE);
return;
}*/
holder.mView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
CharSequence pickOption[] = new CharSequence[]{"View Profile", "Send Message"};
final AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
builder.setTitle("Select an Option");
builder.setItems(pickOption, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
if (i == 0){
Intent otherProfileIntent = new Intent(getActivity(), OthersProfileActivity.class);
otherProfileIntent.putExtra("user_ID", user_ID);
otherProfileIntent.putExtra("user_Name", user_Name);
otherProfileIntent.putExtra("user_Img", user_Img);
startActivity(otherProfileIntent);
}
if (i == 1){
Intent messageIntent = new Intent(getActivity(), MessageActivity.class);
messageIntent.putExtra("user_ID", user_ID);
messageIntent.putExtra("user_Name", user_Name);
messageIntent.putExtra("user_Img", user_Img);
startActivity(messageIntent);
}
}
});
builder.show();
}
});
}
@NonNull
@Override
public SearchFragment.UsersViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.users_layout, parent, false);
return new SearchFragment.UsersViewHolder(view);
}
};
usersList.setAdapter(adapter);
adapter.startListening();
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
@Override
public void onStop() {
super.onStop();
}
public static class UsersViewHolder extends RecyclerView.ViewHolder {
View mView;
public UsersViewHolder(View itemView) {
super(itemView);
mView = itemView;
}
public void setName(String name) {
TextView userNameView = mView.findViewById(R.id.single_userName);
userNameView.setText(name);
}
public void setCity(String name) {
TextView userNameView = mView.findViewById(R.id.single_userStatus);
userNameView.setText(name);
}
public void setImage(String image) {
CircleImageView userImage = mView.findViewById(R.id.single_userImg);
if(!image.equals("default")) {
Picasso.get().load(image).into(userImage);
}
}
}
}
Я хочу знать, как использовать режим поиска для поиска пользователей на основе их имени / города, я просто не уверен, как это сделать.
Ответ №1:
сначала вам нужно реализовать фильтр в вашем адаптере в RecyclerView
public void setFilter(List<Model> listItem)
{
modelList = new ArrayList<>();
modelList.addAll(listItem);
notifyDataSetChanged();
}
тогда в вашей деятельности мы должны реализовать этот интерфейс
implements SearchView.OnQueryTextListener
наконец, переопределите эти методы
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.item, menu);
MenuItem menuItem = menu.findItem(R.id.searchId);
SearchView searchView = (SearchView) menuItem.getActionView();
searchView.setOnQueryTextListener(this);
return true;
}
@Override
public boolean onQueryTextSubmit(String s) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
String userInput = newText;
List<Model> newList = new ArrayList<>();
for(Model name:modelObject)
{
if(name.getName().contains(userInput))
newList.add(name);
}
ad.setFilter(newList);
return false;
}