所以我有一个显示随机文本的列表视图。 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);
}
答案 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" />
希望能帮助那些无法理解的人。