0

カスタムリストビューでクリックされたアイテムを強調表示したい。さまざまなオプションを試しましたが、どれも機能していません。誰かが何が悪いのか教えてもらえますか?

私のカスタムリストビューcom.foo.ViewEditListView extends ListView implements android.widget.AdapterView.OnItemLongClickListener

list_layout.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_alignParentBottom="true"
    android:orientation="vertical"
     >

    <TextView
        android:id="@+id/textView_list_info"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:gravity="center_vertical|center_horizontal"
        >
    </TextView>

     <EditText
         android:id="@+id/searchQueryText"
         android:layout_width="fill_parent"
         android:layout_height="wrap_content"
         android:layout_gravity="left"
         android:drawableRight="@drawable/search"
         android:hint="Search Expenses by Amount"        
         android:textColorHint="#5e8e19"
         android:inputType="numberSigned|numberDecimal"
         style="@android:style/TextAppearance.Small"         
          >

        </EditText>

     <com.foo.ViewEditListView
        android:id="@+id/viewExpenseListView"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" 
        android:background="@/drawable/list_selector_bg" //doesn't work
         />

</LinearLayout>

list_row.xml 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:background="@/drawable/list_selector_bg" //doesn't work
    >

 <RelativeLayout
     android:layout_width="match_parent"
     android:layout_height="match_parent"

     >

  <TextView
        android:id="@+id/v_row_field1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" 
        android:textSize="14sp"
        android:textStyle="bold"
        android:textColor="#C11B17"
        android:layout_alignParentLeft="true"
        />


    <TextView
        android:id="@+id/v_row_field2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:textStyle="bold"
        android:layout_marginRight="2dp" />

  </RelativeLayout>  

</LinearLayout>



list_selector_bg.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >

<item android:state_pressed="true"
    android:drawable="@android:drawable/list_selector_background" />      


</selector>

Activity で setSelector も試みましたが、どれも機能していません。今のところ、私は無知です。誰かがここで私を助けることができますか?

Android:background="@/drawable/list_selector_bg" を RelativeLayout に入れると、その部分だけが強調表示されます。しかし、レイアウト全体を強調表示したい。

ありがとうCP

4

2 に答える 2

1

カスタム ドローアブルをレイアウトの背景として設定します。必要に応じて以下を変更します。押すと別の背景になり、離すとデフォルトの状態に戻ります。

list_row.xml で

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentBottom="true"
android:background="@drawable/listbkg" // set backcground
android:orientation="vertical"
 >
....
</LinearLayout>

drawable フォルダー内の listbkg.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" 
    android:drawable="@drawable/pressed" /> //pressed state
<item  android:state_focused="false" 
    android:drawable="@drawable/normal" /> // normal state
</selector>

ドローアブルフォドラーのpressed.xml

<?xml version="1.0" encoding="UTF-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android"> 
<solid android:color="#FF1A47"/>     //background color 
<stroke android:width="3dp"          // border color
        android:color="#0FECFF"/>
<padding android:left="5dp"
         android:top="5dp"
         android:right="5dp"
         android:bottom="5dp"/> 
<corners android:bottomRightRadius="7dp"  //for rounded corners    
         android:bottomLeftRadius="7dp" 
         android:topLeftRadius="7dp"
         android:topRightRadius="7dp"/> 
</shape> 

drawable フォルダー内の normal.xml

 <?xml version="1.0" encoding="UTF-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android"> 
<solid android:color="#FFFFFF"/>    //  change olor
<stroke android:width="3dp"   // for border color
        android:color="#0FECFF" />

<padding android:left="5dp"
         android:top="5dp"
         android:right="5dp"
         android:bottom="5dp"/> 
<corners android:bottomRightRadius="7dp"// for rounded corners
         android:bottomLeftRadius="7dp" 
         android:topLeftRadius="7dp"
         android:topRightRadius="7dp"/> 
</shape>

編集:

スナップショットで同じことがわかるように、グラデーションを含めることもできます。

カスタムアダプタの getView() 内

     convertView =mInflater.inflate(R.layout.list_row, parent,false);
     // inflating custom layout

次に、list_row.xml でルート レイアウトの背景を設定します。

結果のスナップショット

押すとレイアウトが強調表示され、離すと通常の状態に戻ります。

ここに画像の説明を入力

于 2013-04-21T14:33:55.043 に答える
0

1) 選択した項目を強調表示する場合は、CustomAdapter を使用して処理できます。しかし、それはあまり良い方法ではありません:)

2) 最善の方法は、ビューに Checkable インターフェイスの一般的な Android 実装を使用することだと思います (例として):

public class CheckableFrameLayout extends FrameLayout implements Checkable {
    private boolean mChecked;

    public CheckableFrameLayout(Context context) {
        super(context);
    }

    public CheckableFrameLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public void setChecked(boolean checked) {
        mChecked = checked;
        setBackgroundDrawable(checked ? new ColorDrawable(0xff0000a0) : null);
    }

    public boolean isChecked() {
        return mChecked;
    }

    public void toggle() {
        setChecked(!mChecked);
    }
}

また

3) CheckedTextViewを使用する

ApiDemos (ListView with multichoice) という名前のAndroid サンプルで例を見つけることができます。

更新: ChoiceMode != ListView.CHOICE_MODE_NONEListViewが必要 であることを忘れないでください

パッケージに入れて、次のようCheckableFrameLayoutに書き換えます。list_row.xml

<com.foo.CheckableFrameLayout  xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/list_selector_bg"
    >

 <RelativeLayout
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     >

  <TextView
        android:id="@+id/v_row_field1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" 
        android:textSize="14sp"
        android:textStyle="bold"
        android:textColor="#C11B17"
        android:layout_alignParentLeft="true"
        />


    <TextView
        android:id="@+id/v_row_field2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:textStyle="bold"
        android:layout_marginRight="2dp" />

  </RelativeLayout>  
</com.foo.CheckableFrameLayout>

from statelistの状態を取得するCheckableFrameLayout(バックグラウンドに設定する) 場合は、次のようにオーバーライドする必要がありますlist_selector_bg.xml

<selector xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:state_checked="true" android:drawable="@android:drawable/list_selector_background" />
</selector>

そして、それを操作するために書き直しCheckableFrameLayoutます。私は急いでそれを正しく行っていません(2回目のタップ後にのみハイライトが正しく変更される理由がわかりません)。ただし、このコードを使用して改善することはできます ( CheckedTextViewのコードを使用すると役立つ場合があります)。

public class CheckableFrameLayout extends FrameLayout implements Checkable {
    private static final int[] CHECKED_STATE_SET = {
        android.R.attr.state_checked
    };

    private boolean mChecked;

    public CheckableFrameLayout(Context context) {
        super(context);
    }

    public CheckableFrameLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected int[] onCreateDrawableState(int extraSpace) {
        final int[] drawableState = super.onCreateDrawableState(extraSpace + 1);
        if (isChecked()) {
            mergeDrawableStates(drawableState, CHECKED_STATE_SET);
        }
        return drawableState;
    }

    @Override
    public void setChecked(boolean checked) {
        mChecked = checked;
        // setBackgroundDrawable(checked ? new ColorDrawable(0xff0000a0) : null);
    }

    @Override
    public boolean isChecked() {
        return mChecked;
    }

    @Override
    public void toggle() {
        setChecked(!mChecked);
    }
}
于 2013-04-21T15:24:58.403 に答える