setOnItemClickListener () не работает на пользовательских ListView @ Android - PullRequest
19 голосов
/ 05 октября 2009

Я реализовал пользовательский ListView, расширив LinearLayout для каждой строки. В каждой строке есть небольшой эскиз, текст и check box. list view развернут правильно, и я могу без проблем прокручивать и пролистывать его.

Но ListView, похоже, совсем не отвечает на setOnItemClickListener(), поэтому мне пришлось искать обходной путь, установив прослушиватель щелчка в getView() текста внутри каждой строки, что, очевидно, создает проблему, Я пытаюсь повторно использовать adapter. У кого-нибудь есть решение?

Ответы [ 6 ]

44 голосов
/ 06 октября 2009

Попробуйте это
Для ListView:

final ListView list = (ListView) findViewById(R.id.list);
list.setItemsCanFocus(false);

Также убедитесь, что для CheckBox внутри элемента списка установлена ​​фокусировка false

android:focusable="false"
android:focusableInTouchMode="false"
11 голосов
/ 20 сентября 2012

старый ответ: Я писал в предыдущий пост здесь

android:focusable="false"
android:clickable="false"

не поможет, когда ImageButton находится в пользовательском представлении. Во время выполнения нужно использовать button.setFocusable(false); (из исходного кода Java)

Редактировать: Существует еще более элегантное решение. Попробуйте добавить android:descendantFocusability="blocksDescendants" в корневой макет элемента списка. Это сделает возможным клики по списку элементов и отдельно вы можете обрабатывать нажатия кнопок или ImageButton

6 голосов
/ 25 июня 2011

Для ListView, где вы устанавливаете представления элементов в CheckBox

android:focusable="false"
android:clickable="false"

http://code.google.com/p/android/issues/detail?id=3414

0 голосов
/ 22 марта 2016

Установить эти свойства:

 android:focusable="false"
 android:focusableInTouchMode="false"

для всех элементов пользовательского интерфейса в файле list_item.xml .

, если это не разрешено в вашем наборе адаптеров:

    v.imageView.setFocusable(false);
    v.imageView.setFocusableInTouchMode(false);
0 голосов
/ 16 ноября 2015

У меня есть этот код

this.mListView.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
                Log.v(TAG,"loul");
            }
        });

Но это не сработало

Так что я просто положил onItemSelectedListener под, и он работает Oo:

this.mListView.setItemsCanFocus(false);
this.mListView.setOnItemClickListener(new OnItemClickListener() {

    @Override
    public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) {
        Log.v(TAG,"loul");
    }
});
//listener for nothing but it allow OnItemClickListener to work
this.mListView.setOnItemSelectedListener(new OnItemSelectedListener() {

    @Override
    public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) {

    }

    @Override
    public void onNothingSelected(AdapterView<?> arg0) {

    }
});
0 голосов
/ 15 марта 2012

Вы сделали какой-нибудь ViewHolder в своем расширенном классе адаптеров? Если да, то сделайте экземпляр вашего заполнителя в setOnItemClickListener (), что-то может работать так:

@Override
    protected void onListItemClick(ListView l, View v, int position, long id) {        
        View rowView = v;
        if (rowView == null) {
            LayoutInflater inflater = this.getLayoutInflater();
                // GET INFLATE OF YOUR LAYOUT.
            rowView = inflater.inflate(R.layout.projectpeopledescrate, null);
             // CUSTOM ViewHolder Class Created in Adapter.
// name,title,comment are my components on the same listview clicked item.
            PPDViewHolder viewHolder = new PPDViewHolder();
            viewHolder.name     = (TextView) rowView.findViewById(R.id.ppeopledescrvname);
            viewHolder.title    = (TextView) rowView.findViewById(R.id.ppeopledescrvtime);
            viewHolder.comment  = (TextView) rowView.findViewById(R.id.ppeoplervcomment);
            viewHolder.hiddenLayout = (RelativeLayout) rowView.findViewById(R.id.hiddenCommentPanel); 
            rowView.setTag(viewHolder);
        }
          // ANOTHER object instance to apply new changes.
        PPDViewHolder holder = (PPDViewHolder) rowView.getTag();
// I've setted up visibility over the components. You can set your onClickListener over your buttons.
        holder.comment.setVisibility(View.GONE);
        holder.name.setVisibility(View.GONE);
        holder.title.setVisibility(View.GONE);
        holder.hiddenLayout.setVisibility(View.VISIBLE);
        holder.hiddenLayout.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.MATCH_PARENT));
        holder.hiddenLayout.bringToFront();

    }

Надеюсь, ты хочешь чего-то такого же. Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...