У меня есть адаптер списка, который обрабатывает объекты с некоторыми изображениями и текстом, и я хочу:
- отображать контекстное меню, отображаемое при длительном щелчке по всему элементу списка
- начать какое-то действие при нажатии на изображение
- обрабатывать клики по ссылкам внутри TextView (сейчас просто отображается сообщение Toast)
Это моя текущая реализация адаптера:
public class StatusAdapter extends ArrayAdapter<BlipStatus> {
@Override
public View getView(final int pos, final View convertView, final ViewGroup parent) {
// snip...
final Status status = statuses.get(pos);
// snip...
final View s = v.findViewById(R.id.status);
if (!(s instanceof TextView)) throw new RuntimeException("Expected textView instance");
TextView stv = (TextView) s;
stv.setText(prepareStatusContent(status.getBody()));
stv.setLinksClickable(true);
stv.setMovementMethod(LinkMovementMethod.getInstance());
// snip...
final View a = v.findViewById(R.id.avatar);
if (!(a instanceof ImageView)) throw new RuntimeException("Expected imageView instance");
String p = status.getAvatarPath();
try {
((ImageView) a).setImageBitmap(AvatarUtils.getAvatarFromPath(p));
} catch (IOException e) {
Log.w(TAG, "Failed to fetch avatar from path : " + p);
}
a.setOnClickListener(new View.OnClickListener() {
public void onClick(final View view) {
final Context c = getContext();
final Intent i = new Intent(c, UserActivity.class);
i.putExtra(UserActivity.USER_NAME, status.getUser());
c.startActivity(i);
}
});
return v;
}
private CharSequence prepareStatusContent(String s) {
SpannableString ss = new SpannableString(s);
Pattern p = Pattern.compile(URL_PATTERN);
Matcher m = p.matcher(s);
while (m.find()) {
int start = m.start();
int end = m.end();
final String url = s.substring(start, end);
ss.setSpan(new ExternalUrlSpan(new View.OnClickListener() {
public void onClick(View view) {
Toast.makeText(getContext(), url, Toast.LENGTH_LONG);
}
}), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
return ss;
}
}
и класс ExternalUrlSpan:
public class ExternalUrlSpan extends ClickableSpan {
private final View.OnClickListener listener;
public ExternalUrlSpan(View.OnClickListener listener) {
super();
this.listener = listener;
}
@Override
public void onClick(View view) {
listener.onClick(view);
}
}
Дополнительно я звоню
registerForContextMenu()
метод с экземпляром ListView, использующий мой адаптер в качестве параметра в коде активности.
В результате у меня есть список, отображающий элементы с кликабельным изображением, которое запускает некоторые действия, как ожидалось, и контекстное меню, доступное после долгого нажатия на элемент. Но когда я пытаюсь щелкнуть ссылку в текстовом представлении элемента списка, она попадает, но все событие щелчка обрабатывается слушателем, связанным с контекстным меню, и.
Кто-нибудь знает, как заставить это работать вообще?