ListView onItemClick не работает с пользовательским адаптером

Я искал решение и не смог найти ничего, что указывало бы мне на решение.

Я использую ListView, где каждый элемент имеет TextView и HorizontalScrollView. HorizontalScrollView заполняется несколькими объектами TextView во время выполнения. Когда пользователь щелкает один из этих TextView, я переключаю фон в представлении, для которого я расширил класс TextView.

Проблема в том, что ListView onItemClick не срабатывает. Я немного поиграл с кодом, и по непонятной мне причине событие click иногда срабатывало, но только тогда, когда я щелкал прямо между каждым элементом списка. Я предполагаю, что это либо потому, что мой TextView обрабатывает событие щелчка, либо потому, что один из макетов предотвращает событие.

Изменить:

Я пытаюсь сделать следующее:

  1. Когда TextView щелкнут, переключите на него какой-нибудь визуальный эффект.

  2. добавить его значение (текст) в структуру данных.

Мой пользовательский 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");
        }
});
...

person user3339411    schedule 10.10.2014    source источник
comment
Я думаю, что это работает, потому что ваши элементы списка имеют прослушиватель onClick, который перетаскивает фокус. Хотя может ошибся.   -  person zgc7009    schedule 10.10.2014
comment
покажите код aspect_list_answer.xml   -  person Qadir Hussain    schedule 10.10.2014


Ответы (1)


Проблема, с которой вы столкнулись, заключается в том, что вы установили OnClickListener для представлений внутри списка, что здесь происходит, так это то, что это переопределяет OnClickListener по умолчанию для списков. Лучше всего было бы использовать это.

row.setOnClickListener(new OnClickListener(){

      @Override
      public void onClick(View v) {
         //Enter Your Code Here
      }

  });
person Rhynoboy2009    schedule 10.10.2014
comment
Это не сработало бы, если бы был щелчок по дочернему элементу TextView. Смотрите мою правку. - person user3339411; 11.10.2014
comment
Хм, если я правильно понимаю, вы пытаетесь получить текст TextView, который вы только что щелкнули по списку, и что-то с ним сделать? Если бы вы могли уточнить, я надеюсь, что могу помочь вам. - person Rhynoboy2009; 11.10.2014
comment
Идея состоит в том, что пользователь выбирает ключевые слова из каждой темы (тема = строка/горизонтальный вид). Для каждого выбора мне нужно выполнить эффект выбора и добавить ключевое слово в список ключевых слов, который позже будет отправлен на сервер. Поэтому мне нужно знать ключевое слово (TextView) и строку, по которой щелкнули. - person user3339411; 11.10.2014