是否有必要为 ArrayList 中的对象创建自定义数组适配器 class?

Is it Necessary to create a custom array adapter class for Objects in an ArrayList?

我遇到了这个错误,它说它无法解析构造函数数组适配器。考虑制作一个,但想确定是否有必要。我也确实覆盖了项目 class 中的 toString 方法。

public class Myfragment extends Fragment {

@Override
public View onCreateView(   LayoutInflater inflater,
                             ViewGroup container,
                             Bundle savedInstanceState) {

    MyApplication MyArraylist;


    ArrayAdapter <MyItem> arrayAdapter;

    MyItem item1 = new MyItem();
    item1.setName("MyFirstHomework");
    item1.setGrade(60);
    item1.setCategory("Homework");

    MyArraylist = new MyApplication();
    MyArraylist.getItemsArrayList().add(item1);





    arrayAdapter = new ArrayAdapter<MyItem>
    (this,R.layout.Myview,MyArraylist);  //THIS IS WHERE THE CONSTRUCTOR       
    ERROR IS


    ListView v = (ListView) findViewById(R.id.MyXML); 
    v.setAdapter(arrayAdapter);




    return inflater.inflate(R.layout.list_fragment,container, false);
}
}

同样在 ListView 上 findViewById 说它无法解析方法。现在已经尝试了几个小时。有什么建议吗?

public class MyApplication extends Application {
    ArrayList<MyItem> MyArrayList;


    public ArrayList<MyItem> getMyArrayList() {

            MyArrayList = new ArrayList<MyItem>();
            return MyArrayList;
    }



    }

这里发生的一些事情会阻碍你的进步。

每次您调用 getItemsArrayList() 添加新项目时,都会创建一个新的 ArrayList,它将清除您之前添加的项目。这可以通过在 MyApplication 的构造函数中而不是在方法中创建 ArrayList 来解决。

此外,您将 MyApplication 对象而不是 ArrayList<MyItem> 对象传递给 ArrayAdapter 构造函数。这可以通过添加一个新变量 myList 来解决,该变量引用 MyApplication.

中的 ArrayList

这里有一些带有注释的代码来说明我的意思:

public class Myfragment extends Fragment {

  @Override
  public View onCreateView(   LayoutInflater inflater,
                               ViewGroup container,
                               Bundle savedInstanceState) {

    MyApplication app; // renamed from MyArraylist
    ArrayAdapter <MyItem> arrayAdapter;
    ArrayList<MyItem> myList; // this is a new variable to reference the list

    // create application and get the items list
    app = new MyApplication();
    myList = app.getItemsArrayList();

    // create items and add to list
    MyItem item1 = new MyItem();
    item1.setName("Title");
    item1.setGrade(60);
    item1.setCategory("Type");
    myList.add(item1);

    // use myList instead of app (renamed from MyArraylist) in the constructor
    arrayAdapter = new ArrayAdapter<MyItem>(this, R.layout.Myview, myList); 

    ListView v = (ListView) findViewById(R.id.MyXML); 
    v.setAdapter(arrayAdapter);

    return inflater.inflate(R.layout.list_fragment,container, false);
  }
}

并且:

public class MyApplication extends Application {
  private ArrayList<MyItem> myArrayList;

  public MyApplication() {
    // create the list in the constructor
    myArrayList = new ArrayList<MyItem>();
  }

  public ArrayList<MyItem> getMyArrayList() {
    // return the already initialized list rather than creating a new one
    return myArrayList;
  }
}

最后,findViewById() 方法只有在您的 Fragment class subclasses Activity 或其他 class 具有findViewById() 方法。

您现有的代码正在尝试将 MyAppliction 对象传递给 ListAdapter 构造函数。这不会编译,因为 MyArraylist 的类型是 MyApplication:

MyArraylist = new MyApplication();
MyArraylist.getItemsArrayList().add(item1);
arrayAdapter = new ArrayAdapter<MyItem>(this,R.layout.Myview,MyArraylist);

相反,您的意思是像这样将实际的 ArrayList 对象从 MyApplication 内部传递给构造函数吗?

MyApplication myapp = new MyApplication();
ArrayList<MyItem> list = myapp.getItemsArrayList();
list.add(item1);
arrayAdapter = new ArrayAdapter<MyItem>(this, R.layout.Myview, list);