【问题标题】:Passing Class Attribute like a factory Pattern in Android Activity在 Android Activity 中像工厂模式一样传递类属性
【发布时间】:2014-01-28 13:02:59
【问题描述】:

我正在从事这项活动,我有一堆动态微调器。为了设置每一项的项目,我为每个 SpinnerAdapter 设置了一个 List 属性。

为了管理我要更新的微调器项目,我创建了一个私有方法,它应该像工厂模式一样工作,但只返回我需要更新的特定微调器的列表。

在我看来(至少在 Objective-c 中思考)这段代码应该可以工作。

package com.package.demo;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.SpinnerAdapter;

public class SomeActivity extends Activity implements OnItemSelectedListener {

    private int activitySpinners[] = {
            R.id.spinner_a,
            R.id.spinner_b,
            R.id.spinner_c
    };

    private List<String> spinnerAdapterItemsA;
    private List<String> spinnerAdapterItemsB;
    private List<String> spinnerAdapterItemsC;


    private List<String> teste ;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_orders);

        for (int i = 0; i < this.activitySpinners.length; i++) {
            int spinnerId = this.activitySpinners[i];
            Spinner spinner = (Spinner) findViewById(spinnerId);
            this.clearArrayAdapterItemsWithPrompt(spinnerId);
            this.updateArrayAdapterItemsWithPrompt(spinnerId);
            spinner.setOnItemSelectedListener(this);
            ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.spinner_item, this.adapterItemsForSpinnerId(spinnerId));
            adapter.setDropDownViewResource(R.layout.spinner_dropdown_item);
            spinner.setAdapter(adapter);
        }
    }

    private List<String> adapterItemsForSpinnerId(int spinnerId) {
        List<String> list = null;
        switch (spinnerId) {
            case R.id.spinner_a:
                list = this.spinnerAdapterItemsA;
                break;
            case R.id.spinner_b:
                list = this.spinnerAdapterItemsB;
                break;
            case R.id.spinner_c:
                list = this.spinnerAdapterItemsC;
                break;
            default:
                return list;
        }
        return list;
    }

    private void clearArrayAdapterItemsWithPrompt(int spinnerId) {
        List<String> list = this.adapterItemsForSpinnerId(spinnerId);
        list = new ArrayList<String>();
    }

    private void updateArrayAdapterItemsWithPrompt(int spinnerId) {
        Spinner spinner = (Spinner) findViewById(spinnerId);
        String prompt = (String) spinner.getPrompt();
        this.adapterItemsForSpinnerId(spinnerId).add(0, prompt);
    }

    public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
        // TODO: Handling Stuff
    }

    public void onNothingSelected(AdapterView<?> parent) {
        // TODO: Handling Stuff
    }
}

但是我遇到了 java 空指针异常。当 updateArrayAdapterItemsWithPrompt 尝试设置 List 的提示值时。

【问题讨论】:

  • 1. clearArrayAdapterItemsWithPrompt 没用,什么都没做
  • 我的猜测是你没有设置提示所以它是空的并且添加抛出 NPE
  • 2.不清楚NPE的来源,你可能传递了无效的spinnerId,请提供异常和堆栈跟踪

标签: java android attributes nullpointerexception factory


【解决方案1】:

您的班级的问题在于“工厂属性”的设置方法。 您有空指针异常,因为它没有在每个私有变量中设置一个新的 ArrayList。要解决这个问题,您必须执行以下设置器。正如 hoaz 所说, clearArrayAdapterItemsWithPrompt 没用,因为它没有正确设置变量。要修复,您应该执行以下代码:

private void clearArrayAdapterItemsWithPrompt(int spinnerId) {
    setArrayAdapterItemsWithSpinnerId(spinnerId, new ArrayList<String>())
}

private void setArrayAdapterItemsWithSpinnerId(int spinnerId, List<String> list) {
    switch (spinnerId) {
        case R.id.spinner_a:
            this.spinnerAdapterItemsA = list;
            break;
        case R.id.spinner_b:
            this.spinnerAdapterItemsB = list;
            break;
        case R.id.spinner_c:
            this.spinnerAdapterItemsC = list;
            break;
        default:
        break;
}

值得一提的是,也许您可​​能会丢失 Spinner 的样式,也许您将不得不稍微编辑该方法以满足您的需求。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-25
    • 1970-01-01
    • 1970-01-01
    • 2016-07-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多