Recyclerview getAdapterPosition для Searchview - PullRequest
0 голосов
/ 28 апреля 2018

У меня возникают трудности с возвратом правильных представлений, когда я использую свой поисковый вид моего повторного просмотра.

Я надуваю правильное представление, когда использую только переработчик при щелчке элемента, однако, как только я выполняю поиск и появляются результаты, неправильное представление надувается.

Я полагаю, что это из-за того, что я использовал position, это не лучший способ сохранить исходные позиции рециркулятора при использовании поиска.

Я видел, что getAdapterPosition() - это лучший способ сохранить позицию элемента с помощью поиска.

Если кто-нибудь может помочь мне реализовать лучший способ поддержания того, что становится завышенным после поиска, я был бы очень признателен! Я также приведу пример после кода для конкретного сценария.

Также, для пояснения, я раздуваю представления из RecyclerAdapter в методе адаптера onBindViewHolder .

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewHolder> {

private List<Data> listData = new ArrayList<Data>();
private Context context;
Dialog myDialog;

public RecyclerViewAdapter(List<Data> listData, Context context) {
    this.listData = listData;
    this.context = context;
}

@Override
public RecyclerViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    LayoutInflater inflater = LayoutInflater.from(parent.getContext());
    View itemView = inflater.inflate(R.layout.item,parent,false);
    return new RecyclerViewHolder(itemView);
}


@Override
public void onBindViewHolder(RecyclerViewHolder holder, int position) {
    holder.itemz.setImageResource(listData.get(position).getitemz());
    holder.itemName.setText(listData.get(position).getitemName());
    holder.itemPrice.setText(listData.get(position).getitemPrice());
    holder.itemVal.setText(listData.get(position).getitemVal());

    holder.setItemClickListener(new ItemClickListener() {
        @Override
        public void onClick(View view, int position) {
            final SwipeDismissDialog swipeDismissDialog;
            Button btnOK;
            if (position == 0) {
                myDialog = new Dialog(context);

                LayoutInflater inflater = (LayoutInflater) context.getSystemService(context.LAYOUT_INFLATER_SERVICE);
                View itemView = inflater.inflate(R.layout.item_cards, null);

                swipeDismissDialog = new SwipeDismissDialog.Builder(myDialog.getContext()).setView(itemView).build().show();

                TextView words = (TextView)itemView.findViewById(R.id.words);
                words.setText("Success1");

                btnOK = (Button)itemView.findViewById(R.id.btnOK);
                btnOK.setOnClickListener(
                        new View.OnClickListener() {
                            @Override
                            public void onClick(View v) {
                                swipeDismissDialog.dismiss();
                            }
                        }
                );

            }
            else if (position == 1){
                myDialog = new Dialog(context);

                LayoutInflater inflater = (LayoutInflater) context.getSystemService(context.LAYOUT_INFLATER_SERVICE);
                View itemView = inflater.inflate(R.layout.item_cards, null);

                swipeDismissDialog = new SwipeDismissDialog.Builder(myDialog.getContext()).setView(itemView).build().show();

                TextView words = (TextView)itemView.findViewById(R.id.words);
                words.setText("Success2");

                btnOK = (Button)itemView.findViewById(R.id.btnOK);
                btnOK.setOnClickListener(
                        new View.OnClickListener() {
                            @Override
                            public void onClick(View v) {
                                swipeDismissDialog.dismiss();
                            }
                        }
                );
            }
        }
    });
}

@Override
public int getItemCount() {
    return listData.size();
}

public void filterList(ArrayList<Data> filteredList){
    listData = filteredList;
    notifyDataSetChanged();
}

}

Что происходит:

  1. Когда я загружаю упражнение и нажимаю на элемент 1 в утилите, содержимое success1 выглядит как положено.
  2. Когда я выполняю поиск для item2, элемент возвращается, как и ожидалось, однако, если я нажимаю на элемент, вместо success2 появляется success1.

Что может быть лучшим решением для этого?

Буду признателен за любую помощь!

1 Ответ

0 голосов
/ 28 апреля 2018

Полагаю, что когда вы выполняете поиск, вы устанавливаете новый список данных в вашем адаптере, и этот новый список содержит item2 в позиции 0.

Итак, когда вы нажимаете на элемент, вы нажимаете на элемент в позиции 0, и в вашем коде у вас есть что-то вроде этого:

Таким образом, вы должны использовать условие для предмета, а не позицию. Вот лучший способ сделать это:

public Data getDataAtPosition(int position) {
    if (listData!= null && listData.size() > position)
        return listData.get(position);
    else
        return null;
}

А потом:

@Override
public void onBindViewHolder(RecyclerViewHolder holder, int position) {
    // ...
    holder.setItemClickListener(new ItemClickListener() {
        @Override
        public void onClick(View view, int position) {
            Data data = getDataAtPosition(position);
            if (data != null && data.isItem1())
                // Success1
            else if (data != null && data.isItem2())
               // Success2
        }
}

PS: вы создаете новый слушатель каждый раз, когда меняется ваш держатель, может быть, вы могли бы проверить это объяснение о том, как создать ClickListener в RecyclerView: https://stackoverflow.com/a/26196831/9434800

...