0

さまざまな「ハウツー」の例を文字どおり (またはそう思った) たどりましたが、カスタム ListAdapter を機能させることはまだできません。オブジェクトの配列(クラス「Notam」)への参照である文字列を含むリストビューのダイアログがあります。参照するオブジェクトの属性に応じて、各リスト項目の色を設定したい。

(私のコードを読む前に、中かっこを並べる必要があるか、ブロックがどこにあるかがわからないという癖があります。同じ行の最後に左中かっこを置くという規則が好きではありません。)

これはカスタム クラスのコードです (テストとして、各項目のテキストの色をマゼンタに設定しようとしています)。

private class GotoAdapter extends ArrayAdapter<String>
{
    private ArrayList<String> items;

    public GotoAdapter(Context context, int textViewResourceId, ArrayList<String> items)
    {
        super(context, textViewResourceId, items);
        this.items = items;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent)
    {
        View v = convertView;
        if (v == null)
        {
            LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            v = vi.inflate(R.layout.goto_row, null);
        }
        String s = items.get(position);
        if (s != null)
        {
            TextView tt = (TextView) v.findViewById(R.id.text1);
            if (tt != null)
            {
                String s1 = (String)tt.getText(); // this is always an empty string!
                tt.setTextColor(0xFF00FF); // this has no effect!
            }
        }
        return v;
    }
}

String s には、この派生クラスを使用すると、期待どおりにテキストが表示されますが (画面に表示されない場合を除く)、返される TextView のテキストは常に空の文字列であり、色を設定しても効果はありません。

これは、メイン ビューで [Goto] ボタンがクリックされたときにダイアログを表示するコードです。

mGotoButton.setOnClickListener(new View.OnClickListener()
{
    public void onClick(View v)
    {
        // The pre-loaded array gets round a problem which I read about somewhere else
        // (the ArrayList gets cleared again below)
        String[]    array = {"one", "two", "three"};
        ArrayList<String> lst = new ArrayList<String>();
        lst.addAll(Arrays.asList(array));

        // custom dialog
        final Dialog dialog = new Dialog(context);

        dialog.setContentView(R.layout.goto_dialog);
        dialog.setTitle("Choose Notam");

        // Create the list view and adapter
        final ListView list = (ListView) dialog.findViewById(R.id.goto_list);

        // If I replace this reference to my custom adapter...
        final GotoAdapter adapter = new GotoAdapter
                (mContext, R.layout.goto_row, lst);

        // ... with this normal one, everything works!
        // (but of course now I can't get access to the objects.)
//      final ArrayAdapter<String> adapter = new ArrayAdapter<String>
//              (mContext, R.layout.goto_row, lst);

        list.setAdapter(adapter);

        // Populate the adapter
        adapter.clear();        // first clear the silly preset strings

        // Notam is my object class.
        // Spine.mNotamsDisplayed is a public static NotamArray.
        // class NotamArray extends ArrayList<Notam>
        // Spine is my main activity where I keep my global (app-wide) stuff.

        for (Notam notam : Spine.mNotamsDisplayed)
        {
            // This gets the reference string from the Notam object.
            // This is what goes into the list.
            String s = notam.getReference();
            adapter.add(s);
        }

        // Sort into alphabetical order
        adapter.sort(new Comparator<String>()
        {
            public int compare(String arg0, String arg1)
            {
                return arg0.compareTo(arg1);
            }
        });

        list.setOnItemClickListener(new AdapterView.OnItemClickListener()
        {
            public void onItemClick(AdapterView<?> a, View v, int pos, long id)
            {
                String  s;
                int     i;

                s = (String)a.getItemAtPosition(pos);

                // This static function returns the index in Spine.mNotamsDisplayed
                // which is referenced by the reference string s.
                // I have to do this because I lost the one-for-one correlation of page
                // indexes with list view entries when I did the sort.
                i = NotamArray.findNotamIndexByReference(Spine.mNotamsDisplayed, s);
                if (i >= 0)
                {
                    // This is what the Goto button and dialog is all about: this
                    // just moves my main view's pager to the page that was selected.
                    mPager.setCurrentItem(i);
                }
                dialog.dismiss();
            }
        });

        dialog.show();
    }
});

これは、ダイアログの xml (goto_dialog.xml) です。

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

    <ListView 
        android:id="@+id/goto_list"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" />
</RelativeLayout>    

そして、これはリスト ビュー行の xml (goto_row.xml) です。

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/text1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textColor="#00FF00"
    android:gravity="center_vertical"
     android:textAppearance="?android:attr/textAppearanceMedium"
    android:padding="2dp" 
    android:textSize="20dp"
/>

(テキストの色を緑に設定したので、標準のリスト ビュー アダプターを使用した場合にこのビットが機能していることがわかりました。(確かに、すべてのエントリのテキストは緑でした。ただし、カスタム アダプターを使用した場合、テキストは表示されませんでした。そこにはありましたが、黒地に黒だと思います。)

私が犯した些細な間違いに違いないものを見つけることができる誰かがそこにいるに違いありません-お願いします!

4

2 に答える 2

2

私が読んだところによると、すべてのリスト項目のテキストの色を、配列にある色と一致するように設定したいようです。

参照するオブジェクトの属性に応じて、各リスト項目の色を設定したい。

ただし、初期配列は次のように設定されています

String[] array = {"one", "two", "three"};

そのため、配列に基づいてテキストの色を動的に設定するときに、後で問題が発生します。しかし、あなたは後でそれを変更するつもりだったと確信しています。

標準の配列アダプターを使用すると、配列内の項目がテキストとして表示されるだけです。その理由は次のとおりです。

標準のリストビューアダプターを使用した場合。(確かに、すべてのエントリのテキストは緑色でした。ただし、カスタム アダプタを使用した場合、テキストは表示されませんでした

カスタム アダプターが機能しているか (色が変化しているか) を確認するには、まず、goto_row.xml ファイルの TextView に次の 1 行を追加します。

android:text="Test String"

これで、「テスト文字列」がさまざまな色で表示され、

String s1 = (String)tt.getText();

上記の行は「テスト文字列」を取得します

于 2012-10-25T21:36:02.550 に答える
0

質問の最後でほのめかした些細なエラーを見つけました。カスタム アダプタでは次の行でした。

tt.setTextColor(0xFF00FF);

0xFF00FF は有効な色の値ではないようです。そのため、画面に何も表示されませんでした。それを次のように変更します。

tt.setTextColor(Color.rgb(255, 0, 255);

問題が修正され、デフォルトの緑色がマゼンタに変更さ、テキストを必要な値に設定できるようになりました。これで、個々の行の色を必要な色に設定できるようになりました。

正しい方向に向けてくれた@LukasKnuthと@tigerpenguinに感謝します。

于 2012-10-26T11:51:37.823 に答える