15

次のステート ドローアブルをリストビュー アイテムの背景として使用することはできません。

<item android:drawable="@drawable/ic_launcher" android:state_activated="true"/>

ハニカム以前のデバイスでは、このセレクターがサポートされておらず、Android バージョンではアクティブ化されたアイテムが追跡されないためです。

この動作をどのようにエミュレートできますか? 特にフラグメントを使用する場合 (1 つのフラグメントの左側にリストが表示され、選択内容に応じて右側に詳細ビューが表示される)、このインジケーターは非常に重要です。

この質問は以前ここで尋ねられたことを知っていますが、そこで受け入れられた回答は、「ステップ 4」で、インジケーターをアクティブにする可能性はなく、代わりにエラーを防ぐために使用を無効にするだけであると述べているブログ記事にリンクしています。これは、私が探しているインジケーターが表示されないという事実につながります。

4

4 に答える 4

28

私は小さなトリックを使用して問題を解決しましたstate_checked。Androidバージョン1以降に存在するプロパティを誤用することで、動作をエミュレートすることができstate_activatedます。リストアダプタを変更したり、状態を自分で保存したりする必要はありません。

再現に必要なすべてのコードを含む詳細な例を作成し、githubリポジトリに公開しました。

于 2012-12-13T15:49:26.400 に答える
3

Chris Jenkins が提案したように、getViewオーバーライドに小さなコードを追加するだけです。

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    // ...

    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) {
        convertView.setBackgroundColor(Color.WHITE);
        if (listView.isItemChecked(position)) {
            convertView.setBackgroundColor(Color.LTGRAY);
        }
    }
}

私の場合、チェックされているかどうかは自動的に処理されました(コールバックを呼び出すsetOnItemLongClickListenerでCHOICE_MODE_MULTIPLEおよびv7 ActionMode.Callbackを使用)

于 2013-11-22T15:24:56.943 に答える
0

以前に次の方法で手動で行ったことがあります。

リストの選択状態を保持する配列を作成し、アダプター コンストラクターでそれを初期化してから、getView メソッド (現在選択されている項目がスクロールして表示されなくなる場合) と onItemClick メソッド (現在の選択を変更して回転する場合) でそれを参照します。古いものから)。

public static boolean selectedStatus[];  // array to hold selected state
public static View oldView;        // view to hold so we can set background back to normal after 

コンストラクター は配列を初期化します

public class MyCursorAdapter extends SimpleCursorAdapter {
    private LayoutInflater mInflater;
    private int layout;

    public MyCursorAdapter(Context context, int layout, Cursor c,
        String[] from, int[] to, int flags) {
            super(context, layout, c, from, to, flags);
            mInflater = LayoutInflater.from(context);
            this.layout = layout;
            selectedStatus = new boolean[c.getCount()];
            for (int i = 0; i < c.getCount(); i++) {
            selectedStatus[i] = false;  // Start with all items unselected
        }
    }
} 

子がビューの外にスクロールするときに必要なgetView

@Override 
public View getView(int position, View convertView, ViewGroup parent) {
    if (convertView == null)
         convertView = View.inflate(context, layout, null);

    if(selectedStatus[position] == true){
        v.setBackgroundResource(R.color.blue);                          
    } else {
        v.setBackgroundResource(R.color.black);
    }
    return v; 
} 

onItemClick 配列内および画面上の選択項目を変更する

lv.setOnItemClickListener(new OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view,
        int position, long id) {           

        mRowId = id;
        EventDisplayFragment eventdisplay = new EventDisplayFragment();
        getFragmentManager().beginTransaction()
                .replace(R.id.rightpane, eventdisplay).commit();
        if(MyCursorAdapter.oldView != null){
            MyCursorAdapter.oldView.setBackgroundResource(R.color.black);   // change the background of the old selected item back to default black                 }
        MyCursorAdapter.oldView = v;                                        // set oldView to current view so we have a reference to change back on next selection
        for (int i = 0; i < selectedStatus.length; i++) {
            if(i == position){                              // set the current view to true and all others to false
                    selectedStatus[i] = true;
                } else {
                    selectedStatus[i] = false;
                }
            }
        }
        v.setBackgroundResource(R.color.blue);
        return true;
    }
});
于 2012-11-23T15:17:22.357 に答える
0

アダプターで選択したリスト項目の背景を「アクティブな」ドローアブルに変更するだけです。

したがって、私のアダプターの get view メソッドは次のようになります。

getView(int pos, View convertView, ViewGroup parent){
//... etc get view etc
    if(mSelectedItemPos == pos){
        v.setBackgroundDrawable(ctx.getResources().getDrawable(R.drawable.list_item_selected_state);
        //or v.setBackgroundResource(R.drawable.list_item.....);
    } else {
        v.setBackgroundDrawable(ctx.getResources().getDrawable(R.drawable.list_item_selector);            
    }
}

ビューで選択/アクティブ化された状態をサポートしたい場合は、これですべてです。少し作業が増えますが、必要に応じて柔軟に対応できます。

于 2012-11-23T14:48:52.397 に答える