android setenabled 子控件,Android ListView子视图setEnabled()和setClickable()什么都不做...
您的方法不起作用的原因有很多。1)onItemClick仅因键盘事件而被调用。具体是KeyKevent.KEYCODE_ENTER。它不是通过任何其他代码路径调用的。因此,只有在尝试提供键盘/轨迹球支持时,处理它才有用。AbsListView的Android源代码相关方法:public boolean onKeyUp(int keyCode, KeyEvent event) {switch (ke
您的方法不起作用的原因有很多。
1)onItemClick仅因键盘事件而被调用。具体是KeyKevent.KEYCODE_ENTER。它不是通过任何其他代码路径调用的。因此,只有在尝试提供键盘/轨迹球支持时,处理它才有用。
AbsListView的Android源代码相关方法:
public boolean onKeyUp(int keyCode, KeyEvent event) {
switch (keyCode) {
case KeyEvent.KEYCODE_DPAD_CENTER:
case KeyEvent.KEYCODE_ENTER:
if (!isEnabled()) {
return true;
}
if (isClickable() && isPressed() &&
mSelectedPosition >= 0 && mAdapter != null &&
mSelectedPosition < mAdapter.getCount()) {
final View view = getChildAt(mSelectedPosition - mFirstPosition);
if (view != null) {
performItemClick(view, mSelectedPosition, mSelectedRowId);
view.setPressed(false);
}
setPressed(false);
return true;
}
break;
}
return super.onKeyUp(keyCode, event);
}
public boolean performItemClick(View view, int position, long id) {
if (mOnItemClickListener != null) {
playSoundEffect(SoundEffectConstants.CLICK);
mOnItemClickListener.onItemClick(this, view, position, id);
return true;
}
return false;
}
2)您正在视图上直接设置可点击信息。通过任何AdapterView显示的视图都是空灵的。它们是根据“20”的要求创建的,只有在“20”需要它们时才存在。您不应该在其上设置要保留的任何数据。您可以立即调用setEnabled和setClickable但是如果您希望该信息持续存在,则需要将其存储在Adapter可以访问的某个位置,以便当AdapterView重新创建该位置的View时可以重新创建它。
3)你需要处理实际View被点击的onClick事件。你在哪里处理这取决于你。最好的地方可能是你的Adapter,然后可能会或可能不会将它传递到你的Activity,具体取决于你的设计要求。这是您需要处理触摸事件的地方。
有关简单的活动,请参阅此代码:
public class PhoneTesting extends Activity {
private static final String TAG = "PhoneTesting";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Log.d(TAG, "onCreate()");
List strings = new ArrayList();
for(int i = 0 ; i < 20 ; i++) {
strings.add(Integer.toString(i));
}
ListView list = (ListView) this.findViewById(R.id.list);
list.setAdapter(new SimpleAdapter(this, 0, 0, strings));
list.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView> parent, View view, int position, long id) {
Log.d(TAG, "onItemClick: " + id);
}
});
}
class SimpleAdapter extends ArrayAdapter implements OnClickListener {
SimpleAdapter(Context context, int resource, int textViewResourceId, List objects) {
super(context, resource, textViewResourceId, objects);
}
SimpleAdapter(Context context, int resource, int textViewResourceId, String[] objects) {
super(context, resource, textViewResourceId, objects);
}
SimpleAdapter(Context context, int resource, int textViewResourceId) {
super(context, resource, textViewResourceId);
}
SimpleAdapter(Context context, int textViewResourceId, List objects) {
super(context, textViewResourceId, objects);
}
SimpleAdapter(Context context, int textViewResourceId, String[] objects) {
super(context, textViewResourceId, objects);
}
SimpleAdapter(Context context, int textViewResourceId) {
super(context, textViewResourceId);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
TextView b = position % 2 == 0 ? new Button(this.getContext()) : new TextView(this.getContext());
b.setText(this.getItem(position));
b.setOnClickListener(this);
return b;
}
@Override
public void onClick(View v) {
TextView t = (TextView) v;
Log.d(TAG, "onClick: " + t.getText());
}
@Override
public boolean isEnabled(int position) {
return position % 2 == 0 ? false : true;
}
}
}
如果执行此代码并单击ListView中的任何Views,您将在logcat输出中注意到仅调用onClick。 onItemClick永远不会被召唤。
另请注意,如果View是可点击的,适配器中的isEnabled似乎没有效果。我不知道如何解释。这意味着,如果你想控制View的属性,Adapter需要设置当创建View并以某种方式维护该信息。
更多推荐



所有评论(0)