Я искал решение и не смог найти ничего, что указывало бы мне на решение.
Я использую ListView, где каждый элемент имеет TextView и HorizontalScrollView. HorizontalScrollView заполняется несколькими объектами TextView во время выполнения. Когда пользователь щелкает один из этих TextView, я переключаю фон в представлении, для которого я расширил класс TextView.
Проблема в том, что ListView onItemClick не срабатывает. Я немного поиграл с кодом, и по непонятной мне причине событие click иногда срабатывало, но только тогда, когда я щелкал прямо между каждым элементом списка. Я предполагаю, что это либо потому, что мой TextView обрабатывает событие щелчка, либо потому, что один из макетов предотвращает событие.
Изменить:
Я пытаюсь сделать следующее:
Когда TextView щелкнут, переключите на него какой-нибудь визуальный эффект.
добавить его значение (текст) в структуру данных.
Мой пользовательский TextView отлично обрабатывает событие щелчка, но я не могу захватить это событие щелчка в адаптере. Мне это нужно, потому что мне нужно знать позицию в ListView.
public class KeywordListAdapter extends ArrayAdapter<String> implements OnClickListener {
private final Context context;
private final String[] values;
private AspectManager aspectManager;
static class ViewHolder {
protected TextView aspectName;
protected HorizontalScrollView horizContainer;
protected LinearLayout keyWrapper;
protected KeywordTextView[] keyword;
}
public KeywordListAdapter(Context context, String[] values) {
super(context, R.layout.aspect_list_answer, values);
this.context = context;
this.values = values;
aspectManager = AspectManager.getInstance();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Aspect aspect = aspectManager.getAspectByName(values[position]);
View row = convertView;
// reuse views
if (row == null) {
Log.w(Constants.TAG, "row == null");
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
row = inflater.inflate(R.layout.aspect_list_answer, parent, false);
ViewHolder viewHolder = new ViewHolder();
viewHolder.horizContainer = (HorizontalScrollView) row.findViewById(R.id.horizontalRow);
viewHolder.horizContainer.setHorizontalScrollBarEnabled(false);
viewHolder.keyWrapper = new LinearLayout(context);
viewHolder.keyWrapper.setOrientation(LinearLayout.HORIZONTAL);
viewHolder.keyWrapper.setId(0);
viewHolder.keyword = new KeywordTextView[aspect.getKeywordCount()];
viewHolder.aspectName = (TextView) row.findViewById(R.id.lblAspect);
String[] keywords = aspect.getAspectKeys();
for (int i=0; i< keywords.length; i++){
viewHolder.keyword[i] = new KeywordTextView(context);
viewHolder.keyword[i].setOnClickListener(this);
viewHolder.keyWrapper.addView(viewHolder.keyword[i]);
}
viewHolder.horizContainer.addView(viewHolder.keyWrapper);
row.setTag(viewHolder);
}
//Set values
ViewHolder holder = (ViewHolder) row.getTag();
//Fill aspect name
holder.aspectName.setText(aspect.getAspectName());
holder.aspectName.setTextColor(Color.WHITE);
//Fill keywords
String[] keywords = aspect.getAspectKeys();
for (int i=0; i< keywords.length; i++){
holder.keyword[i].setKeyword(keywords[i]);
holder.keyword[i].setColor(baseColor);
//set keyword layout
LinearLayout.LayoutParams llp = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
llp.gravity = Gravity.CENTER_VERTICAL;
llp.setMargins(20, 15, 20, 20);
holder.keyword[i].setLayoutParams(llp);
}
return row;
}
@Override
public void onClick(View v) {
((KeywordTextView)v).toggle();
}
public class KeywordTextView extends TextView {
String keyword;
String color;
boolean selected;
private GradientDrawable gd;
public KeywordTextView(Context context) {
super(context);
gd = new GradientDrawable();
selected = false;
}
public void setKeyword(String keyword){
this.keyword = keyword;
setText(keyword);
}
public String getKeyword(){
return keyword;
}
public void setColor(String color){
this.color = color;
setText(keyword);
}
public boolean isKeywordSelected(){
return this.selected;
}
protected void onDraw (Canvas canvas) {
super.onDraw(canvas);
//Set style
...
}
protected void toggle(){
selected = !selected;
}
}
}
Соответствующая часть деятельности:
...
aspectList = (ListView)findViewById(R.id.lvAspectList);
aspectList.setAdapter(new KeywordListAdapter(this, aspects.split(", ")));
aspectList.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
Log.w(TAG, "aspectList onItemClick");
}
});
...