2

独自のカスタムテーマを作成しましたが、作業中のListViewなど、テーマが色付けされていないビットがいくつかあるので、それらを1つずつ実行しています。私はこれで宿題をし、描画可能な背景セレクターXMLファイルの作成について知っていますが、正しく機能していません。さらに、私はそれを強制するために他のいくつかの方法を試しましたが、それを機能させることができません。私はあなたに問題を示し、それから私のコードでそれに従います。

「押された」色が機能しています。このスクリーンショットでは、アイテムを押し続けています。

ListViewアイテムを押す

ただし、指を離すと、選択したアイテムが色付きのままになりません。チェックリスト1が選択されて表示されますが、強調表示されていないことに注意してください。

指を離し、ListViewアイテムが選択されていますが、色がありません

これは、各リストアイテムビューに適用する背景ドローアブルです。

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_selected="false" android:state_pressed="false"
    android:drawable="@android:color/transparent" />
<item android:state_pressed="true" android:drawable="@android:color/holo_orange_dark" />
<item android:state_selected="true" android:state_pressed="false"
    android:drawable="@android:color/holo_orange_light" />
</selector>

「selected」には「holo_orange_light」が表示されますが、表示されないことに注意してください。次のコードは、背景を割り当てる場所です。私は当初、既成のArrayAdapterをインスタンス化していました。この背景を適用するために、私はArrayAdapterから派生し、ビューを構築するメソッドにコードを追加しました。

カスタマイズされたArrayAdapterは次のとおりです。

private class CustomArrayAdapter extends ArrayAdapter<Checklist> {

    public CustomArrayAdapter(Context context, int resource, int textViewResourceId,
            List<Checklist> objects) {
        super(context, resource, textViewResourceId, objects);

    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        convertView = super.getView(position, convertView, parent);
        convertView.setBackgroundResource(R.drawable.listview_background);
        return convertView;
    }

}

FWIWこれはアダプターを作成する呼び出しであるため、使用したパラメーターを確認できます。

setListAdapter(new CustomArrayAdapter(getActivity(),
                android.R.layout.simple_list_item_activated_1, android.R.id.text1,
                KnowUrStuffApp.getDbHelper().getChecklists()));

そのため、そのコードは私を今のところに残しました。しかし、私はいくつかの冗長な方法でそれを強制的に着色しようとしました。ビューの背景をホロオレンジに明示的に色付けするsetSelectionHilightというルーチンを作成しました。次に、setSelectionHilightを呼び出すListViewに割り当てられたonItemSelectedListenerを作成しました。次に、すべてがロードされたら、ルーチンを明示的に呼び出します。これらのどれも効果がありませんでした:

private void setSelectionHilight(ListView listView, View selectedView) {
    for (int i = 0; i < listView.getChildCount(); i++) {
        View child = listView.getChildAt(i);
        if (child == selectedView)
            child.setBackgroundColor(getActivity().getResources().getColor(android.R.color.holo_orange_light));
        //else
            //child.setBackgroundResource(0);
    }
}


private OnItemSelectedListener onItemSelectedListener = new OnItemSelectedListener() {



    @Override
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
        setSelectionHilight((ListView) parent, view);

    }

    @Override
    public void onNothingSelected(AdapterView<?> parent) {
        setSelectionHilight((ListView) parent, null);

    }

};

繰り返しになりますが、私はちょうど上のチャンクで実験していました。私の問題の解決策を検討する際にそれを無視しても問題ありませんが、全体像としてそれを含めます。これを解決するための助けをありがとう。補助的な情報のもう1つは、ListViewがListFragmentにカプセル化されており、それに組み込まれているデフォルトのレイアウトを使用していることです。ListViewの明示的なXML要素がありません。

4

1 に答える 1

1

私は似たようなことをしたかったので、それを実装するための独自のロジックを開発しました。私のコードは、現在選択されているChildViewを強調表示するためのものであり、コードが表示されている場合は、ParentViewとChildViewの両方に実装できます。

    public int _groupPosition = -1;
    View _lastColored;
    private int _highlightedGroup = -1;
    private int _highlightedChild;



    public boolean onChildClick(ExpandableListView parent, View v,
            int groupPosition, int childPosition, long id) {

        _groupPosition = groupPosition;
        _highlightedGroup = groupPosition;
        _highlightedChild = childPosition;
        if (_lastColored != null) {
            _lastColored.setBackgroundColor(Color.TRANSPARENT);
        }
        _lastColored = v;
        v.setBackgroundColor(Color.rgb(214, 214, 214)); // whatever colour you want to set
             ..... // your code here
}

XMLファイルでセレクターを使用する必要はありません。このコードはそれをすべて行います。幸運を!

于 2012-09-01T17:26:45.147 に答える