#android #android-recyclerview
#Android #android-recyclerview
Вопрос:
мне нужна помощь для этого фильтра или поиска с помощью EditText по фрагменту с помощью RecyclerView, когда afterTextChanged запускает filter и toast, отображая правильные данные, но в RecyclerView ничего не отображается, только пустой список, я пытаюсь создать новый список добавления, но по-прежнему ничего.
это мой фрагмент
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();
}
}
}
в Logcat нет ошибки. для этого мне нужна помощь, извините за плохой английский.
Ответ №1:
Посмотрите на этот пример
Адаптер
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;
}
}
В Fragment
:
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
mListadapter.getFilter().filter(s.toString());
}
Комментарии:
1. могу ли я использовать это с EditText без меню поиска?, потому что я не использую actionbar
2. @D3D Я обновил свой ответ, чтобы фильтровать данные с помощью edittext. процесс тот же, просто используйте
mListadapter.getFilter().filter(textToFilter);
Ответ №2:
1) При привязке вы получаете доступ к объекту из объекта dataList, и ваш getItemCount () также возвращает размер dataList.
2) Во время фильтрации вы выполняете фильтрацию и сохраняете отфильтрованные данные в filterlist и вызываете notifyDataSetChanged().
Итак, здесь всегда отображается ваш dataList, в котором есть все данные, а не filterlist, в котором есть отфильтрованные данные.
Если вы хотите отобразить отфильтрованные данные, вам следует использовать filterlist с recyclerview, например,
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);
}
});
}