D3D
D3D

Reputation: 13

filter function on recyclerview not showing list

i need help for this filter or search with editText on fragment with recyclerView, when afterTextChanged running filter and toast show correct data, but in recyclerView not showing anything only blank list, i try create new add list but still nothing.

this is my fragment

public class HomeFragment extends Fragment {

    private SQLiteHandler db;
    private TextView welcome;
    private TextView jmlInspection;
    private RecyclerView mRecyclerView;
    private ListAdapter mListadapter;
    EditText searchHome;
    private ArrayList<DataNote> arraylist = new ArrayList<DataNote>();

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_home, container, false);


        // SqLite database handler
        db = new SQLiteHandler(getActivity().getApplicationContext());

        // Fetching user details from sqlite
        HashMap<String, String> user = db.getUserDetails();
        String name = user.get("name");

        welcome = (TextView) view.findViewById(R.id.txtWelcome);
        jmlInspection = (TextView) view.findViewById(R.id.txtJmlInspection);
        mRecyclerView = (RecyclerView) view.findViewById(R.id.recyclerView);
        searchHome = (EditText) view.findViewById(R.id.searchHome);

        welcome.setText("Welcome, "+name +"!");
        jmlInspection.setText("Saat ini anda memiliki 7 Data.");

        final LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity());
        layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
        mRecyclerView.setLayoutManager(layoutManager);

        //ArrayList data = new ArrayList<DataNote>();
        for (int i = 0; i < DataNoteImformation.id.length; i++)
        {
            DataNote wp = new DataNote(
                    DataNoteImformation.id[i],
                    DataNoteImformation.branchArray[i],
                    DataNoteImformation.assetcodeArray[i],
                    DataNoteImformation.customerArray[i],
                    DataNoteImformation.licenseplateArray[i]
            );
            arraylist.add(wp);
        }

        mListadapter = new ListAdapter(arraylist);
        mRecyclerView.setAdapter(mListadapter);

        searchHome.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

            }

            @Override
            public void onTextChanged(CharSequence query, int i, int i1, int i2) {


            }

            @Override
            public void afterTextChanged(Editable editable) {
                String text = searchHome.getText().toString().toLowerCase(Locale.getDefault());
                mListadapter.filter(text);
            }
        });

        return view;
    }

    public class ListAdapter extends RecyclerView.Adapter<ListAdapter.ViewHolder>
    {
        private ArrayList<DataNote> dataList;
        private List<DataNote> filterlist = null;

        public ListAdapter(ArrayList<DataNote> data)
        {
            this.dataList = data;
            this.filterlist = data;
        }

        public class ViewHolder extends RecyclerView.ViewHolder
        {
            TextView textViewBranch;
            TextView textViewAsset;
            TextView textViewCustomer;
            TextView textViewLicense;
            Button btnReceive;

            public ViewHolder(View itemView)
            {
                super(itemView);
                this.textViewBranch = (TextView) itemView.findViewById(R.id.branch);
                this.textViewAsset = (TextView) itemView.findViewById(R.id.assetcode);
                this.textViewCustomer = (TextView) itemView.findViewById(R.id.customername);
                this.textViewLicense = (TextView) itemView.findViewById(R.id.licenseplate);
                this.btnReceive = (Button) itemView.findViewById(R.id.receiveBtn);
            }
        }

        @Override
        public ListAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
        {
            View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.recyclerview_item, parent, false);

            ViewHolder viewHolder = new ViewHolder(view);
            return viewHolder;
        }

        @Override
        public void onBindViewHolder(ListAdapter.ViewHolder holder, final int position)
        {
            holder.textViewBranch.setText(dataList.get(position).getBranch());
            holder.textViewAsset.setText(dataList.get(position).getAssetcode());
            holder.textViewCustomer.setText(dataList.get(position).getCustomer());
            holder.textViewLicense.setText(dataList.get(position).getLisenceplate());

            holder.btnReceive.setOnClickListener(new View.OnClickListener()
            {
                @Override
                public void onClick(View v)
                {
                    //Toast.makeText(getActivity(), "Item " + position + " is clicked.", Toast.LENGTH_SHORT).show();
                    Intent intent = new Intent(getActivity(),
                            AssetReceiveActivity.class);
                    intent.putExtra("name",dataList.get(position).getCustomer());
                    intent.putExtra("code",dataList.get(position).getAssetcode());
                    intent.putExtra("plat",dataList.get(position).getLisenceplate());
                    startActivity(intent);
                }
            });
        }

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

        public void filter(String charText) {
            charText = charText.toLowerCase(Locale.getDefault());
            filterlist.clear();
            if (charText.length() == 0) {
                filterlist.addAll(dataList);
            }
            else
            {
                for (DataNote wp : dataList)
                {
                    if (wp.getCustomer().toLowerCase().contains(charText.toLowerCase()))
                    {
                        //Toast.makeText(getActivity(), "data " + wp.getCustomer() , Toast.LENGTH_SHORT).show();
                        filterlist.add(wp);
                    }
                }
            }
            notifyDataSetChanged();
        }

    }

}

