我的列表行的布局中有一个按钮。我需要根据按钮中的文本更改操作。这些文本可以是“恢复”或“方向”。我创建了自己的适配器类,如果按钮文本为“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”意图
答案 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;
}