我有一些自定义类,其中包含RecyclerView
中不同视图类型的信息,如标题,描述等(尽管每个类都有不同的变量)。我想将这些类添加到ArrayList
,但我不希望它是通用的(对象?)ArrayList
,我想确保只有我的自定义类可以放入现在我可以通过使用setter和getter为它做另一个类来做这个,并做一些检查,但我更喜欢ArrayList<CustomGroup>
,CustomGroup
可以是CustomClass1
中的任何一个{1}},CustomClass2
等等......这是可能的,如果是的话,我该怎么做?
示例:
public class CustomClass1 {
String title, description;
int amount;
// Getter & Setter
}
public class CustomClass2 {
String errorMessage;
int errorCode;
// Getter & Setter
}
public class CustomClass3 {
String warningName;
double amount;
// Getter & Setter
}
ArrayList<CustomGroup> arrayList = new ArrayList<>();
CustomClass3 customClass3 = new CustomClass3();
// Set values for customClass3
arrayList.add(customClass3);
CustomClass1 customClass1 = new CustomClass1();
// Set values for customClass1
arrayList.add(customClass1);
答案 0 :(得分:4)
我建议使用接口。您可以将接口用作&#34;标记&#34;,其中接口基本上只定义了您希望在列表中允许的类实现它。但是,在您的情况下,您可以让接口定义String和int属性。
界面&#34;标记&#34;没有指定
public interface ICustomClassInterface {
}
public class CustomClass1 implements ICustomClassInterface {
String title, description;
int amount;
}
ArrayList<ICustomClassInterface> arrayList = new ArrayList<ICustomClassInterface>();
只有实现该接口的类才能添加到列表中。但是,你在这里的问题是你将通过这个界面找到它们,它没有定义任何东西,即你需要弄清楚它是什么类型。
理想情况下,您可以重构类以使其具有在抽象类中定义或在界面中指定的常用功能,然后您不需要关心实际类型是什么。
定义所需属性的界面
public interface ICustomClassInterface {
String FieldA;
int FieldB;
}
public CustomClass1 implements ICustomClassInterface {
String FieldA;
int FieldB;
}
ArrayList<ICustomClassInterface> arrayList = new ArrayList<ICustomClassInterface>();
答案 1 :(得分:0)
我同意另一个建议使用界面的答案。我想补充一点,因为你展示的例子没有相同的类型,你会发现自己正在做检查;或许像:
if (someClass instanceof CustomClass1) {
...
} else if (someClass instanceof CustomClass2) {
...
} else if (someClass instanceof CustomClassN) {
...
} else { ... }
这不是非常可扩展或易于维护。
您可以使用该接口,无论是空的还是具有相同类型的公共属性,但是通过执行所述检查可能会变得丑陋。也许您可以做的是避免这种情况,添加一个CustomClassProcessor
类,它将为您必须处理的各种类型重载方法;这被称为访客模式。
public class CustomClassProcessor {
public void process(CustomClass1 cc) {
// Do stuff for CustomClass1
}
public void process(CustomClass2 cc) {
// Do stuff for CustomClass2
}
public void process(CustomClass cc) {
// Do stuff for CustomClass3
}
...
}
你的界面就是这样:
public interface CustomClass {
public void getProcessed(CustomClassProcessor cp);
}
具体自定义类的一个示例是:
public class CustomClass1 implements CustomClass {
@Override
public void getProcessed(CustomClassProcessor cp) {
cp.process(this);
}
}
你可以像以下一样使用它:
for (CustomClass cc : list)
cc.getProcessed(customClassProcessor);
或Java 8功能......
list.forEach(cc -> cc.getProcessed(customClassProcessor);
答案 2 :(得分:-2)
您有几个绝对不同的对象和要求将它与数组列表连接,以按位置在recyclerView中显示它。所以你必须使用Object的ArrayList(或另一个对象集合),你无法避免它并且推迟检查类型。
你必须创建这样的列表,并通过使用instanceof连接具有项类型(在getItemType中)的具体类存储对象。之后,您可以根据这些类型创建viewHolders,然后在onBindViewHolder中将当前项目转换为连接的viewHolder或在具体视图持有者中封装转换