переход по одной кнопке во вьюхолдере влияет на несколько кнопок разных строк

у меня есть эта проблема в моем коде, что когда я делаю переход на одной кнопке в средстве просмотра, который выполняется в Onclicklistener, происходит несколько переходов в разных строках, т.е. если я нажимаю кнопку в строке 1, то кнопка перемещается вправо, что ожидается, но кнопка в строке 6 также перемещается вправо, что не ожидается. я проверил, что идентификатор перехода кнопки в строке 1 такой же, как кнопка в строке 6, я не знаю, что не так с моим кодом. пожалуйста помоги. проверьте мой код.

public class UserCustomAdapter extends ArrayAdapter<User> {                                                                                                                                                                                        
Context context;                                                                                                                                                                                                                               
int layoutResourceId;                                                                                                                                                                                                                          
ArrayList data = new ArrayList();                                                                                                                                                                                                              
String weekDay;                                                                                                                                                                                                                                
AlertDialog alert;                                                                                                                                                                                                                             

public UserCustomAdapter(Context context, int layoutResourceId,                                                                                                                                                                                
                         ArrayList<User> data, String weekDay) {                                                                                                                                                                               
    super(context, layoutResourceId, data);                                                                                                                                                                                                    
    this.layoutResourceId = layoutResourceId;                                                                                                                                                                                                  
    this.context = context;                                                                                                                                                                                                                    
    this.data = data;                                                                                                                                                                                                                          
    this.weekDay = weekDay;                                                                                                                                                                                                                    
}                                                                                                                                                                                                                                              

@Override                                                                                                                                                                                                                                      
public View getView(final int position, final View convertView, final
ViewGroup parent) {                                                                                                                                                      

    View row = convertView;                                                                                                                                                                                                                    
    final UserHolder holder;                                                                                                                                                                                                                   

if (row == null) {    

    LayoutInflater inflater1 = ((Activity) context).getLayoutInflater();

        row = inflater1.inflate(layoutResourceId, parent, false);                                                                                                                                                                              
        holder = new UserHolder();                                                                                                                                                                                                             

        holder.subject = (TextView) row.findViewById(R.id.subject);                                                                                                                                                                                                   
   holder.percentage = (TextView) row.findViewById(R.id.percentage_edit);                                                                                                                                                
        holder.attended = (Button) row.findViewById(R.id.attended);                                                                                                                                                                            
        holder.bunked = (Button) row.findViewById(R.id.bunked);                                                                                                                                                                                
        holder.other = (Button) row.findViewById(R.id.other);                                                                                                                                                                                  

        row.setTag(holder);                                                                                                                                                                                                                    
    }                                                                                                                                                                                                                                          
    else {                                                                                                                                                                                                                                     
        holder = (UserHolder) row.getTag();                                                                                                                                                                                                    
    }                                                                                                                                                                                                                                          

    //to set the text into the fields                                                                                                                                                                                                          
    User user = (User) data.get(position);                                                                                                                                                                                                     

    holder.subject.setText(user.getName());                                                                                                                                                                                                    
    holder.percentage.setText(user.getAddress());                                                                                                                                                                                              

    holder.attended.setId(position);                                                                                                                                                                                                           
    holder.bunked.setId(position);                                                                                                                                                                                                             
    holder.other.setId(position);                                                                                                                                                                                                              

 holder.attended.setOnClickListener(new View.OnClickListener() {                                                                                                                                                                            

        @Override                                                                                                                                                                                                                              
        public void onClick(View v) {                                                                                                                                                                                                          


                // FOR ANIMATIONS OF BUTTONS                                                                                                                                                                                                   
                TranslateAnimation translate = new TranslateAnimation(Animation.RELATIVE_TO_PARENT, 0.0f, Animation.RELATIVE_TO_PARENT, 0.28f, Animation.RELATIVE_TO_PARENT, 0.0f, Animation.RELATIVE_TO_PARENT, 0.0f);                        
                translate.setDuration(600);                                                                                                                                                                                                    
                holder.attended.startAnimation(translate);                                                                                                                                                                                     
                Log.d("trans", holder.attended + "");                                                                                                                                                                                          
                translate.setFillAfter(true);                                                                                                                                                                                                  

                TranslateAnimation translate1 = new TranslateAnimation(Animation.RELATIVE_TO_PARENT, 0.0f, Animation.RELATIVE_TO_PARENT, 1.0f, Animation.RELATIVE_TO_PARENT, 0.0f, Animation.RELATIVE_TO_PARENT, 0.0f);                        
                translate1.setDuration(600);                                                                                                                                                                                                   
                holder.other.startAnimation(translate1);                                                                                                                                                                                       
                translate1.setFillAfter(true);                                                                                                                                                                                                 

                TranslateAnimation translate2 = new TranslateAnimation(Animation.RELATIVE_TO_PARENT, 0.0f, Animation.RELATIVE_TO_PARENT, 1.0f, Animation.RELATIVE_TO_PARENT, 0.0f, Animation.RELATIVE_TO_PARENT, 0.0f);                        
                translate2.setDuration(600);                                                                                                                                                                                                   
                holder.bunked.startAnimation(translate2);                                                                                                                                                                                      
                translate2.setFillAfter(true);                                                                                                                                                                                                 

        }                                                                                                                                                                                                                                      

    });                                                                                                                                                                                                                                        
          return row;
}
 static class UserHolder {
    TextView subject;
    TextView percentage;
    Button attended;
    Button bunked;
    Button other;
}
}                                                                                                                                                                        

