这是此question的后续版本,其中Reimar Twelker建议使用View.setFocusable()
和View.setClickable()
使用ArrayAdapter启用/禁用 ListView 中的行。
我尝试这样做,但是得到的效果却与我预期的相反。
如果我用
View.setFocusable(true);
View.setClickable(true);
该行被禁用(按此键无效)。如果我使用相反的说法:
View.setFocusable(false);
View.setClickable(false);
该行已启用(按下时将应用选择)。
关于可能发生什么的任何线索?
这是我的布局内容:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/row_style"
android:layout_width="fill_parent"
android:layout_height="?android:attr/listPreferredItemHeight"
android:paddingLeft="5dip"
android:paddingRight="5dip">
<ImageView android:id="@+id/row_image_style"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:adjustViewBounds="false"
android:scaleType="centerCrop"
android:drawingCacheQuality="low" />
</FrameLayout>
我在这样的警报对话框中使用它:
dialog = new AlertDialog.Builder(this)
.setTitle(R.string.templates_dialog)
.setAdapter(new StyleAdapter(this, R.id.row_style, StyleTemplate.values()),
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
setTemplate(StyleTemplate.values()[which]);
}
})
.create();
dialog.setCanceledOnTouchOutside(true);
StyleAdapter
定义如下:public class StyleAdapter extends ArrayAdapter<StyleTemplate>{
private final StyleTemplate[] m_objects;
private final LayoutInflater inflater;
public StyleAdapter(Context context, int textViewResourceId, StyleTemplate[] objects) {
super(context, textViewResourceId, objects);
m_objects = objects;
inflater = getLayoutInflater();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View row = convertView;
if (row == null) { // Reuse the old view if it exists
row = inflater.inflate(R.layout.row_style, parent, false);
}
// Get the selected style data
StyleTemplate style = m_objects[position];
// Set the background image to the template background
ImageView bg = (ImageView) row.findViewById(R.id.row_image_style);
bg.setImageDrawable(null);
bg.setBackgroundColor(Color.rgb(style.bR, style.bG, style.bB));
boolean val = true;
row.setFocusable(val);
row.setClickable(val);
return row;
}
}
要测试
setFocusable()
和setClickable()
的效果,我只需更改val
中StyleAdapter.getView()
的值即可。 最佳答案
实际上here我找到了所有的解释。问题是,如果将 View 设置为可单击,则它将占用该单击,而不会将其传播到容器。
因此convertView.setClickable(true)
实际上禁用了点击。
关于android - View.setFocusable()和View.setClickable()在自定义ArrayAdapter中的作用相反,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9512209/