java - 如何实现 searchview 按城市/名称过滤用户?

标签 java android android-recyclerview

我无法理解如何实现搜索 View 来过滤我现在拥有的代码。此代码创建一个新的适配器,其中获取用户名、城市及其图像。我已经制作了一个搜索 View ,但我不知道如何将其实现到此代码,我看过的大多数教程都有自己的适配器,但我在这里创建一个。

我尝试了几个教程,但没有成功。

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);
        }
    }
}

}

我想知道如何使用搜索 View 根据用户的姓名/城市搜索用户,但我只是不确定如何操作。

最佳答案

首先您需要在 recyclerView 的适配器中实现过滤器

public void setFilter(List<Model> listItem)
{
    modelList = new ArrayList<>();
    modelList.addAll(listItem);
    notifyDataSetChanged();
}

那么在您的 Activity 中我们必须实现这个接口(interface)

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;
}

关于java - 如何实现 searchview 按城市/名称过滤用户?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55839644/

相关文章:

android - 如何在 firebaseui 提供的 recyclerview 项目上使用上下文菜单

android - 单击项目时更新 RecyclerView 中的 ImageView

java - 在 Install4j 中处理不同的发布计划

java - 为什么这段 Java 代码会抛出 NumberFormatException?

android - 应用程序声明了从配置 'compile' 到配置 'default' 的依赖关系,该依赖关系未在项目的描述符中声明

android - 以编程方式下载视频android的第一帧

java - 错误 415 不支持的媒体类型 : POST not reaching REST if JSON, 但如果 XML

java - 在产品 java 类中输入的数据出现异常

android - Android 上的硬件加速 H.264/HEVC 视频解码为 OpenGL FBO 或纹理

android - 字符串中的自动完成功能未在Android Studio(Kotlin)上显示