0

動的にプログラムされたtextViewのリストがあります...

GridView layout = (GridView) context.findViewById(R.id.linearLayout1);
        PrizeAdapter adapter = new PrizeAdapter(context, 0, 0, game.getPrizeList());
        layout.setAdapter(adapter);

アダプタークラス:

public class PrizeAdapter extends ArrayAdapter<String> {

    private List<String> objects;

    public PrizeAdapter(Context context, int resource, int textViewResourceId,
            List<String> objects) {
        super(context, resource, textViewResourceId, objects);
        this.objects = objects;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        TextView text = new TextView(getContext());
        text.setId(position);
        text.setText(objects.get(position));
        text.setTextSize(12);
        text.setPadding(0, 5, 0, 5);
        text.setTextColor(Color.WHITE);
        text.setBackgroundColor(Color.GRAY);
        text.setGravity(Gravity.CENTER | Gravity.BOTTOM);
        return text;
    }

}

おそらく、私は10個のTextViewを作成しました。特定のtextViewを取得して、色を変えるにはどうすればよいですか。

私はこれを試しました

GridView layout = (GridView) context.findViewById(R.id.linearLayout1);
TextView view = (TextView) layout.findViewById(1);
view.setBackgroundColor(Color.YELLOW);
view.setTextColor(Color.RED);

しかし、それは機能せず、nullpointer例外が発生しただけです。助けてください。

4

2 に答える 2

1

そのような振る舞いの理由は、あなたがそれを早すぎることをしているからです。つまり、ビューがID 1で作成される前であっても、それらにアクセスしようとしています。

つまり、何が起こっているのかというと、アダプターにビューを膨らませるように依頼すると、アダプターが制御を取り、何が表示され、何が表示されるべきかをチェックします。そして、ifの直後(ビューが読み込まれる前)にfindviewbyID(1)を呼び出すと、このビューはまだ作成されないため、nullポインターを取得します。

グリッドにデータが入力された後、ボタンを使用してタスクを実行しようとすると、コードは機能します。

  final GridView layout = (GridView) findViewById(R.id.linearLayout1);
    PrizeAdapter adapter = new PrizeAdapter(this, 0, 0, objects2);
    layout.setAdapter(adapter);


    findViewById(R.id.button1).setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {

            TextView view = (TextView) layout.findViewById(1);
            view.setBackgroundColor(Color.YELLOW);
            view.setTextColor(Color.RED);

            // TODO Auto-generated method stub

        }
    });

だから2つの解決策

1)色を変更するための遅延ハンドラーポスト。

2)ビュー1がロードされたような結果を返すカスタムコールバックインターフェイスを作成します。

于 2013-01-04T10:22:12.227 に答える
0

ViewGroup.getChildAt(position)を使用すると、その位置のビューが返されます。次に、それをTextViewにタイプキャストして(TextViewを直接アイテムビューとして設定しているため)、色を設定します。

オブジェクトのIDを設定しない限り、オブジェクトを動的に作成しているときにfindViewById()を使用できないもう1つのこと。

于 2013-01-04T09:18:53.977 に答える