10
votes

Comment pouvez-vous écouter Cliquez sur Events sur une liste de liste qui se produisent en dehors des éléments de la liste?

J'ai un ListView qui prend tout l'écran, mais parfois, il ne dispose pas de suffisamment d'articles pour couvrir complètement le widget listview . J'aimerais pouvoir répondre à des clics sur cet espace vide sous le dernier élément qui ne contient pas réellement d'élément (signification SetonitemClickListener n'est pas approprié).

J'ai essayé SetonClickListener (qu'ils désactivent pour le listview ) sur une vue parent, mais des clics ne semblent pas l'atteindre. J'ai également essayé setontouchlistener sur le listview , mais cela a provoqué un élément de certains éléments pour ne pas vous inscrire pour une raison quelconque. Des idées sur la façon d'accomplir cela?


1 commentaires

FWIW, j'ai déposé un problème pour obtenir le SetonClickListener () restriction levé, car vous faites un excellent point: code.google.com/p/andrroid/issues/detetail?id=59559


5 Réponses :


0
votes

Un moyen potentiel d'atteindre est-il défini votre liste de réalisation sur hauteur = "wrap_content" si vous le faites, vous pouvez avoir une substitution aouetchevent () pour votre activité pour obtenir Les événements de lorsque l'utilisateur touche l'espace vide.

layout.xml xxx

Activité.java < / p> xxx

Toutefois, si vous comptez sur votre hauteur de listeView étant Match_Parent pour une raison quelconque (c.-à-d. Fond Diable), cela ne sera pas une solution idéale.


1 commentaires

Avez-vous essayé ceci ou connaissez-vous la main si ListView interagit bien avec WraP_Content? Cela frappe juste mon intuition comme quelque chose qui ne serait pas bien géré: ne tentera-t-il pas de mesurer tous les enfants de la liste de liste?



0
votes

1 commentaires

J'ai essayé cela avec mon ListView qui contient des lignes ayant des editexts avec Textwatchers. Je suis capable d'attraper des événements d'espace vide, mais l'editext devient lent tout en tapant



0
votes

Placez un linearlayout vide ci-dessous dans la liste de la liste en définissant une hauteur appropriée à la liste de liste. Placez une méthode OnClick () à cette disposition linéaire. Cela doit le faire.


0 commentaires

6
votes

a couru dans un problème similiaire où je devais fermer des éléments de liste étendus lorsque l'espace vide est cliqué. Voici comment je l'ai résolu.

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;
  }

}


0 commentaires

0
votes

Combinant certaines des autres réponses, j'ai monté cela qui fonctionne bien pour mon cas d'utilisation

@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;
    }
  });
}


0 commentaires