首页 > 解决方案 > 如何在回收站视图中使用编辑文本进行搜索?

问题描述

我正在为我的申请寻找一些帮助。我已经构建了一个应用程序,并且包含了一个聊天功能。在聊天片段中,我有 2 个附加片段,一个用于当前打开的聊天,另一个用于所有可以发送消息的用户。我想在每个片段中加入一个搜索栏,以允许用户找到要发送消息的特定用户。我是

用户分段 XML

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/gold"
    tools:context=".ChatFragments.UsersFragment">

    <EditText
        android:id="@+id/etSearch"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:background="@android:color/white"
        android:ems="20"
        android:hint="@string/search"
        android:layout_weight="0.5"
        android:paddingLeft="15dp" />

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recycler_view"
        android:layout_below="@+id/etSearch"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</RelativeLayout>

用户片段 java 类

package com.alicearmstrong.coffeysloyaltyprojectv1.ChatFragments;

import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.Fragment;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.EditText;

import com.alicearmstrong.coffeysloyaltyprojectv1.Adapter.CustomerAdapter;
import com.alicearmstrong.coffeysloyaltyprojectv1.R;
import com.alicearmstrong.coffeysloyaltyprojectv1.database.Customers;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;

import java.util.ArrayList;
import java.util.List;

public class UsersFragment extends Fragment {

    private RecyclerView recyclerView;
    private CustomerAdapter customerAdapter;
    private List<Customers> customersList;
    DatabaseReference databaseReference;

    EditText etSearch;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        // Inflate the layout for this fragment
        View view = inflater.inflate( R.layout.fragment_users , container, false);
        etSearch = view.findViewById(R.id.etSearch);
        recyclerView = view.findViewById( R.id.recycler_view );
        recyclerView.setHasFixedSize( true );
        recyclerView.setLayoutManager( new LinearLayoutManager( getContext() ) );

        customersList = new ArrayList<>(  );

        readCustomers();
        return view;
    }

    // Method for reading customers
    private void readCustomers()
    {
        final FirebaseUser firebaseUser = FirebaseAuth.getInstance().getCurrentUser();
        databaseReference = FirebaseDatabase.getInstance().getReference().child("Customers");

        databaseReference.addValueEventListener( new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot)
            {
                customersList.clear();

                for (DataSnapshot snapshot : dataSnapshot.getChildren())
                {
                    Customers customers = snapshot.getValue(Customers.class);

                    if (!customers.getId().equals(firebaseUser.getUid()))
                    {
                        customersList.add( customers );
                    }
                }

                customerAdapter = new CustomerAdapter( getContext(), customersList );
                recyclerView.setAdapter( customerAdapter );

            }

            @Override
            public void onCancelled( @NonNull DatabaseError databaseError) {

            }
        } );
    }
}

客户适配器.java

package com.alicearmstrong.coffeysloyaltyprojectv1.Adapter;

import android.content.Context;
import android.content.Intent;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Filter;
import android.widget.Filterable;
import android.widget.TextView;

import com.alicearmstrong.coffeysloyaltyprojectv1.uiOwner.chatOwner.MessageActivityOwner;
import com.alicearmstrong.coffeysloyaltyprojectv1.R;
import com.alicearmstrong.coffeysloyaltyprojectv1.database.Customers;

import java.util.ArrayList;
import java.util.List;

public class CustomerAdapter extends RecyclerView.Adapter<CustomerAdapter.ViewHolder>
{

    private Context context;
    private List<Customers> customersList;

    public CustomerAdapter (Context context, List<Customers> customersList)
    {
        this.customersList = customersList;
        this.context = context;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i)
    {
        // Set layout to user_item for displaying each user
        View view = LayoutInflater.from(context).inflate( R.layout.user_item , viewGroup, false);
        return new CustomerAdapter.ViewHolder( view );
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder viewHolder, int i)
    {
        final Customers customer = customersList.get( i );
        // Set title to user's name
        viewHolder.customerName.setText( customer.getFirstName() + " " + customer.getSurname() );

        // Open Message Activity when user is selected
        viewHolder.itemView.setOnClickListener( new View.OnClickListener() {
            @Override
            public void onClick(View v)
            {
                Intent intent = new Intent(context, MessageActivityOwner.class );
                intent.putExtra( "userid", customer.getId() );
                context.startActivity( intent );
            }
        } );
    }

    @Override
    public int getItemCount()
    {
        return customersList.size();
    }

   /* @Override
    public Filter getFilter() {
        return exampleFilter;
    }

    private Filter exampleFilter = new Filter()
    {
        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            List<Customers> filteredList = new ArrayList<>(  );
            if (constraint == null || constraint.length() == 0)
            {
                filteredList.addAll( customersList );
            }
            else
            {
                // allows search to be case sensitive
                String filteredPattern = constraint.toString().toLowerCase().trim();

                for(Customers customers : customersList )
                {

                }
            }

        }

        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {

        }
    };*/

    public class ViewHolder extends RecyclerView.ViewHolder
    {

        public TextView customerName;

        public ViewHolder(@NonNull View view)
        {
            super( view );

            customerName = view.findViewById( R.id.customerName );
        }
    }

    public void upToDate(List<Customers> newList){
        customersList = new ArrayList<>();
        customersList.addAll(newList);
        notifyDataSetChanged();
    }

}

客户数据库

package com.alicearmstrong.coffeysloyaltyprojectv1.database;

public class Customers

{
    String id, firstName,surname, DOB, contactNumber, email, qrCode;
    Integer loyaltyScore;

    public Customers(String id, String firstName, String surname, String DOB, String contactNumber, String email, String qrCode, Integer loyaltyScore)
    {
        this.id = id;
        this.firstName = firstName;
        this.surname = surname;
        this.DOB = DOB;
        this.contactNumber = contactNumber;
        this.email = email;
        this.qrCode = qrCode;
        this.loyaltyScore = loyaltyScore;

    }

    public String getId() {
        return id;
    }
    public String getFirstName()
    {
        return firstName;
    }

    public String getSurname()
    {
        return surname;
    }

    public String getDOB()
    {
        return DOB;
    }

    public String getContactNumber()
    {
        return contactNumber;
    }

    public String getEmail()
    {
        return email;
    }

    public String getQrCode()
    {
        return qrCode;
    }

    public Integer getLoyaltyScore()
    {
        return loyaltyScore;
    }

    public Customers()
    {

    }
}

我读到 addTextChangeListener 方法只是不确定如何实现该方法。任何帮助将不胜感激。

标签: androidsearchandroid-recyclerview

解决方案


为什么在存在 searchView 时使用 textView。检查下面的代码,但让我看看你的客户 java 类,然后我可以更好地帮助你。在第一个设置搜索视图然后通过 id 查找视图然后....

                search.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
                @Override
                public boolean onQueryTextSubmit(String query) {
                    return false;
                }

                @Override
                public boolean onQueryTextChange(String newText) {
                    String userInput = newText.toLowerCase();
                    List<Customers> newList = new ArrayList<>();
                    for (Customers customersList : accounts) {
                        if (customersList.customerName.toLowerCase().contains(userInput)) {
                            newList.add(accountList);
                        }
                    }
                    accountAdapter.upToDate(newList);
                    return true;
                }
            });

然后在你的适配器中添加 upToDate 函数并在上面的代码中调用它。

    public void upToDate(List<Customers> newList){
          customersList = new ArrayList<>();
          customersList.addAll(newList);
          notifyDataSetChanged();
}

推荐阅读