4

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

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

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

第一个问题,

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

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

第二个问题,

我在 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);
}
4

1 回答 1

0

好的,所以在潜伏了一段时间后,我终于得到了答案,这要归功于AOSP MMS 代码。感谢 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" />

希望对想不通的人有所帮助。

于 2013-01-25T21:54:03.130 回答