Linkify,ListView& ActionMode。常规文字不再可点击

时间:2013-01-03 08:18:21

标签: android android-listview linkify actionmode

所以我有一个显示随机文本的列表视图。 textview有时可以是常规文本,但也可以是URL等。我在BaseAdapter的代码中添加了以下行:

Linkify.addLinks(mHolder.content, Linkify.WEB_URLS);

其中mHolder是ViewHolder的一个实例,用于加速listView,内容是该viewHolder中的TextView,我只愿意突出显示Web Urls。

第一个问题,

由于添加了该行代码,因此单击时,某些仅包含常规文本(如“asdfg”)的项目现在不再突出显示。只是为了澄清,当我的意思是“突出显示”时,我只是指单击listView项时发生的常规突出显示,无论是否提供代码来处理onClick事件。

我知道这里的问题是代码行,因为删除它会使listView上的所有项目在单击时突出显示。我试图通过这个screenshot

来描述这个

第二个问题,

我在listView中添加了一个 MultiChoiceModeListener 来处理ActionMode;但是,鉴于textViews中的链接现在可以单击并启动浏览器,它们在ActionMode中不再正常工作,因为它们并不关心我们是否在ActionMode中并仍然启动浏览器而不是跟随内部的代码 onItemCheckedStateChanged 方法。

例如,在ActionMode中,用户单击的每个项目都会添加到名为 itemsChecked 的ArrayList中,该列表稍后通过 onActionItemClicked 使用。但是,当使用linkify时,这不再可行,因为当用户单击具有Web Url作为文本的ListView项时,应用程序将在调用浏览器处理链接时发送到后台。

我的问题是我可以做些什么来在我的代码中解决这些问题?

我想要突出显示可点击的链接,但不是以此为代价。我应该使用除Linkify之外的其他内容来突出显示链接并使其可点击吗?或者“可点击性”总是会干扰ListView项的常规行为。

仅供参考,我为ActionMode和ListView运行的代码如下:(请记住,在不使用Linkify时代码正常工作

private MultiChoiceModeListener modeListener = new MultiChoiceModeListener() {

     @SuppressLint("NewApi")
    @Override
        public void onItemCheckedStateChanged(ActionMode mode, int position,
                                              long id, boolean checked) {   
            String text =  listItems.get(position);
            if (checked) {
                itemsChecked.add(text);
            }
            else {
                int index = itemsChecked.indexOf(text);
                itemsChecked.remove(index);
            }               
        }

        @SuppressLint("NewApi")
        @Override
        public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
            switch (item.getItemId()) {
                case 0:
                    mode.finish();
                    return true;
                case R.id.menu_merge:
                    mergeStrings();
                    mode.finish();
                    return true;                 
                case R.id.menu_star:
                    return false;                
                default:
                    return false;
            }
        }

        @SuppressLint("NewApi")
        @Override
        public boolean onCreateActionMode(ActionMode mode, Menu menu) {
            inActionMode = true;
            itemsChecked = new ArrayList<String>();
            MenuInflater inflater = mode.getMenuInflater();
            inflater.inflate(R.menu.context_menu, menu);
            return true;
        }

        @SuppressLint("NewApi")
        @Override
        public void onDestroyActionMode(ActionMode mode) {
            inActionMode = false;
        }

        @SuppressLint("NewApi")
        @Override
        public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
            return false;
        }
};

@SuppressLint("NewApi")
private void initViews () {

    listView = (ListView) findViewById(R.id.home_list_view);
    if (isOldAPI) {
        registerForContextMenu(listView);
    }
    else {
        listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
        listView.setMultiChoiceModeListener(modeListener);          
    }
    mAdapter = new MyAdapter(this, listItems, isOldAPI);                
    listView.setAdapter(mAdapter);
}

1 个答案:

答案 0 :(得分:0)

好吧,所以经过一段时间潜伏在阴影中寻找答案后,我终于得到了感谢AOSP MMS code.信用卡去了Rascarlo在github上发帖,虽然我想我也可以通过CM和其他项目。

所以,问题是我在我的适配器中使用了这行代码:

Linkify.addLinks(mHolder.content, Linkify.WEB_URLS);

当所有这些都可以更好地解决textview的XML时,通过使用预先构建的属性android:autoLink,必须将其设置为您喜欢的任何方案 - 在我的情况下是web;和android:linksClickable,如果您希望点击突出显示订单项,则必须设置为 FALSE 。设置为true也可以,通过longclick工作的上下文菜单,但它不会突出显示。请注意,通过将其设置为false,您必须通过代码处理此类链接的打开,而不是通过单击来处理。

以下是我的ListView项目的XML代码:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/RelativeLayout1"
android:layout_width="match_parent"
android:layout_height="wrap_content"    
android:orientation="horizontal" >

<TextView
    android:id="@+id/clip_list_text"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_alignParentTop="true"
    android:layout_margin="4dp"
    android:autoLink="web"
    android:linksClickable="false"
    android:textAppearance="?android:attr/textAppearanceMedium" />

希望能帮助那些无法理解的人。