自定义 Android 列表视图项目在整个区域上不可选择

发布于 2024-11-25 04:45:35 字数 4637 浏览 2 评论 0原文

我使用带有自定义适配器的 ListView 将项目显示为标题/副标题 TextView 对。

不幸的是,我只需单击项目的上半部分即可选择一个项目,即标题占据的部分

这是我正在使用的代码:

journal_list.xml

<?xml version="1.0" encoding="utf-8"?>

<ListView
    android:id="@android:id/list"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:drawSelectorOnTop="false"
    android:background="#fff"
    android:cacheColorHint="#fff"
    android:paddingBottom="6dp"
/>

用于列表项布局的journal_list_item.xml

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
          android:layout_width="fill_parent"
          android:layout_height="wrap_content"
          android:descendantFocusability="blocksDescendants"
          >
<TextView
    android:id="@+id/journal_entry_date"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:textStyle="bold"
    android:textColor="#000"
    android:textSize="18sp"

    android:layout_alignParentTop="true"
    android:layout_alignParentLeft="true"
/>
<TextView
    android:id="@+id/journal_content"
    android:paddingLeft="28dp"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:textSize="16sp"
    android:textColor="#555"
    android:inputType="textMultiLine"
    android:maxLines="2"
    android:minLines="1"
    android:layout_below="@id/journal_entry_date"
    android:layout_alignParentLeft="true"
/>

还有适配器的代码:

private class JournalAdapter extends ArrayAdapter<JournalEntry> {
    Context ctxt;
    public JournalAdapter(Context ctxt) {
        super(ctxt, R.layout.journal_list_item);
        this.ctxt = ctxt;
    }
    public View getView(int position, View convertView, ViewGroup parent) {
        View row = convertView;
        JournalHolder holder;
        if (row == null) {
            row = ((LayoutInflater)ctxt.getSystemService(Context.LAYOUT_INFLATER_SERVICE)).
                    inflate(R.layout.journal_list_item, parent, false);
            holder = new JournalHolder(row);
            row.setTag(holder);
        } else {
            holder = (JournalHolder) row.getTag();
        }
        JournalEntry crt = getItem(position);
        holder.getDate().setText(crt.dateWritten);
        holder.getContent().setText(crt.content);

        return row;
    }
}

private static class JournalHolder {
    private TextView date;
    private TextView content;
    private View base;

    public JournalHolder(View base) {
        this.base = base;
    }
    public TextView getDate() {
        if (date == null)
            date = (TextView) base.findViewById(R.id.journal_entry_date);
        return date;
    }
    public TextView getContent() {
        if (content == null)
            content = (TextView) base.findViewById(R.id.journal_content);
        return content;
    }
}

代码来自ListActivity 的 onCreate() 方法:

private JournalAdapter adapter;

@Override
public void onCreate(Bundle icicle) {
    super.onCreate(icicle);
    setContentView(R.layout.journal_list);
    adapter = new JournalAdapter(this);
    setListAdapter(adapter);
    registerForContextMenu(getListView());
}

另外,我在 onResume() 中调用一个名为 updateList() 的方法,

private void updateList() {
    adapter.clear();
    Cursor cursor = helper.listJournal(start, end);
    cursor.moveToFirst();
    JournalEntry crt;
    while (!cursor.isAfterLast()) {
        crt = new JournalEntry();
        crt.dateWritten = cursor.getString(cursor.getColumnIndex("date_written"));
        crt.content = cursor.getString(cursor.getColumnIndex("content"));
        crt.id = cursor.getInt(cursor.getColumnIndex("entry_id"));
        adapter.add(crt);
        cursor.moveToNext();
    }
    cursor.close();
    adapter.notifyDataSetChanged();
}

列表项单击是在 ListActivity 的 onListItemClick 中处理的,如下所示:

@Override
public void onListItemClick(ListView l, View v, int position, long id) {
    Intent intent = new Intent(this, JournalEditor.class);
    intent.setAction(Intent.ACTION_EDIT);
    intent.putExtra("entry_id", adapter.getItem(position).id);
    startActivity(intent);
}

显然,我忘记了一些东西很重要,这就是为什么会发生这整个奇怪的事情。

我在这里找到了类似的讨论:http://groups.google.com /group/android-developers/browse_thread/thread/5636c8ea74033657 但这不是很有帮助。

I am using a ListView with a custom adapter for displaying items as pairs of title/subtitle TextViews.

Unfortunately, I can select an item just by clicking on its upper half, the one occupied by the title

Here is the code I am using:

journal_list.xml

<?xml version="1.0" encoding="utf-8"?>

