0

次のコードがあります。

final LinkedHashMap<String, Line> trainLinesMap = MetraRail.myDbHelper.getTrainLinesHashMap();

// Create an array of proper line names for the listview adapter.
String[] train_lines_long_names = new String[trainLinesMap.size()];

Iterator<Entry<String, Line>> it = trainLinesMap.entrySet().iterator();
for (int i = 0; it.hasNext(); i++) {
    Map.Entry<String, Line> pairs = (Map.Entry<String, Line>) it.next();
    train_lines_long_names[i] = (String) pairs.getKey();
}

// Override the default list adapter so we can do 2 things: 1) set custom background colors
// on each item, and 2) so we can more easily add onclick handlers to each item.
listview.setAdapter(
new ArrayAdapter<String>(this, R.layout.select_line_row_layout,
        R.id.select_line_line_label, train_lines_long_names) {

                @Override
                public View getView(int position, View convertView, ViewGroup parent) {
                    TextView textView = (TextView) super.getView(position, convertView, parent);

                    // Change the background color of each item in the list.
                    final String line_label_long = textView.getText().toString();
                    final int line_color = trainLinesMap.get(line_label_long).getColorInt();
                    textView.setBackgroundColor(line_color);

                    // Add onclick handlers to each item.
                    textView.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            Intent i = new Intent();
                            i.setClassName("garrettp.metrarail", 
                                    "garrettp.metrarail.screens.SelectStations");
                            i.putExtra("garrettp.metrarail.line.short", 
                                    trainLinesMap.get(line_label_long).getShortName());
                            i.putExtra("garrettp.metrarail.line.long", line_label_long);
                            i.putExtra("garrettp.metrarail.line.color", line_color);
                            startActivity(i);
                        }
                    });

                    return textView;
                }
            });

行で:

final int line_color = trainLinesMap.get(line_label_long).getColorInt();

NullPointerException が発生します。

10-26 16:10:35.922: E/AndroidRuntime(1785): java.lang.NullPointerException
10-26 16:10:35.922: E/AndroidRuntime(1785):     at garrettp.metrarail.screens.SelectLine$1.getView(SelectLine.java:74)

どうしてこれなの?デバッガーで、trainLinesMap が正しく初期化され、値が入力されていることを確認しました。最初の for ループで正常に繰り返されるため、そこに値があることがわかります。しかし、匿名の内部クラスから LinkedHashMap にアクセスすると、常に null になります。

この内部クラスから String 配列にアクセスできましたが、LinkedHashMap にアクセスできないのはなぜですか?

4

1 に答える 1

1

行を分割することでこれを解決しました:

final int line_color = trainLinesMap.get(line_label_long).getColorInt();

の中へ:

Line thisLine = trainLinesMap.get(line_label_long);
final int line_color = thisLine.getColorInt();

なぜこれが機能したのかはわかりませんが、NullPointerExceptions は発生しなくなりました。

于 2013-10-26T20:59:41.300 に答える