no error on Logcat. i need help for this, sorry for bad english.

Upvotes: 0

Views: 233

Answers (2)

S.R
S.R

Reputation: 2829

Look at this example

Adapter

public class ListAdapter extends RecyclerView.Adapter<ItemHolder> implements Filterable {


    private Context iContext;

    private List<DataNote > dataList = new ArrayList<>();
    private List<DataNote > filterlist = new ArrayList<>();

    public ListAdapter (List<DataNote > dataList, Context context) {
        this.dataList = dataList;
        this.filterlist = dataList;
        iContext = context;
    }

    @Override
    public Filter getFilter() {
        Filter filter = new Filter() {
            @Override
            protected void publishResults(CharSequence constraint, FilterResults results) {
                dataList= (List<DataNote >) results.values;
                notifyDataSetChanged();
            }
            @Override
            protected FilterResults performFiltering(CharSequence constraint) {
                FilterResults results = new FilterResults();
                List<DataNote> filteredList = new ArrayList<>();
                String searchText = constraint.toString().toLowerCase();
                String[] split = searchText.split(",");
                ArrayList<String> searchGenres = new ArrayList<>(split.length);
                for (String aSplit : split) {
                    // remove spaces
                    String trim = aSplit.trim();
                    // skip empty entries
                    if (trim.length() > 0)
                        searchGenres.add(trim);
                }

                for (DataNote dataNames : filterlist) {
                    // filter by title
                    if (dataNames.getCustomer().toLowerCase().trim().contains(searchText)) {
                        filteredList.add(dataNames);
                    }
                }
                results.count = filteredList.size();
                results.values = filteredList;
                return results;
            }

        };
        return filter;
    }



}

In Fragment :

@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
    mListadapter.getFilter().filter(s.toString());
}

Upvotes: 1

Harshith Shetty
Harshith Shetty

Reputation: 361

1) In on bind, you are accessing object from dataList Object and your getItemCount() is also returning the size of dataList.

2) During filtering, you are performing filtering and storing the filtered data in filterlist and calling notifyDataSetChanged().

So here your dataList which has all the data, is shown always and not the filterlist which has the data which is filtered.

If you want to show the filtered data, you should use the filterlist with the recyclerview like,

public ListAdapter(ArrayList<DataNote> data)
        {
            this.dataList = data;
            this.filterlist = new ArrayList(dataList);
        }


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


        @Override
        public void onBindViewHolder(ListAdapter.ViewHolder holder, final int position)
        {
            holder.textViewBranch.setText(filterlist.get(position).getBranch());
            holder.textViewAsset.setText(filterlist.get(position).getAssetcode());
            holder.textViewCustomer.setText(filterlist.get(position).getCustomer());
            holder.textViewLicense.setText(filterlist.get(position).getLisenceplate());

            holder.btnReceive.setOnClickListener(new View.OnClickListener()
            {
                @Override
                public void onClick(View v)
                {
                    //Toast.makeText(getActivity(), "Item " + position + " is clicked.", Toast.LENGTH_SHORT).show();
                    Intent intent = new Intent(getActivity(),
                            AssetReceiveActivity.class);
                    intent.putExtra("name",filterlist.get(position).getCustomer());
                    intent.putExtra("code",filterlist.get(position).getAssetcode());
                    intent.putExtra("plat",filterlist.get(position).getLisenceplate());
                    startActivity(intent);
                }
            });
        }



Upvotes: 0

Related Questions