<ListView
    android:id="@android:id/list"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:drawSelectorOnTop="false"
    android:background="#fff"
    android:cacheColorHint="#fff"
    android:paddingBottom="6dp"
/>

journal_list_item.xml for the list item's layout

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
          android:layout_width="fill_parent"
          android:layout_height="wrap_content"
          android:descendantFocusability="blocksDescendants"
          >
<TextView
    android:id="@+id/journal_entry_date"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:textStyle="bold"
    android:textColor="#000"
    android:textSize="18sp"

    android:layout_alignParentTop="true"
    android:layout_alignParentLeft="true"
/>
<TextView
    android:id="@+id/journal_content"
    android:paddingLeft="28dp"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:textSize="16sp"
    android:textColor="#555"
    android:inputType="textMultiLine"
    android:maxLines="2"
    android:minLines="1"
    android:layout_below="@id/journal_entry_date"
    android:layout_alignParentLeft="true"
/>

Also the code for the adapter:

private class JournalAdapter extends ArrayAdapter<JournalEntry> {
    Context ctxt;
    public JournalAdapter(Context ctxt) {
        super(ctxt, R.layout.journal_list_item);
        this.ctxt = ctxt;
    }
    public View getView(int position, View convertView, ViewGroup parent) {
        View row = convertView;
        JournalHolder holder;
        if (row == null) {
            row = ((LayoutInflater)ctxt.getSystemService(Context.LAYOUT_INFLATER_SERVICE)).
                    inflate(R.layout.journal_list_item, parent, false);
            holder = new JournalHolder(row);
            row.setTag(holder);
        } else {
            holder = (JournalHolder) row.getTag();
        }
        JournalEntry crt = getItem(position);
        holder.getDate().setText(crt.dateWritten);
        holder.getContent().setText(crt.content);

        return row;
    }
}

private static class JournalHolder {
    private TextView date;
    private TextView content;
    private View base;

    public JournalHolder(View base) {
        this.base = base;
    }
    public TextView getDate() {
        if (date == null)
            date = (TextView) base.findViewById(R.id.journal_entry_date);
        return date;
    }
    public TextView getContent() {
        if (content == null)
            content = (TextView) base.findViewById(R.id.journal_content);
        return content;
    }
}

Code from the ListActivity's onCreate() method:

private JournalAdapter adapter;

@Override
public void onCreate(Bundle icicle) {
    super.onCreate(icicle);
    setContentView(R.layout.journal_list);
    adapter = new JournalAdapter(this);
    setListAdapter(adapter);
    registerForContextMenu(getListView());
}

Also, I am calling a method called updateList() in onResume()

private void updateList() {
    adapter.clear();
    Cursor cursor = helper.listJournal(start, end);
    cursor.moveToFirst();
    JournalEntry crt;
    while (!cursor.isAfterLast()) {
        crt = new JournalEntry();
        crt.dateWritten = cursor.getString(cursor.getColumnIndex("date_written"));
        crt.content = cursor.getString(cursor.getColumnIndex("content"));
        crt.id = cursor.getInt(cursor.getColumnIndex("entry_id"));
        adapter.add(crt);
        cursor.moveToNext();
    }
    cursor.close();
    adapter.notifyDataSetChanged();
}

List item clicking is handled in the onListItemClick of my ListActivity, as follows:

@Override
public void onListItemClick(ListView l, View v, int position, long id) {
    Intent intent = new Intent(this, JournalEditor.class);
    intent.setAction(Intent.ACTION_EDIT);
    intent.putExtra("entry_id", adapter.getItem(position).id);
    startActivity(intent);
}

Apparently, I am forgetting something important, and that's why this whole weird thing happens.

I have found a similar discussion here: http://groups.google.com/group/android-developers/browse_thread/thread/5636c8ea74033657 but it wasn't very helpful.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

陌伤浅笑 2024-12-02 04:45:36

问题可能出在文本视图的点击上。当您将列表视图项的视图设置为可单击时,它们会覆盖列表视图项的单击,并且仅当单击该项目的特定视图时单击才会起作用。

如果是这种情况,请在 getView() 函数中对两个文本视图执行以下操作:

TextView tv;
tv.setFocusable(false);
tv.setClickable(false);

然后将列表视图设置为可点击:listView1.setClickable(true);

The problem may be from the clicking of the textviews. When you set the views of the listview items as clickable, they override the click of the listview item and the click will only work when the specific view of the item is clicked.

If this is the case, do the following for your two textviews in the getView() function:

TextView tv;
tv.setFocusable(false);
tv.setClickable(false);

Then set the listview to clickable: listView1.setClickable(true);

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文