person Satyaraj Moily    schedule 03.01.2016    source источник
comment
вам, вероятно, нужно сохранить состояние анимации, как в массиве (вкл / выкл), и если анимация включена, выполните анимацию в этой позиции, иначе ничего не делайте. вы можете выполнить проверку if сразу после (User user = (User) data.get(position);)   -  person Tasos    schedule 03.01.2016
comment
не могли бы вы уточнить, как мне добавить массив после (User user = (User) data.get(position)   -  person Satyaraj Moily    schedule 03.01.2016
comment
у вас уже есть массив для элементов списка, верно?   -  person Tasos    schedule 03.01.2016
comment
Да, у меня есть. но я не понимаю, что это повлияет на переход   -  person Satyaraj Moily    schedule 03.01.2016
comment
можете ли вы ввести код для хранения состояния анимации в массиве, пожалуйста   -  person Satyaraj Moily    schedule 03.01.2016
comment
все, что вы меняете для элемента, скажем, значка с зеленого на желтый, вы обнаружите, что он изменит его и дальше по списку. скажем, вы нажимаете на элемент 1 в списке, чтобы изменить значок, он изменит его на 6, 12, 18. Раньше я знал, почему это произошло, но с тех пор я забыл, как я решил это, добавив (состояние) как лишний элемент в массиве и установите (выкл.). Это для всех элементов массива. Затем в вашем случае в конце кода анимации вы устанавливаете состояние (включено), как это (user.setState(true);). продолжение --   -  person Tasos    schedule 03.01.2016
comment
теперь после (User user = (User) data.get(position); ) вы добавляете (String state = user.getState(); if (Objects.equals(state, true)) { // выполнить анимацию } else { // не выполняйте анимацию } ) - что-то в этом роде, но в вашем случае это анимация, поэтому вам нужно разобраться с (иначе) частью того, как остановить выполнение анимации и ничего не делать, если это правда, поскольку вам нужно выполнить анимацию только один раз. как вы делаете это в своей части onclicklistener   -  person Tasos    schedule 03.01.2016
comment
я понял вашу концепцию, я пытался понять всю ночь, но я заметил еще одну проблему, что кнопка в строке 1 после перехода, если я прокручиваю вниз и прокручиваю много раз, кнопки в других строках также будут переходить как строка 2, строка 3. это потому, что я делаю переход внутри onclicklistener? это лучший способ сделать это? или мой код совершенно неверен?   -  person Satyaraj Moily    schedule 04.01.2016
comment
нет, ваш код выглядит нормально. попробуйте этот способ, так как я настроил прослушиватель кнопок в адаптере --- удалите (holder.attended.setOnClickListener(new View.OnClickListener() {) -- и добавьте -- (final Button btn = (Button) row.findViewById( R.id.attended); btn.setTag(position); btn.setOnClickListener(new View.OnClickListener() {) и также удалите это (holder.attended = (Button) row.findViewById(R.id.attended);)   -  person Tasos    schedule 04.01.2016
comment
нет, это не решило проблему.   -  person Satyaraj Moily    schedule 04.01.2016
comment
переход продолжает двигаться даже в разных строках, когда я прокручиваю вверх и вниз. это не постоянно   -  person Satyaraj Moily    schedule 04.01.2016
comment
у вас есть проверка if else, как я упоминал выше, - в else - проверьте здесь, как остановить анимацию - stackoverflow.com/questions/4112599/   -  person Tasos    schedule 04.01.2016
comment
так что проблема решена. Большое спасибо за это. но есть еще одна проблема: кнопка в строке 1 перемещается слева направо, если я нажимаю на нее, как ожидалось, но когда я прокручиваю вниз и прокручиваю обратно вверх, она снова показывает переход кнопки строки 1, которая перемещается слева направо. и я продолжаю прокручивать вверх и вниз. он проходит каждый раз. но он должен оставаться на своем месте каждый раз, когда я прокручиваю. я знаю, почему это происходит, потому что, как вы сказали мне добавить проверку if после ( final User user = (User) data.get(position);), поэтому каждый раз, когда я прокручиваю, происходит транзит.   -  person Satyaraj Moily    schedule 04.01.2016
comment
Итак, как мне зафиксировать кнопку в ее положении и не действует при прокрутке   -  person Satyaraj Moily    schedule 04.01.2016
comment
да, я предчувствовал, что это произойдет. как я уже упоминал в комментарии, потому что его анимация, а не изменение значка с зеленого на красный, что происходит мгновенно, анимация имеет некоторое время. возможно, вам следует в (if (Objects.equals(state, true)) остановить анимацию и реанимировать без какого-либо времени, чтобы она была мгновенной. (translate.setDuration(0);)   -  person Tasos    schedule 04.01.2016
comment
МОЙ БОГ!!! наконец проблема решена. застрял на этом в течение нескольких месяцев. ты был спасителем. Большое спасибо за помощь. классный ман.   -  person Satyaraj Moily    schedule 04.01.2016
comment
извините за беспокойство, у меня есть другая проблема, т.е. в каждой строке у меня есть кнопка с именем «посещено» и «занято». и у меня есть onclick для обоих. поэтому я добавил еще один массив, чтобы узнать, какая кнопка была нажата, и под (User user = (User) data.get(position);) внутри проверки if на состояние true, я проверил, какая кнопка и сделал переход соответственно, но что происходит заключается в том, что когда я прокручиваю вниз и вверх, оба перехода происходят для одной и той же строки, как если бы я сказал, что нажал кнопку «Посещение» в строке 1, которая перемещает кнопку «Посещение» вправо и смещается вправо, как и ожидалось.   -  person Satyaraj Moily    schedule 04.01.2016
comment
теперь в строке 2, когда я нажал кнопку bunked, которая перемещает кнопку сопровождения влево, а кнопки bunked остаются на своем месте, как и ожидалось. но теперь, когда я прокручиваю вниз и возвращаюсь назад, кнопка строки 1 перемещается следующим образом: сопровождаемые ходы влево и двойное перемещение вправо. это означает, что оба перехода происходят для одной и той же строки. Пожалуйста, помогите мне с этим :'(   -  person Satyaraj Moily    schedule 04.01.2016
comment
Хорошо, я нашел способ решить эту проблему. большое спасибо еще раз за всю помощь. В любом случае, я могу вам помочь.   -  person Satyaraj Moily    schedule 04.01.2016
comment
плохо поставить ответ, и вы можете дать мне голос   -  person Tasos    schedule 04.01.2016


Ответы (1)


Из комментариев

способ решить проблему состоит в том, чтобы добавить и элемент массива, например, state, который изначально установлен на off, а затем установить его на on, когда вы нажимаете кнопку.

Тогда это просто случай проверки if else

если состояние включено, анимируйте кнопку с 0 синхронизацией или отмените анимацию, чтобы она больше не анимировала кнопки.

person Tasos    schedule 04.01.2016