Android: кнопка Onclick () не работает после обновления списка - PullRequest
0 голосов
/ 25 октября 2011

В макете строк моего списка есть кнопка. Мне нужно изменить действие, основываясь на тексте в кнопке. Этот текст может быть «Вернуть» или «Направления». Я создал свой собственный класс адаптера, который вносит изменения, если текст кнопки «Вернуть». Упомянутая в макете функция onclick будет работать для текста кнопки «Направления».

//This  is my Onclick() function mentioned in the layout  
public void changecolour(View v) {
    LinearLayout vwParentRow = (LinearLayout) v.getParent();
    final Button btnChild = (Button) vwParentRow.getChildAt(2);
    if (btnChild.getText().toString().equals("Directions")) {
                Intent directiosin = new Intent(getApplicationContext(),
                        Directions.class);
                startActivity(directiosin);
    }

Часть в классе адаптера для текста «Восстановить», показанного ниже.

if (btnChild.getText().toString().equals("Revert")) {
        btnChild.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub

                btnChild.setText("Directions");
                checkbox.setChecked(false);
                getItem(position).setCompleted(false);
                if (0 <= list.get(position).getStatus()
                        && list.get(position).getStatus() < 5) {
                    text.setTextColor(Color.BLUE);
                } else if (5 <= list.get(position).getStatus()
                        && list.get(position).getStatus() < 10) {
                    text.setTextColor(Color.parseColor("#DD7500"));
                } else {
                    text.setTextColor(Color.RED);
                }
            }
        });
    }

Когда я нажимаю на кнопку «Направления». Назначение успешно вызывается. Когда я нажимаю на кнопку «Вернуть», текст кнопки изменяется на «Направления». Но когда нажимается эта кнопка, намерение «directionsIn» не вызывается .

Ответы [ 2 ]

2 голосов
/ 25 октября 2011

Да, я понимаю вашу точку зрения.

Ответ прост. Вы изменили onClickListener кнопки на полностью новый Listener. Решение примерно так:

if (btnChild.getText().toString().equals("Revert")) {

            btnChild.setText("Directions");
            checkbox.setChecked(false);
            getItem(position).setCompleted(false);
            if (0 <= list.get(position).getStatus()
                    && list.get(position).getStatus() < 5) {
                text.setTextColor(Color.BLUE);
            } else if (5 <= list.get(position).getStatus()
                    && list.get(position).getStatus() < 10) {
                text.setTextColor(Color.parseColor("#DD7500"));
            } else {
                text.setTextColor(Color.RED);
            }
        }
    });
}
1 голос
/ 25 октября 2011

Это действительно запутано:)

Прежде всего, вы не используете метку или любое другое визуальное свойство для управления вашим приложением.Дизайн может быть изменен, язык может быть изменен, и тогда вам придется переписать логику приложения.

Во-вторых, вы не должны создавать новых слушателей событий каждый раз, когда происходит событие.Это очень много ресурсов.

Что вам нужно сделать, это создать небольшой маленький класс для элементов:

private class MyListener implements OnClickListener {
   boolean revert = true;
   int id;
   Button button;

   private MyListener(int id) {
      this.id = id;
   }

   public void OnClick(View v) {
      // Do stuff that should be done
      if (revert) {
         // Calls the method for revert, you have the id of the selected item
      } else {
         // Calls the method for directions, you have the id of the selected item
      }
      // TODO Change label of the button
      // TODO Change state of listener
   }
}

Создать массив этих слушателей:

MyListener[] listeners = new MyListener[numberOfItems];

А когда вы хотите получить предмет из адаптера:

public View getView(int position, View convertView, ViewGroup parent) {
   View view = convertView;
   if (view == null) {
      // TODO If View doesn't exist, create a new one
   }
   Button button = (Button)view.findViewById(R.id.theButtonId);
   if (listeners[position] == null) {
      listeners[position] = new MyListener(position);
   }
   button.setText(listeners[position].revert?"Revert":"Directions");
   button.setOnClickListener(listeners[position]);
   listeners[position].button = button;

}

...