2

好的,在过去的几个小时里,我一直在努力弄清楚为什么我的自定义列表视图适配器无法与 OnItemClickListener 一起正常工作。我有一个 TextView,我使用 DrawableLeft 属性在 ListView 内的 textview 左侧绘制图像。现在在我的文本视图中,我确实将 android:focusable 和 android:focusableInTouchMode 以及 android:clickable all 设置为 false,并且在我的列表视图的根目录中,我将 android:descendantFocusability 设置为 blocksDescendants,因为这些是遇到这个确切问题的常见问题. 现在这是我要使用的布局文件:

<ListView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/menu"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#363636"
android:dividerHeight="1dp"
android:divider="@drawable/menudivider"
android:paddingLeft="@dimen/list_padding"
android:paddingRight="@dimen/list_padding"
android:descendantFocusability="blocksDescendants" />

这是我的 TextView 布局:

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/menu_list"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:textColor="#fff"
    android:typeface="sans"
    android:textSize="20sp"
    android:drawablePadding="10dp"
    android:padding="7dp"
    android:focusable="false"
    android:focusableInTouchMode="false"
    android:clickable="false" />

我在从 BaseAdapter 派生的类的 getView 函数中以编程方式设置了 DrawableLeft Image。至于我在其中实现 OnItemClickListener 函数的活动有点像这样:

public class ActivityBase extends Activity implements OnItemClickListener {

private ListView mSlidinglist = null;

@Override
public void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);

              mSlidinglist = (ListView)findViewById(R.id.menu);
              ArrayList<MenuItem> items = new ArrayList<MenuItem>();
              items.add(new MenuItem("Test",R.drawable.test) );
              CustomAdapter adapter = new CustomAdapter(this,items);

              mSlidinglist.setAdapter(adapter);
              mSlidinglist.setOnItemClickListener(this);
    }

    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    Toast.makeText(this, "Clicked", Toast.LENGTH_LONG).show();

     }
  }

这是我的自定义适配器:

    public class CustomAdapter extends BaseAdapter
     {
       private ArrayList<MenuItem> items;
       private Context mContext;

      public CustomAdapter(Context context, ArrayList<MenuItem> items)
        {
        this.items = items;
        this.mContext = context;
        }

@Override
public View getView(int position, View convertView, ViewGroup parent)
{
    View v = convertView;
    if(v == null) {
        LayoutInflater vi = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        v = vi.inflate(R.layout.list_row, null);
    }

    final MenuItem l = items.get(position);

    if(l != null) {
        TextView title = (TextView) v.findViewById(R.id.menu_list);

        title.setText(l.getTitle());
        title.setCompoundDrawablesWithIntrinsicBounds(l.getImageId(), 0, 0, 0);
    }
    return v;
}

@Override
public int getCount() {
    return items.size();
}

@Override
public Object getItem(int position) {
    return items.get(position);
}

@Override
public long getItemId(int position) {
    return position;
}

}

MenuItem 类只是我需要的字段的设置器和获取器......

我无法启动它,我不明白如果需要更多代码,为什么会感谢任何帮助,只是让我知道只是不想发布所有内容。BaseAdapter 的子类非常简单,它只是使用 setCompoundDrawablesWithIntrinsicBounds 设置 TextView 和 DrawableLeft 字段的文本。如果有人可以提供帮助,将不胜感激。

4

4 回答 4

0

好的,我刚刚测试了代码,对其进行了一些编辑,现在它可以工作了。

我改变了什么:

   if(l != null) {
    TextView title = (TextView) v; // insted of findView

    title.setText(l.getTitle());
    title.setCompoundDrawablesWithIntrinsicBounds(l.getImageId(), 0, 0, 0);
}
于 2013-02-03T11:24:31.753 回答
0

尝试更改活动以扩展 ListActivity .. logcat 中的错误是什么?

于 2013-02-03T20:44:46.017 回答
0

奇怪的是,当我删除处理可聚焦性和可点击性的属性时,我开始工作了。我不明白,但看看这是否适合你。

于 2013-02-16T23:32:18.023 回答
0

将这些应用到子视图

android:focusable="false"
android:focusableInTouchMode="false"

将此应用于父布局

android:descendantFocusability="blocksDescendants"

在您的代码中添加这两行:

 mSlidinglist.setClickable(true)
 mSlidinglist.setEnable(true)
于 2017-07-12T05:35:26.163 回答