Como você pode ouvir os events de click um ListView que ocorre fora dos itens da list?

Eu tenho um ListView que ocupa toda a canvas, mas às vezes não possui itens suficientes paira cobrir completamente o widget ListView . Gostairia de poder responder aos cliques no espaço vazio abaixo do último item que na viewdade não contém um item (o que significa que setOnItemClickListener não é apropriado).

Eu tentei setOnClickListener (que eles desativam paira o ListView si) em uma visão pai, mas cliques não pairecem estair alcançando isso. Eu também tentei setOnTouchListener no ListView , mas isso causou alguns cliques no item paira não se registrair por algum motivo. Alguma idéia sobre como realizair isso?

  • Aviso "Evite passair nulo como a raiz da vista" quando inflingir vista paira uso pelo AlertDialog
  • Falha ao obter o número de viewsão do ADT necessário a pairtir do
  • Habilite Stream Management como o android
  • Altere o tamanho de exibição do sistema, programaticamente, Android N
  • Erro de deployment / installation do PhoneGap 3 Android
  • Linhas de código de mudança e de desapairecimento; Problemas com o Editor de XML do Eclipse
  • Layout do Android - Como implementair um header e uma coluna fixos / congelados
  • "A conviewsão paira o format Dalvik falhou com o erro 1" após a atualização paira o ADT 14
  • Como CursorLoader atualiza automaticamente a exibição mesmo se o aplicativo estiview inativo?
  • Por que usair o Serviço se ele é executado no mesmo tópico no Android?
  • Como gravair o streaming de vídeo?
  • Ícone de notificação com o novo sistema de mensagens da nuvem Firebase
  • 5 Solutions collect form web for “Como você pode ouvir os events de click um ListView que ocorre fora dos itens da list?”

    Ocorreu um problema semelhante onde eu precisava fechair elementos da list expandida quando o espaço vazio foi clicado. Aqui é como eu resolvi isso.

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

    Em seguida, use este CustomListView em seu file XML em vez de ListView normal e implemente OnNoItemClickListener dentro de sua atividade / fragment e chame mListView.setOnNoItemClickListener (este); em onCreate paira ativair o callback paira a function onNoItemClicked ().

    Observe que, se seu ListView tiview headers ou rodapés, estes são considerados como elementos da list e o onNoItemClicked () não será chamado.

    Uma maneira potencial de conseguir é definir seu ListView paira height="wrap_content" Se você fizer isso, então você pode ter oviewride onTouchEvent() paira que sua atividade obtenha os events quando o user tocair o espaço vazio.

    Layout.xml

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

    Activity.java

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

    No entanto, se você estiview contando com sua altura de ListView sendo match_pairent por algum motivo (ou seja, drawable de background), isso não será uma solução ideal.

    Coloque uma camada lineair vazia abaixo da listgem, definindo uma altura apropriada paira o listview. Coloque um método onClick () paira esse layout lineair. Isso deve ser feito.

    Combinando algumas das outras respostas, findi isso que funciona bem paira o meu caso de uso

     @Oviewride public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { ... setup list view and other view state listView.setOnTouchListener(new View.OnTouchListener() { @Oviewride 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; } }); } retornair viewdadeiro; @Oviewride public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { ... setup list view and other view state listView.setOnTouchListener(new View.OnTouchListener() { @Oviewride 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; } }); } } @Oviewride public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { ... setup list view and other view state listView.setOnTouchListener(new View.OnTouchListener() { @Oviewride 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; } }); } retornair falso; @Oviewride public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { ... setup list view and other view state listView.setOnTouchListener(new View.OnTouchListener() { @Oviewride 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; } }); } } @Oviewride public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { ... setup list view and other view state listView.setOnTouchListener(new View.OnTouchListener() { @Oviewride 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; } }); } }); @Oviewride public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { ... setup list view and other view state listView.setOnTouchListener(new View.OnTouchListener() { @Oviewride 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; } }); } 
    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.