【问题标题】:How to access ArrayList from another class in Android Java?如何从 Android Java 中的另一个类访问 ArrayList?
【发布时间】:2012-08-21 02:38:21
【问题描述】:

我是 Android 和 Java 的新手,但在 Objective C 和 iPhone 编程方面有一些经验。我正在尝试重新创建一个我已经为 iPhone 设计的应用程序,并且被困在应该是一个简单的概念上。

在我的 ParserHandler 类中,我从服务器解析 XML 并将数据放入三个单独的 ArrayList 中。解析似乎工作正常。当我登录并遍历 ParserHandler.java 类中的 ArrayList 时,一切正常。 (List1.java 类有一些字符串变量,我已经在 ParserHandler 中这样声明它:private List1 theList = new List1();

for(int i = 0; i<dogArray.size(); i++){
        theList = dogArray.get(i);
        Log.i(TAG, "looping " + i + " " + theList.Name);
        Log.i(TAG, "looping " + i + " " + theList.PhotoUrl);
        Log.i(TAG, "looping " + i + " " + theList.Type);


        }//this loops fine and has all the data

dogArray 声明如下:public ArrayList<List1> dogArray = new ArrayList<List1>(); 现在我想从 DogListView.java 类中访问 dogArray,所以在 onCreate 方法中我尝试执行以下操作:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.dog_list_view);
        ParserHandler ph = new ParserHandler();
        int d = ph.getNumberofDogs();
        int m = ph.dogArray.size();
        Log.i(TAG, "dog size is:" + d + "and:" + m);}

我尝试了两种不同的方法,但都始终在日志中返回“0”。但是,当日志来自 ParserHandler.java 类时,始终会记录正确的大小并且所有数据都在那里。

这是 ParserHandler.java 中的访问器方法。

   public int getNumberofDogs(){
            return dogArray.size();
        }

我更喜欢通过访问器方法访问 dogArray(因为这似乎是我收集到的最佳实践)但是我愿意接受所有建议。

提前致谢!!

编辑 8/23/12

我最终通过声明我的ArrayLists Static 解决了这个问题。我知道这种(和public)方法对于OOP 来说并不理想,但我会接受。在我的 ParserHandler.java 中我声明了

public static ArrayList<List1> dogArray = null; 
public static ArrayList<List1> otherArray = null;
public static ArrayList<List1> catArray = null;

然后开始我的 SAX 解析器:

@Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
        // TODO Auto-generated method stub
        super.startElement(uri, localName, qName, attributes);
        if (qName.equalsIgnoreCase("ArrayOfDataFeedAnimal")){
            catArray = new ArrayList<List1>();
            dogArray = new ArrayList<List1>();
            otherArray = new ArrayList<List1>();
        }else if(qName.equalsIgnoreCase("DataFeedAnimal")){
            theList = new List1();
        }

然后我的 SAX 解析的其余部分发生。最后,从我想要访问数组的任何类中,我只需通过ParserHandler.dogArray.size() 以静态方式执行此操作即可获取数组的大小。我现在可以从我需要的任何类中以任何我认为合适的方式操作数组。

我仍然不清楚为什么使用我解析的 ArrayLists 创建 ParserHandler 类的实例对我不起作用,因为当我使用简单的 int[] 进行测试时它工作正常。

希望这可以在未来对其他人有所帮助。

再次感谢大家的反馈!

干杯!

