10

画面全体を占める がありますが、ウィジェットListViewを完全に覆うのに十分なアイテムがない場合があります。ListView実際にはアイテムが含まれていない最後のアイテムの下の空のスペースのクリックに応答できるようにしたいと思います (つまりsetOnItemClickListener、適切ではありません)。

setOnClickListener親ビューで(それ自体を無効にして)試しましListViewたが、クリックが到達していないようです。も試しsetOnTouchListenerてみましたListViewが、何らかの理由で一部の項目のクリックが登録されませんでした。これを達成する方法についてのアイデアはありますか?

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

}

次に、通常の ListView の代わりに XML ファイルでこの CustomListView を使用し、アクティビティ/フラグメント内に OnNoItemClickListener を実装して、mListView.setOnNoItemClickListener(this); を呼び出します。onCreate で onNoItemClicked() 関数へのコールバックを有効にします。

ListView にヘッダーまたはフッターがある場合、これらはリスト要素と見なされ、 onNoItemClicked() は呼び出されないことに注意してください。

于 2015-01-28T10:54:24.257 に答える
0

達成する可能性のある方法の 1 つは、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

リストビューに適切な高さを設定して、リストビューの下に空の線形レイアウトを配置します。その線形レイアウトに onClick() メソッドを配置します。それはそれをしなければなりません。

于 2014-08-26T08:16:41.100 に答える