2013-08-30 14 views
9

Tüm ekranı kaplayan bir ListView var, ancak bazen ListView widget'ini tamamen kapsayacak şekilde yeterli sayıda parçanız yok. Bir öğeyi içermeyen son öğenin altındaki boş alana yapılan tıklamaları yanıtlayabilmek isterim (setOnItemClickListener uygun değil demektir).Liste öğelerinin dışında gerçekleşen bir liste görünümündeki tıklama etkinliklerini nasıl dinlersiniz?

Ebeveyn görünümünde setOnClickListener (ki bunlar ListView ürününü kendileri için devre dışı bırakmışlardır) denedim, ancak tıklamalar ulaşamaya çalışmıyor. Ayrıca, ListView numaralı telefondan setOnTouchListener'u denedim, ancak bu, bazı öğeler için tıklamaların bazı nedenlerden dolayı kaydolmamasına neden oldu. Bunu nasıl başaracağınıza dair bir fikrin var mı?

+3

FWIW için iyi çalışan bu geldi, sana bir yaptıkça kısıtlama kaldırdı ') (' setOnClickListener almak için bir sorun açtı Mükemmel nokta: http://code.google.com/p/android/issues/detail?id=59559 – CommonsWare

cevap

0

Elde etmek için potansiyel bir yol, ListView öğenizi height="wrap_content" olarak ayarlıyor. Bunu yaparsanız, kullanıcının boş alana dokunması durumunda olayları almak için etkinliğiniz için onTouchEvent() geçersiz kılabilirsiniz.

Layout.xml

<ListView 
    android:id="@+id/list" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:entries="@array/list" /> 

Activity.java

public class MainActivity extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     ListView mList = (ListView)findViewById(R.id.list); 
     mList.setOnItemClickListener(new OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View v, int pos,long id) { 
       Toast.makeText(v.getContext(), ""+pos, Toast.LENGTH_SHORT).show(); 
      } 
     }); 
    } 
    @Override 
    public boolean onTouchEvent(MotionEvent me){ 
     if(me.getAction() == MotionEvent.ACTION_DOWN){ 
      Toast.makeText(this, "Empty space", Toast.LENGTH_SHORT).show(); 
      return true; 
     } 
     return false; 
    } 
} 

Eğer bir nedenden dolayı ListView yüksekliği olmanın match_parent güveniyor Ancak eğer (yani arka plan çizilebilir) daha sonra bu kazandı İdeal bir çözüm değil. https://github.com/mmokrzycki/listview-with-clickable-empty-view

+0

Bunu denediniz mi, yoksa ListView wrap_content ile iyi etkileşime girer mi? Bu sadece benim sezgimi iyi işlenmeyecek bir şey olarak vurgular: Tüm ListView'ın çocuklarını ölçmeye çalışmaz mı? – Foxichu

+0

Denedim. Emülatörde koştu ve iyi çalışıyor gibiydi. – FoamyGuy

0

nasıl yaptığımı örnektir. Bu doğrusal düzende bir onClick() yöntemi yerleştirin. Bunu yapmalı.

+0

Bunu TextWatchers ile EditTexts içeren satırları içeren liste listem ile denedim. Boş alan tıklama etkinliklerini yakalayabiliyorum, ancak yazarken edittext yavaş oluyor – desidigitalnomad

0

yerleştirin liste görünümü için uygun bir yüksekliğe ayarlayarak liste görünümü altında boş LinearLayout: Burada

5

Boş alan tıklandığında genişletilmiş liste öğelerini kapatmak için gereken yere benzer bir sorunla karşılaştı. İşte bunu nasıl çözdüm.

public class CustomListView extends ListView { 

    private OnNoItemClickListener mOnNoItemClickListener; 

    public interface OnNoItemClickListener { 
    void onNoItemClicked(); 
    } 

    public CustomListView(Context context) { 
    super(context); 
 } 

    public CustomListView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    } 

    public CustomListView(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
    } 

    @Override 
    public boolean dispatchTouchEvent(MotionEvent ev) { 
    //check whether the touch hit any elements INCLUDING ListView footer 
    if(pointToPosition((int) (ev.getX() * ev.getXPrecision()), 
     (int) (ev.getY() * ev.getYPrecision())) == -1 && ev.getAction() == MotionEvent.ACTION_DOWN) { 
     if(mOnNoItemClickListener != null) { 
     mOnNoItemClickListener.onNoItemClicked(); 
     } 
    } 
    return super.dispatchTouchEvent(ev); 
    } 

    public void setOnNoItemClickListener(OnNoItemClickListener listener) { 
    mOnNoItemClickListener = listener; 
    } 

} 

Sonra bunları normal ListView XML dosyasında bu CustomListView kullanmak ve etkinlik/parçasının içine OnNoItemClickListener uygulamak ve mListView.setOnNoItemClickListener (bu) diyoruz; onNoItemClicked() işlevinin geri çağrılmasını etkinleştirmek için onCreate uygulamasında.

ListView'nuzun üstbilgileri veya altbilgileri varsa, bunların liste öğeleri olarak kabul edildiğini ve onNoItemClicked() öğesinin çağrılmayacağını unutmayın.

0

diğer bazı yanıtlar birleştiren, benim kullanım durumunda

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    ... setup list view and other view state 
    listView.setOnTouchListener(new View.OnTouchListener() { 
    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     if (event.getAction() == MotionEvent.ACTION_DOWN && 
      listView.pointToPosition((int) (event.getX() * event.getXPrecision()), (int) (event.getY() * event.getYPrecision())) == -1) { 
     collapseExpandedListItem(); 
     return true; 
     } 
     return false; 
    } 
    }); 
} 
İlgili konular