【问题讨论】:

    标签: java android arraylist


    【解决方案1】:

    你可以通过两种方式做到这一点,

    1. 创建一个setter/getter类
    2. 创建一个返回 ArrayList 的公共静态方法

    第一种方法:

    类名:myDataObject.java

    private ArrayList myArrayList;
    
    // setting the ArrayList Value 
    public void setArrayList ( ArrayList myArrayList )
    {
         this.myArrayList = myArrayList;
    }
    
    // getting the ArrayList value 
    public ArrayList getArrayList() 
    {
         return myArrayList;
    }
    

    第二种方法:

    在ArrayList文件中,(假设类名是class A.java)

    private static ArrayList myArrayList = null; 
    
    ... 
    // assign arraylist 
    
    public static ArrayList getArrayList()
    {
          return myArrayList;
    }
    

    在调用活动/类中,您可以使用以下代码调用它,

    private ArrayList newArrayList = null;
    
    newArrayList = A.getArrayList();
    

    【讨论】:

    • 我也试过你的第二个月。徒劳无功。在我的 ParserHandler 类中,我有public ArrayList getArrayList() { return myArrayList; },在我的 DogListView.java 中,我通过newDogArray = ph.getArrayList(); 访问它,然后测试我打印出int d = newDogArray.size();,但每次都是“0”。把我逼疯了。
    • 您需要将您的公共方法定义为公共静态,请参阅我的代码。
    • 静态无效。我的 ArrayList 位于我的 ParserHandler 中,它扩展了 defaulthandler。我想我需要将这些数组移动到我的主要活动中,以便它们不会被破坏?我要么得到空指针错误,要么得到“0”。我会试一试,让你知道。谢谢
    • okey find,意思是同时更新您更改的代码,以便我可以查看它并在需要时建议您
    • 在敲了我几下头之后,我终于让它工作了。我之前尝试过你的静态方法,但没有奏效。不断尝试不同的方法,我很确定我掌握了 getter 和 setter,但是这种方法也不起作用。我最终回到使用你的静态方法(一旦我清理了项目中提琴!!)我知道有些人不喜欢这种方式,但我认为它可以满足我的需要。我仍然不明白为什么我的 getter 和 setter 不起作用?当我测试通过一个简单的'int []'时,我没有问题。但是我解析成的arrayLists是有问题的孩子!!
    【解决方案2】:

    您不应该将方法设为静态。因为那不是 OOP 设计。

    有两种方式:

    1)。要么公开属性。 (也不是一个好习惯)

    2)。为ParserHandler类添加getter和setter

    class ParserHandler {
    
      private  List<List1> dogArray = new ArrayList<List1>();
    
      public List<List1> getDogArray() {
       return this.dogArray;
      }
    
      public void setDogArray(List<List1> dogArray) {
        this.dogArray = dogArray;
      }
    
    
    }
    

    现在像这样访问 dogArray

    ph.getDogArray();
     int m = ph.getDogArray().size();
    

    最初它将为 0,因为它是一个空列表。使用setter方法先设置数组

    【讨论】:

    • 您的选项 #2 对我来说最有意义。您能否在初始化int m = ph.getDogArray().size(); 之前说明ph.getDogArray(); 的目的?我觉得我应该能够int m = ph.getDogArray().size();。 (我不太关心我真正想要访问 dogArray 的大小);同样在 ParserHandler 类中,通过在 dogAray 之前声明 this. 来返回数组是否具有重要意义?感谢您的帮助!
    • 我试过了,但我仍然得到“0”。呸呸呸!!!我的应用程序将是只读的,所以我想我可以不用 setter 方法。同样,当我遍历数组并从 ParserHandler.java 类记录它时,一切都很好。我尝试通过 DogListView.java 类中的 getterMethod 返回相同的数组我没有收到任何错误,只是什么都没有?我知道数据存在两个方面:1)我的 UI 在下载和解析数据时被阻止(现在我无法在数据存在之前进入活动)和 2)当我循环访问它时它的日志记录ParserHandler.java 类。 #困惑
    【解决方案3】:

    请注意,在您的 oncreate 中,您正在 ParserHandler 中执行文件操作,它将 xml 文件解析为您的数据。如果 ParserHandler 没有在单独的线程中处理,这可能会阻塞 UI 线程。但是,如果您在单独的线程中处理,那么您的 int d = ph.getNumberofDogs();由于 UI 线程和处理解析的单独线程之间的竞争条件,即使您的 xml 中有数据也可能返回 0。

    我认为最好的解决方案是在解析完成时创建一个侦听器,这样您就可以确定在访问列表大小之前处理已经完成。

    将此添加到您的 ParserHandler 类中

    class ParserHandler {
    
           ...... your original codes here
    
           private OnParsingDoneListener mListener;
           public void setOnParsingDoneListener (OnParsingDoneListener listener){
                 mListener = listener;
           }
    
          public static interface OnParsingDoneListener {
                public void onParsingDone (List dogList);
          }
    
    }
    

    请确保在完成 xml 数据解析后调用 mListener.onParsingDone。

    在你的 onCreate()...

    ParserHandler ph = new ParserHandler();
    ph.setOnParsingDoneListener (new ParserHandler.OnParsingDoneListener(){
         public void onParsingDone(List dogList){
             // do whatever you want to the doglist
             // at this point all parsing is done and dogList contains the data from xml
         }
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多