是否有必要为 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);
我遇到了这个错误,它说它无法解析构造函数数组适配器。考虑制作一个,但想确定是否有必要。我也确实覆盖了项目 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);