10

我有一个ListView占据整个屏幕的屏幕,但有时它没有足够的项目来完全覆盖ListView小部件。我希望能够响应点击最后一个实际上不包含项目的空白区域(意思setOnItemClickListener不合适)。

我已经在父视图上尝试过setOnClickListener(他们自己禁用了ListView),但点击似乎没有到达它。我也试过setOnTouchListenerListView,但这导致一些项目点击由于某种原因没有注册。关于如何做到这一点的任何想法?

4

5 回答 5

6

遇到类似的问题,我需要在单击空白区域时关闭展开的列表元素。这是我解决它的方法。

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()。

于 2015-01-28T10:54:24.257 回答
0

一种可能的实现方法是将您的 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,那么这将不是一个理想的解决方案。

于 2013-08-30T01:13:07.340 回答
0

这是我如何做到的示例:https ://github.com/mmokrzycki/listview-with-clickable-empty-view

于 2014-05-19T08:08:23.827 回答
0

通过为列表视图设置适当的高度,在列表视图下方放置一个空的线性布局。将 onClick() 方法放置到该线性布局。那必须这样做。

于 2014-08-26T08:16:41.100 回答
0

结合其他一些答案,我想出了这个适用于我的用例

@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;
    }
  });
}
于 2017-01-18T23:05:08.337 回答