Android:按钮Onclick()在更新列表后无法正常工作

时间:2011-10-25 08:56:13

标签: android button onclick

我的列表行的布局中有一个按钮。我需要根据按钮中的文本更改操作。这些文本可以是“恢复”或“方向”。我创建了自己的适配器类,如果按钮文本为“Revert”,则会进行更改。布局中提到的onclick函数将用于按钮文本“Directions”。

//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);
    }

适配器类中用于文本“Revert”的部分如下所示。

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 个答案:

答案 0 :(得分:2)

是的,我明白你的观点。

答案很简单。您将按钮的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 :(得分:1)

这真是搞砸了:))

首先,您不要使用标签或任何其他可视属性来控制您的应用程序。设计可以改变,语言可以改变,而且你必须重写应用逻辑。

其次,每次发生事件时都不应创建新的事件侦听器。这是非常耗费资源的。

你应该做的是为这些项目创建一个小课程:

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;

}