2017-01-17 7 views
0

У меня есть ListView с помощью android.R.layout.simple_list_item_checked, что я хочу, чтобы установить как в onItemLongClick() слушателя и onItemClick() слушателя делать разные вещи. Как я могу сделать ТОЛЬКО длинный щелчок, чтобы проверить/снять флажок, а не (короткий) щелчок? Спасибоандроид ListView с использованием simple_list_item_checked onItemLongClick не проверяя, как и ожидалось

Я пробовал иметь длинный щелчок return false, поэтому он не потребляет событие, но длинные клики не будут проверять/снимать. Только короткий щелчок будет. Я также попытался искусственно отменить проверку в коротком клике (прокомментированный код), но это не ведет себя так, как предполагалось.

Если я удаляю обратный вызов с коротким щелчком, длинный клик по-прежнему не будет проверять/снимать. Кроме того, короткие клики будут продолжать проверять/снимать.

EDIT - позвольте мне представить код в целом:

package com.example.checked; 

import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.AdapterView; 
import android.widget.ArrayAdapter; 
import android.widget.CheckedTextView; 
import android.widget.ListView; 

import java.util.ArrayList; 

public class MainActivity extends AppCompatActivity { 

    ListView myListView; 
    ArrayList<String> myData = new ArrayList<String>(); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     myListView = (ListView) findViewById(R.id.myListView); 

     // test data 
     myData = new ArrayList<String>(); 
     myData.add("apple"); 
     myData.add("banana"); 
     myData.add("cherry"); 
     myData.add("durian"); 
     myData.add("eggplant"); 

     ArrayAdapter myAdapter = new ArrayAdapter(this, android.R.layout.simple_list_item_checked, myData) { 
      @Override 
      public View getView(int position, View convertView, ViewGroup parent) { 
       View view = super.getView(position, convertView, parent); 
       CheckedTextView ctv = (CheckedTextView) view.findViewById(android.R.id.text1); 
       ctv.setFocusable(false); 
       ctv.setText(myData.get(position)); 
       ((ListView)parent).setItemChecked(position, false); 
       return view; 
      } 
     }; 

     myListView.setAdapter(myAdapter); 
     myListView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); 

     myListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { 
      @Override 
      public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { 
       CheckedTextView ctv = (CheckedTextView) view; 
       Log.i("onItemLongClick", "position=" + position + ", id=" + id + ", isChecked=" + ctv.isChecked()); 
       // do something 
       return false; 
      } 
     }); 

     myListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
       CheckedTextView ctv = (CheckedTextView) view; 
       Log.i("onItemClick", "position=" + position + ", id=" + id + ", isChecked=" + ctv.isChecked()); 
       //if (ctv.isChecked()) ctv.setChecked(false); 
       //else if (!ctv.isChecked()) ctv.setChecked(true); 
       // do something else 
      } 
     }); 
    } 
} 

И в XML:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/activity_main" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    tools:context="com.example.checked.MainActivity"> 

    <LinearLayout 
     android:orientation="horizontal" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:gravity="center" 
     android:weightSum="100"> 

     <ListView 
      android:layout_width="0dp" 
      android:layout_height="match_parent" 
      android:layout_alignParentTop="true" 
      android:layout_weight="80" 
      android:id="@+id/myListView" /> 

    </LinearLayout> 

</RelativeLayout> 

Выход журнала делать следующее:

  • долго нажмите на "яблоне"
  • Длинное нажатие на «яблоко» снова
  • короткий нажмите на «банане»
  • короткий нажмите на кнопку «банан» снова

01-17 10:23:45.628 14928-14928/com.example.checked I/onItemLongClick: position=0, id=0, isChecked=false 01-17 10:23:46.242 14928-14928/com.example.checked I/onItemClick: position=0, id=0, isChecked=true 01-17 10:23:50.655 14928-14928/com.example.checked I/onItemLongClick: position=0, id=0, isChecked=true 01-17 10:23:51.002 14928-14928/com.example.checked I/onItemClick: position=0, id=0, isChecked=false 01-17 10:23:53.756 14928-14928/com.example.checked I/onItemClick: position=1, id=1, isChecked=true 01-17 10:23:55.131 14928-14928/com.example.checked I/onItemClick: position=1, id=1, isChecked=false

Что Вышесказанное означает, что onItemLongClick() не проверяет/сняв флажок, и только onItemLick() есть, что в точности противоположно тому, что я хочу.

Edit # 2 - Я попытался изменить ListView XML следующему, сохраняя при этом Java-код без изменений:

<ListView 
android:layout_width="0dp" 
android:layout_height="match_parent" 
android:layout_alignParentTop="true" 
android:layout_weight="80" 
android:longClickable="true" 
android:clickable="false" 
android:id="@+id/myListView" /> 

Но короткий щелчок по-прежнему вступает в силу дает следующий лог:

01-17 10:38:18.703 25598-25598/com.example.checked I/onItemLongClick: position=0, id=0, isChecked=false 01-17 10:38:18.973 25598-25598/com.example.checked I/onItemClick: position=0, id=0, isChecked=true 01-17 10:38:22.212 25598-25598/com.example.checked I/onItemLongClick: position=0, id=0, isChecked=true 01-17 10:38:22.353 25598-25598/com.example.checked I/onItemClick: position=0, id=0, isChecked=false 01-17 10:38:28.951 25598-25598/com.example.checked I/onItemClick: position=1, id=1, isChecked=true 01-17 10:38:30.391 25598-25598/com.example.checked I/onItemClick: position=1, id=1, isChecked=false

EDIT # 3 - теперь, если я сделаю onItemLongClick() возвращение true вместо false, длинные клики все равно не будет проверять/снимите флажок, но короткие щелчки продолжают проверять/снимите флажок, давая следующий журнал:

01-17 10:43:45.181 28980-28980/com.example.checked I/onItemLongClick: position=0, id=0, isChecked=false 01-17 10:43:49.386 28980-28980/com.example.checked I/onItemLongClick: position=0, id=0, isChecked=false 01-17 10:43:53.662 28980-28980/com.example.checked I/onItemClick: position=1, id=1, isChecked=true 01-17 10:43:55.211 28980-28980/com.example.checked I/onItemClick: position=1, id=1, isChecked=false

+0

просто поставить логику onItemClick внутри onItemLongClick и удалить все внутри onItemClick и он будет работать – dex

+0

Check о 'listView.setMultiChoiceModeListener' https://developer.android.com/reference/android/widget/AbsListView.MultiChoiceModeListener.html, или вы можете поместить изображение в элемент и показать/скрыть на длинный щелчок при сохранении/удалении отмеченных непроверенных значений в массиве. –

ответ

0

Добавить android:longClickable="true" в свой listview.

+0

thx, но по умолчанию это уже установлено значение true – rockhammer