0

それぞれ異なる色の電車の路線のリストを表すListViewを作成しようとしています。だから今私はこれを持っています:

public class TrainOverview extends ListActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this,
            R.layout.list_item, R.id.label, TrainLines.lines);
        this.setListAdapter(arrayAdapter);
    }
}

XMLは、線形レイアウトの2つのテキストラベルで構成されており、そのlist_itemうちの1つは動的に色を変更できるようにしたいと考えています。TrainLines.lines現時点ではですが、属性String[]を持つ非常に単純なクラスにしたいと思います。次に、電車の路線名と適切な色を表示するListViewを作成できるようにしたいと思います。namecolour

これを達成するための最良の方法は何ですか?私の質問が理にかなっていることを願っています!

4

2 に答える 2

3

BaseAdapter を拡張することをお勧めします。これは比較的簡単に実行でき、さまざまなビュー/行レイアウト (TextView の色の変更を含む) に関しては非常に便利です。

メソッドgetViewTypeCount()とメソッドをgetItemViewType(position)簡単にオーバーライドして、好きなだけさまざまな行レイアウトを作成できます。

これはあなたの目標ではないかもしれませんが、知っておくと便利です。

BaseAdapterただし、メソッドをオーバーライドするカスタムが必要になると思いますgetView(int position, View convertView, ViewGroup parent)

TextViewこれにより、上記のように各行にアクセスできます。これを行う良い方法は、ViewHolder パターンを実装することです。

単純な ViewHolder オブジェクトを作成できます。

private static class ViewHolder
{
     TextView textView;
}

次に、オーバーライドされた getView() でそれを使用します

    // Get that view
    @Override
    public View getView(int position, View convertView, ViewGroup parent)
    {               
        if (convertView == null)
        {
            if (getItemViewType(position) == 0)
            {
                convertView = inflater.inflate(R.layout.rowlayouta, null);
                viewHolder = new ViewHolder();
                viewHolder.textView = (TextView) convertView.findViewById(R.id.tvCommonText1);
                convertView.setTag(viewHolder);
            }
            else
            {
                convertView = inflater.inflate(R.layout.rowlayoutb, null);
                viewHolder = new ViewHolder();
                viewHolder.textView = (TextView) convertView.findViewById(R.id.tvCommonText2);
                convertView.setTag(viewHolder);
            }
        }

        else 
            viewHolder = (ViewHolder) convertView.getTag(); // Or if View is existing

        viewHolder.textView.setText(strings.get(position));

        return convertView;         
    }   

これは、2 つの異なる行レイアウトをどのように膨張させたかの単なる例です。最初の他のレイアウトを取り出すことができます。

その行に ViewHolder オブジェクトが割り当てられている場合、新しい ViewHolder オブジェクトが作成され、その TextView が現在の convertView の参照 (実質的には現在の行のビュー) に設定されることがわかります。次に、その特定の行 TextView への参照を含む ViewHolder オブジェクトは、基本的にsetTag(object)メソッドを使用してその convertView / 行にアタッチされます。

すでにタグがある場合、そのタグは、新しい参照で新しいオブジェクトを作成する代わりに getTag() メソッドを使用して取得されます。最も重要なことは、新しいビューが膨張することはなく、古いビューが再利用されるだけです。

これにより、特定の TextView への参照を保持する現在の ViewHolder オブジェクトを参照することで、必要な TextView プロパティを設定できます。

ご覧のとおり、どの行/ convertView が表示されているかを反映するために、テキストを各 TextView に変更しました。(それ自体はかなり便利です)。同じ方法で現在の ViewHolder を参照し、setTextColor() メソッドを使用するだけです。

多分それは少し引き出されました。しかし、うまくいけば、あなたが求めていることを実装できるようになり、なぜそれが良い実装なのかがわかります.

PS ListViews とアダプターがどのように組み合わされるか (ここで方法を考えてください) の詳細についてgetView()は、このチュートリアルが非常に役立ちます..

http://android.amberfog.com/?p=296

于 2012-12-20T23:48:38.040 に答える
0

クラスsetTextColor()で宣言されたメソッドが使えると思います。こちらTextViewのドキュメントをご覧ください。

動的な色とは、プログラムでの色を変更することを意味すると思いますTextView

カスタムアレイアダプタをお探しの場合は、このチュートリアルを参照してください。

于 2012-12-20T22:25:13.730 に答える