web-dev-qa-db-ja.com

ListViewアイテムがクリックされた後、「押された」ままになるように強制しますか?

OnItemClickリスナーを介してアイテム行がクリックされたときに別のアクティビティを開くListViewがあります。

その行がクリックされてから画面が新しいアクティビティに切り替わるまで、その行を押したままにしておく必要があります。これはユーザーにとってより明確なエクスペリエンスになると思います。ダイアログを開いたり閉じたり、アクティビティを切り替えたりするほとんどのボタンで、このようなことがわかります。

OnItemClick()リスナーでview.setPressed(true)を設定しようとしましたが、わずかにちらつくため、プレス状態が通常に戻った直後に呼び出されるようです。

例えば:

mListView.setOnItemClickListener(new OnItemClickListener() {

   @Override
   public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
       view.setPressed(true);
       //start an activity
   }
});

そのコードはちらつきを除いてほとんど機能します(ユーザーがリストアイテムを押して押した状態になり、次にユーザーが離して(クリックを完了する)、一瞬通常の状態に戻ってから押した状態に戻りますsetPressed(true)呼び出しから)

何か案は?

ありがとう

編集:私はxmlドローアブルセレクターを使用して、リストの背景の通常の状態、押された状態、選択された状態などを定義していることに言及する必要があります。

21
cottonBallPaws

私は多くの欲求不満にまったく同じ問題を抱えていました!

ただし、_state_pressed_を_state_selected_に置き換えることで簡単に解決できます。押された状態は、onItemClick()が呼び出される前に急速に変化しますが、テーマは_state_pressed_に依存しないため、ちらつきは表示されません。 onItemClick()に入ったら、_state_selected_を設定すると、ちらつきが発生することなくアイテムが選択されたままになります。

これが私のセレクターです:

_<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <!-- Selected Item -->
    <item Android:state_selected="true"
        Android:drawable="@color/list_pressed" />

    <!-- Default Item -->
    <item Android:state_selected="false"
        Android:drawable="@Android:color/list_default" />
</selector>
_

そして私のonListItemClick(...):

_@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
    super.onListItemClick(l, v, position, id);
    v.setSelected(true);
    //TODO: add further actions here
}
_
26

Android 3.0より前にこれを行う最善の方法は、カスタムビューでカスタム状態を使用するか、アダプターからビューの背景色を変更することです。 Android 3.0以降、新しいstate_activatedを使用して、リストアイテムを選択したままにすることができます。

6
Romain Guy

アダプタの内部から、状態を変更するビューを参照できます。タイトルとスター(つまり、お気に入りのスター)が付いたListViewがあり、タッチしたときに「選択/押された」ままにしておきたいとします。 getViewをオーバーライドして、次のようにします。

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    final View view = super.getView(position, convertView, parent);
    final ImageButton favorite = (ImageButton) view.findViewById(R.id.favorite);
    favorite.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            Log.d(TAG, "Star pressed...");
            v.setSelected(!v.isSelected());
        }
    });
    return view;
}

また、ImageButtonレイアウトは、次のようなドローアブルを参照する必要があります。

<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item Android:state_selected="true" Android:drawable="@Android:drawable/star_big_on" />
    <item Android:state_pressed="true" Android:drawable="@Android:drawable/star_big_on" />
    <item Android:drawable="@Android:drawable/star_big_off" />
</selector>
3
slott

セレクターにxmlを使用しています。状態を正しく指定したかどうかを確認してください。
view.setPressed(true)を設定している間、状態Android:state_pressed="true"に設定されているドローアブルが使用されます。

<item Android:state_pressed="true"   
    Android:drawable="@color/gray" />
2

セレクターXMLは使用しないでください。代わりに、リストアイテムの画像を手動で変更してください。このようにして、特定の画像の長さを制御できるようになります

0

この例では、リストアイテムでボタンが押された後に背景が変更されます。 http://androidforbeginners.blogspot.com/2010/03/clicking-buttons-in-listview-row.html

この呼び出しに渡されたViewを操作することにより、onItemSelected()で同様のことを行うことができます。通常、渡されるビューは、textViewなどの子ビューを含むLinearLayoutです。

0
Lumis

nscheduleDrawabledrawableStateChanged と組み合わせて使用​​しようとしましたか?

したがって、状態が変化したかどうかを聞いて、すぐにスケジュールを解除して、プレス状態に戻すことができます。

多分もうちらつきはありません。

0
anon