我有一个recyclerview和搜索领域。如果回收是未经过滤的onClick打开所选项目的,但过滤回收打开错误的详细信息后corect细节。适配器:
公共类AllProductReyclerAdapter扩展RecyclerView.Adapter {
private BaseActivity mContext;
private OnClickItem mInterface;
private List<Produse> dataList;
public AllProductReyclerAdapter(BaseActivity con, List<Produse> mainCat, OnClickItem _interface) {
if(con!=null) {
mContext = con;
mInterface=_interface;
dataList=mainCat;
}
}
@Override
public int getItemCount() {
return dataList.size();
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_category_items, parent, false);
ViewHolder vh = new ViewHolder(v);
return vh;
}
@Override
public void onBindViewHolder(final ViewHolder holder, final int position) {
holder.tvCatMain.setText("Denumire :"+dataList.get(position).getDenumire());
holder.tvCode.setText("Code :"+dataList.get(position).getCod());
holder.tvDeposit.setText("Depozit :"+dataList.get(position).getDepozit());
holder.tvCant.setText("Cant :"+dataList.get(position).getCant());
holder.tvDate.setText(dataList.get(position).getPicture());
if (dataList.get(position).getPicture()!=null)
Picasso.get().load("http://mysite/test/img/"+dataList.get(position).getProcesare()+" "+dataList.get(position).getCuloare()+".jpg").into(holder.ivItem);
if (dataList.get(position).getPicture()!=null)
Picasso.get()
.load("http://mysite/test/img/"+dataList.get(position).getProcesare()+" "+dataList.get(position).getCuloare()+".jpg")
.placeholder(R.drawable.placeholder)
.error(R.drawable.placeholder)
.into(holder.ivItem);
holder.linMain.setTag(dataList.get(holder.getAdapterPosition()));
holder.linMain.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mInterface.onListItemClick(view.getId(),position);
}
});
}
public class ViewHolder extends RecyclerView.ViewHolder {
public LinearLayout linMain;
public ImageView ivItem;
public TextView tvCatMain,tvCode,tvDeposit,tvCant,tvDate;
public ViewHolder(View view) {
super(view);
tvCatMain = view.findViewById(R.id.tvCatMain);
ivItem = view.findViewById(R.id.ivItem);
tvCode = view.findViewById(R.id.tvCode);
tvDeposit = view.findViewById(R.id.tvDeposit);
tvCant = view.findViewById(R.id.tvCant);
tvDate = view.findViewById(R.id.tvDate);
linMain = view.findViewById(R.id.linMain);
}
}
public void filterList(ArrayList<Produse> filterdNames) {
this.dataList = filterdNames;
notifyDataSetChanged();
}
}
这是该片段:
公共类DashboardFragment扩展BaseFragment {
private RecyclerView rlProductList;
private View ivFilter;
private AllProductReyclerAdapter adapter;
private List<Produse> list=new ArrayList<>();
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_dashboard, container, false);
}
@Override
public void onViewCreated(@NonNull final View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
((MainActivity)getActivity()).setPageTitle("Produse in stoc");
rlProductList = view.findViewById(R.id.rlProductList);
ivFilter = view.findViewById(R.id.ivFilter);
ivFilter.setOnClickListener(this);
rlProductList.setLayoutManager(new LinearLayoutManager(baseActivity, LinearLayoutManager.VERTICAL, false));
adapter= new AllProductReyclerAdapter(baseActivity, list, new OnClickItem() {
@Override
public void onListItemClick(Object o, int position) {
Gson gson = new Gson();
String result = gson.toJson( list.get(position));
Bundle bundle=new Bundle();
bundle.putString("details",result);
ProductdetailsFragment fragment=new ProductdetailsFragment();
fragment.setArguments(bundle);
displayView(fragment);
}
});
rlProductList.setAdapter(adapter);
if (getArguments()!=null){
if (getArguments().getString("search")!=null){
list.clear();
list.addAll(Constants.filteredProduct);
adapter.notifyDataSetChanged();
}
}else{
list.clear();
list.addAll(Constants.allProduct);
adapter.notifyDataSetChanged();
}
EditText etFilter = view.findViewById(R.id.etFilter);
etFilter.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
// TODO Auto-generated method stub
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
// TODO Auto-generated method stub
}
@Override
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
if (adapter!=null){
if (s.toString().length()>0)
filter(s.toString());
else
adapter.notifyDataSetChanged();
}
}
});
}
@Override
public void onClick(View view) {
super.onClick(view);
switch (view.getId()){
case R.id.ivFilter:
displayView(new ProductFilterFragment());
break;
}
}
private void filter(String names) {
//new array list that will hold the filtered data
ArrayList<Produse> filterdNames = new ArrayList<>();
//looping through existing elements
for (int i=0;i<list.size();i++) {
//if the existing elements contains the search input
if (list.get(i).getPicture()!=null&&list.get(i).getPicture().toLowerCase().contains(names.toLowerCase())) {
//adding the element to filtered list
filterdNames.add(list.get(i));
}
}
//calling a method of the adapter class and passing the filtered list
adapter.filterList(filterdNames);
}
}
我也是我遇到了这个问题,我发现是不是要通过移除元素过滤表中的解决方案。但是,筛选项目我将高度设置为0。这样,我保留位置。
该代码是在科特林如果你不能在Java翻译这句话给我,我会帮你的。
第1步:
添加该扩展(或它在Java方法翻译):
var View.isRemovedHeight: Boolean
get() {
return this.height == 0
}
set(value) {
if (value) {
val params = LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, 0)
this.layoutParams = params
} else {
val params = LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT)
this.layoutParams = params
}
}
第2步:在适配器中添加这
//Filtering implementation
private var textFilter: String = ""
private val filteredItems: ArrayList<Items> = ArrayList()
和这个:
// Filtering implementation
fun filter(text: String) {
textFilter = text.toLowerCase()
filteredCustomer.clear()
filteredCustomer.addAll(items.filter { it.name.toLowerCase().contains(textFilter) || it.address.toLowerCase().contains(textFilter) || it.phone.toLowerCase().contains(textFilter) })
notifyDataSetChanged()
}
fun notifyFilteringDataChanged() {
filteredCustomer.addAll(items)
filter(text = textFilter)
notifyDataSetChanged()
}
第一种方法是过滤逻辑,第二种方法是刷新recycleriew。最好的事情是应该做的方法的超越控制notifyDataSetChanged,但我们不能因为它是最后一个方法。所以,我创建了一个自定义的notifyDataChanged
第3步:在布局XML,把一个ID在布局,因为我们将删除它的大小,将它置于0
//Filtering implementation
val item = items[position]
holder.container.isRemovedHeight = !filteredItems.contains(item)
isRemovedHeight是扩展之上,但对Java你要调用的方法翻译
在您的活动每当你想刷新循环视图中的数据,使用notifyFilteringDataChanged()方法,使一切是最新的,就像这样:
adapter.notifyFilteringDataChanged()
在你éditent调用此方法:
adapter.filter(s.toString())
对不起,我的英语,我希望它帮你
Java的
第1步:
public boolean removeHeight(View view, boolean isRemoved) {
if(isRemoved) {
LayoutParams params = LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, 0);
view.setLayoutParams(params);
} else {
LayoutParams params = LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
view.setLayoutParams(params);
}
return isRemoved;
}
第2步:
private String textFilter = "";
private ArrayList<Item> filteredItems = ArrayList();
和:
public void filter(String text){
textFilter = text.toLowerCase();
filteredCustomer.clear();
filteredCustomer.addAll(items.stream().filter(i -> i.name.toLowerCase().contains(textFilter)));
notifyDataSetChanged();
}
public void notifyFilteringDataChanged(){
filteredCustomer.addAll(items);
filter(textFilter);
notifyDataSetChanged();
}
第3步:
Item item = items.get(position);
removeHeight(holder.container, !filteredItems.contains(item));
和:
adapter.notifyFilteringDataChanged();
和:
adapter.filter(s.toString());