这是此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()的效果,我只需更改valStyleAdapter.getView()的值即可。

最佳答案

实际上here我找到了所有的解释。问题是,如果将 View 设置为可单击,则它将占用该单击,而不会将其传播到容器。

因此convertView.setClickable(true)实际上禁用了点击。

关于android - View.setFocusable()和View.setClickable()在自定义ArrayAdapter中的作用相反,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9512209/

10-11 00:10