获取过滤recyclerview后的位置

问题描述 投票:1回答:1

我有一个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);
}

}

android filter android-recyclerview adapter
1个回答
0
投票

我也是我遇到了这个问题,我发现是不是要通过移除元素过滤表中的解决方案。但是,筛选项目我将高度设置为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());
© www.soinside.com 2019 - 2024. All rights reserved.