だから私はランダムなテキストを表示するリストビューを持っています。textviewは通常のテキストの場合もありますが、URLなどの場合もあります。BaseAdapterのコードに次の行を追加しました。
Linkify.addLinks(mHolder.content, Linkify.WEB_URLS);
mHolderがlistViewを高速化するためのViewHolderのインスタンスである場合、コンテンツはそのviewHolder内のTextViewであり、私はWebURLのみを強調表示します。
最初の問題、
そのコード行を追加してから、「asdfg」のような通常のテキストしかないアイテムの一部は、クリックしても強調表示されなくなりました。明確にするために、「強調表示」とは、onClickイベントを処理するために提供されたコードがあるかどうかに関係なく、listViewアイテムがクリックされたときに発生する通常の強調表示のみを意味します。
ここでの問題はそのコード行であることがわかっています。これを削除すると、listView上のすべてのアイテムがクリックされたときに強調表示されるためです。このスクリーンショットでこれを説明しようとしました
2番目の問題、
ActionModeを処理するために、MultiChoiceModeListenerをlistViewに追加しました。ただし、textViews内のリンクはクリック可能になり、ブラウザーが起動するため、ActionMode内のコードに従う代わりに、ActionMode内にあることを気にせずにブラウザーを起動するため、ActionMode内のリンクは正しく機能しなくなります。onItemCheckedStateChangedメソッド。
たとえば、ActionModeの場合、ユーザーがクリックしたすべてのアイテムは、後でonActionItemClickedを介して使用されるitemsCheckedという名前のArrayListに追加されます。ただし、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);
}