我有一个ListView
占据整个屏幕的屏幕,但有时它没有足够的项目来完全覆盖ListView
小部件。我希望能够响应点击最后一个实际上不包含项目的空白区域(意思setOnItemClickListener
不合适)。
我已经在父视图上尝试过setOnClickListener
(他们自己禁用了ListView
),但点击似乎没有到达它。我也试过setOnTouchListener
了ListView
,但这导致一些项目点击由于某种原因没有注册。关于如何做到这一点的任何想法?
我有一个ListView
占据整个屏幕的屏幕,但有时它没有足够的项目来完全覆盖ListView
小部件。我希望能够响应点击最后一个实际上不包含项目的空白区域(意思setOnItemClickListener
不合适)。
我已经在父视图上尝试过setOnClickListener
(他们自己禁用了ListView
),但点击似乎没有到达它。我也试过setOnTouchListener
了ListView
,但这导致一些项目点击由于某种原因没有注册。关于如何做到这一点的任何想法?
遇到类似的问题,我需要在单击空白区域时关闭展开的列表元素。这是我解决它的方法。
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;
}
}
然后在您的 XML 文件中使用此 CustomListView 而不是常规 ListView 并在您的活动/片段中实现 OnNoItemClickListener 并调用 mListView.setOnNoItemClickListener(this); 在 onCreate 中启用对 onNoItemClicked() 函数的回调。
请注意,如果您的 ListView 有页眉或页脚,则这些被视为列表元素,并且不会调用 onNoItemClicked()。
一种可能的实现方法是将您的 ListView 设置为height="wrap_content"
如果您这样做,那么您可以覆盖onTouchEvent()
您的活动以从用户触摸空白空间时获取事件。
布局.xml
<ListView
android:id="@+id/list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:entries="@array/list" />
活动.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;
}
}
但是,如果您出于某种原因(即背景可绘制)指望您的 ListView 高度为 match_parent,那么这将不是一个理想的解决方案。
通过为列表视图设置适当的高度,在列表视图下方放置一个空的线性布局。将 onClick() 方法放置到该线性布局。那必须这样做。
结合其他一些答案,我想出了这个适用于我的用例
@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;
}
});
}