Получить позицию после фильтрации - PullRequest
0 голосов
/ 13 января 2019

У меня есть просмотрщик и поле для поиска. Если утилизационный фильтр не отфильтрован, нажмите кнопку «Открыть», чтобы просмотреть основные детали выбранного элемента, но после фильтрации переработчик откроет неправильные данные. Адаптер:

открытый класс 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 extends 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);
}

}

1 Ответ

0 голосов
/ 21 января 2019

Я тоже столкнулся с этой проблемой, решение, которое я нашел, это не фильтровать таблицу путем удаления элементов. Но отфильтрованные статьи я установил высоту на 0. Таким образом я сохраню позиции.

Код написан на kotlin, если вы не можете перевести его на 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()
}

Первый метод - это логика для фильтрации, второй метод - обновить повторный цикл. Лучше всего было сделать переопределение метода notifyDataSetChanged, но мы не можем, потому что это последний метод. Поэтому я создал пользовательский notifyDataChanged

Шаг 3: В макете XML поместите идентификатор в макет, потому что мы удалим его размер и установим его в 0

.
//Filtering implementation
val item = items[position]
holder.container.isRemovedHeight = !filteredItems.contains(item)

isRemovedHeight - это расширение, указанное выше, но для Java вы должны вызвать переведенный метод

В вашей деятельности. Когда бы вы ни захотели обновить данные в представлении повторного использования, используйте метод notifyFilteringDataChanged (), чтобы все обновлялось, например:

adapter.notifyFilteringDataChanged()

У вас, администратор, называйте этот метод:

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());
...