所以我有一个显示随机文本的列表视图。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);
}