Включение Android-переключателя на 1-й позиции автоматически включает 10-й переключатель в режиме просмотра - PullRequest
0 голосов
/ 16 марта 2019

Я работаю над приложением, в котором я выбрал некоторые данные с сервера в программе повторного просмотра. Макет моего списка повторов содержит 3 вида [текстовое представление (для отображения названия события), значок редактирования (для редактирования имен), один переключатель для включения / выключения событий. После нескольких дней работы я обнаружил странную проблему в этом модуле, то есть, когда я включаю 1-й переключатель, я автоматически включаю 10-й переключатель в обзоре реселлера, если меньше 10 имен, скажем, если 9, то все переключатели работают нормально, тогда на входе 10-го они действуют, как упомянуто, и поэтому один поворот на 2-й включает 11-й. Как будто recylerview занимает 10-ю позицию как 1-ю и так далее.

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

:::: eventAdapter.java::::

public class eventAdapter extends RecyclerView.Adapter<eventAdapter.UsersViewHolder> {

    Context context;
    List<EventModel> userListResponseData;

    public eventAdapter(Context context, List<EventModel> userListResponseData) {
        this.userListResponseData = userListResponseData;
        this.context = context;

    }

    @Override
    public UsersViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        View view = LayoutInflater.from(context).inflate(R.layout.event_list_items, parent,false);
        UsersViewHolder usersViewHolder = new UsersViewHolder(view);
        return usersViewHolder;
    }

    @Override
    public void onBindViewHolder(final UsersViewHolder holder, final int position) {
        // set the data
        final String eventName = userListResponseData.get(position).getEvent_name();
         holder.ed_eventname.setText(eventName);



        holder.ic_event_edit.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View v) {
              FragmentActivity activity = (FragmentActivity)(context);
              FragmentManager fm = activity.getSupportFragmentManager();
              EditEvent_Dialog alertDialog = new EditEvent_Dialog();
              Bundle bundle = new Bundle();
              bundle.putString("event_name", eventName);
              alertDialog.setArguments(bundle);

              alertDialog.show(fm, "fragment_alert");
//
          }
      });

    holder.event_cardView.setOnClickListener(new View.OnClickListener() {
                      @Override
                      public void onClick(View v) {
                          boolean state=holder.EventSwitch.isChecked();
                          if (state){

                              Toast.makeText(context, eventName+" is Activated", Toast.LENGTH_SHORT).show();
                          }
                          else
                              Toast.makeText(context, eventName+" is Deactivated", Toast.LENGTH_SHORT).show();
                          }
                  });
          }

    @Override
    public int getItemCount() {
        return userListResponseData.size(); // size of the list items
    }

    class UsersViewHolder extends RecyclerView.ViewHolder {
        // init the item view's
        private TextView ed_eventname;
        private ImageView ic_event_edit;
        private Switch EventSwitch;
        private CardView event_cardView;

        public UsersViewHolder(View itemView) {
            super(itemView);
            // get the reference of item view's
            ed_eventname = (TextView) itemView.findViewById(R.id.fetchevent_name);
            ic_event_edit = (ImageView) itemView.findViewById(R.id.edit_event);
            EventSwitch = (Switch) itemView.findViewById(R.id.event_switch);
            event_cardView = (CardView) itemView.findViewById(R.id.event_list_card);
        }
    }
}

:::: event_list_items.xml ::::

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:id="@+id/event_list_card"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="10dp"
    card_view:cardBackgroundColor="@color/colorPrimary"
    card_view:cardCornerRadius="10dp">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:background="@color/colorPrimary">

        <TextView
        android:id="@+id/fetchevent_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="#fff"
        android:layout_gravity="left|center"
        android:padding="5dp"
        android:textSize="15sp"
        android:layout_margin="5dp"
        />
        <ImageView
            android:id="@+id/edit_event"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/pencilicon"
            android:layout_margin="5dp"
            android:layout_gravity="center"

            android:padding="5dp"/>
        <Switch
            android:id="@+id/event_switch"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="5dp"
            android:layout_gravity="end|center"
            android:theme="@style/SwitchCompatTheme" />
    </LinearLayout>
</android.support.v7.widget.CardView>

:::: Recyclerview в основном макете ::::

 <android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerView_event"
        android:scrollbars="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

:::: :::: EDIT

EventModel.java

public class EventModel {

    public String event_name;

    public EventModel(String event_name){
        this.event_name = event_name;
    }

    public EventModel(){

    }

    public void setEvent_name(String event_name) {
        this.event_name = event_name;
    }

    public String getEvent_name() {
        return event_name;
    }
}

Ответы [ 2 ]

2 голосов
/ 16 марта 2019

Проблема здесь в том, что вы проверяете, проверяется ли переключатель на виде, а не на модели. Модель должна иметь логическую переменную isChecked, которая определяет, проверено ли представление. Вы никогда не должны проверять, проверен ли вид из вида Например,

Добавьте это в свой onBindViewHolder:

 holder.EventSwitch.setOnClickListener(new View.OnClickListener() {
                      @Override
                      public void onClick(View v) {
                          boolean state=userListResponseData.get(position).isChecked();
                          userListResponseData.get(position).setChecked(!state);

                  });
          }


      holder.EventSwitch.setChecked(userListResponseData.get(position).isChecked());

И измените свою модель на следующую:

 public class EventModel {

        public String event_name;

        private boolean checked;

        public boolean isChecked(){
            return checked;
        }
        public void setChecked(boolean checked){
            this.checked = checked;

        }
        public EventModel(String event_name){
            this.event_name = event_name;
        }

        public EventModel(){

        }

        public void setEvent_name(String event_name) {
            this.event_name = event_name;
        }

        public String getEvent_name() {
            return event_name;
        }


}
0 голосов
/ 16 марта 2019

Это связано с переработкой View (от названия класса). Представления используются повторно и привязываются к новым значениям при прокрутке списка. Чтобы это работало, ваша функция связывания ДОЛЖНА устанавливать состояние проверки каждый раз, когда она вызывается. И ваши слушатели проверки должны записать состояние проверки где-нибудь в класс модели, так что если вы прокрутите эту позицию за пределы экрана, а затем снова включите ее, вы сможете восстановить ее.

Весь смысл представления рециркулятора состоит в том, чтобы получить такое поведение при переработке, чтобы вы могли минимизировать использование памяти представлениями (которые очень тяжелые). Это не просто показать вещи в списке. Похоже, вы не поняли, как работает класс.

...