首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ListView:当行有可点击的小部件时,如何显示项选择器?

ListView:当行有可点击的小部件时,如何显示项选择器?
EN

Stack Overflow用户
提问于 2012-07-12 11:08:05
回答 2查看 1.5K关注 0票数 2

虽然我确信这个问题已经解决了上千次,但我已经为这个问题挣扎了很长一段时间了。我看过很多其他类似的问题,但是我还没能解决。

核心问题是:

当列表项中有可单击的组件时,如果我长时间单击一行(用于显示上下文操作栏),则该行的选择器不会出现。长点击是触发的-只是没有任何视觉反馈,长点击正在发生。

请注意,只有当行布局包含可单击项时,才会看到此问题。下面是我已经尝试过的一些事情的快速清单:

  • 在'ListView‘上,我已经将drawSelectorOnTop设置为true (在getListView()getListView()中都尝试了这一点)
  • 在'ListView‘上,我已经将choiceMode设置为singleChoice (在getListView()getListView()中都尝试了这一点)
  • 在'ListView‘上,我已经将listSelector设置为各种值--透明的、白色的等等(在getListView()和XML中都尝试过这一点。
  • 当然,承载列表中各个行的LinearLayoutlongClickable设置为true。没有这个,长点击甚至没有注册。

无论我做什么,列表项目上的长按都不会显示任何类型的选择器,尽管长按确实发生了,并且我确实收到了OnItemLongClick回调。

有什么线索可以导致这件事吗?

再现问题的代码:

list_item.xml

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:baselineAligned="true"
android:longClickable="true"
android:orientation="horizontal" >

<TextView
    android:id="@+id/tvTitle"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Large Text"
    android:textAppearance="?android:attr/textAppearanceLarge" />

<Button
    android:id="@+id/btnGo"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="right"
    android:background="@android:drawable/btn_star_big_on" />

</LinearLayout>

activity_main.xml

代码语言:javascript
复制
<LinearLayout 
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/LinearLayout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<ListView
    android:id="@android:id/list"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:entries="@array/configurations" >
</ListView>

</LinearLayout>

MainActivity.java

代码语言:javascript
复制
public class MainActivity extends ListActivity {

private ListView mListView;
private Context mContext;
private RowAdapter mAdapter;
private static final String LOG_TAG = "ListViewLongClick";

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mContext = this;
    mListView = getListView();
    mListView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
    mListView.setSelector(android.R.color.white);
    mListView.setDrawSelectorOnTop(true);
    mAdapter = new RowAdapter(mContext, R.layout.list_item, R.id.tvTitle,
            getResources().getStringArray(R.array.configurations));
    mListView.setAdapter(mAdapter);
    mListView.setOnItemLongClickListener(new OnItemLongClickListener() {

        public boolean onItemLongClick(AdapterView<?> parent, View view,
                int position, long id) {

            Toast.makeText(mContext, "Long-click on item " + position,
                    Toast.LENGTH_SHORT).show();
            return true;
        }
    });
}

static class RowAdapter extends ArrayAdapter<String> {

    private int mResource;
    private String[] configs;

    public RowAdapter(Context context, int resource,
            int textViewResourceId, String[] objects) {
        super(context, resource, textViewResourceId, objects);
        this.mResource = resource;
        this.configs = objects;

    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View viewToReturn = convertView;
        if (convertView == null) {
            viewToReturn = LayoutInflater.from(getContext()).inflate(
                    this.mResource, null, false);
        }

        TextView label = (TextView) viewToReturn.findViewById(R.id.tvTitle);
        label.setText(configs[position]);
        Button btn = (Button) viewToReturn.findViewById(R.id.btnGo);
        btn.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {
                Log.d(LOG_TAG, "Aha! You clicked on the star button");
            }
        });
        return viewToReturn;
    }

}

}

strings.xml

代码语言:javascript
复制
<resources>

<string name="app_name">ListViewLongClick</string>
<string name="hello_world">Hello world!</string>
<string name="menu_settings">Settings</string>
<string name="title_activity_main">MainActivity</string>

 <string-array name="configurations">
    <item >Phone-Port</item>
    <item >Phone-Land</item>
    <item >Tab7-Port</item>
    <item >Tab7-Land</item>
    <item >Tab10-Port</item>
    <item >Tab10-Land</item>
</string-array>
</resources>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-12 11:29:50

您应该这样更改您的list_items:

代码语言:javascript
复制
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:baselineAligned="true"
              android:longClickable="true"
              android:orientation="horizontal"
              android:background="@android:drawable/list_selector_background"
        >

    <TextView
            android:id="@+id/tvTitle"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Large Text"
            android:textAppearance="?android:attr/textAppearanceLarge" />

    <Button
            android:id="@+id/btnGo"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="right"
            android:background="@android:drawable/btn_star_big_on" />

</LinearLayout>

我在您的LinearLayout中添加了android:background="@android:drawable/list_selector_background"

希望这对你有帮助

票数 4
EN

Stack Overflow用户

发布于 2012-07-12 11:19:09

在res/ ContextMenu文件夹中创建一个onCreateContextMenu,并重写onCreateContextMenu方法:

代码语言:javascript
复制
 @Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
    super.onCreateContextMenu(menu, v, menuInfo);
    MenuInflater inflater = getMenuInflater();
    menu.setHeaderTitle("Please select:");
    inflater.inflate(R.menu.context_menu, menu);
}

重写onContextItemSelected方法。并且不要忘记在onCreate方法中添加以下行:

代码语言:javascript
复制
registerForContextMenu(getListView());

有关更多信息,请参阅下面的链接

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11450521

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档