Reputation: 13
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
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
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