我在java上有点差或者更好地说OOP我有一个奇怪的问题,我想知道那是否可能。我有一个班级
private ArrayList<?> data;
public A(Activity a, ArrayList<?> mStatus)
{
activity = a;
data = mStatus;
inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
imageLoader = new ImageLoader(activity.getApplicationContext());
}
后来我用了
public View getView(int position, View convertView, ViewGroup parent)
{
View vi = convertView;
ViewHolder holder;
if (convertView == null)
{
vi = inflater.inflate(R.layout.custom_gallery, null);
holder = new ViewHolder();
holder.text = (TextView) vi.findViewById(R.id.text);
holder.image = (ImageView) vi.findViewById(R.id.image);
holder.root = (LinearLayout) vi.findViewById(R.id.root);
vi.setTag(holder);
}
else
holder = (ViewHolder) vi.getTag();
//I used this that solves my problem
if(data.get(position) instanceof GalleryTestParser)
{
GalleryTestParser mParser = (GalleryTestParser)data.get(position);
holder.text.setText(mParser.Name);
holder.image.setTag(mParser.galleryThumbiPad);
holder.root.setTag(mParser);
imageLoader.DisplayImage(mParser.galleryThumbiPad, activity, holder.image);
}
return vi;
}
编辑:如果数据类型为GalleryTestParser,或者除了执行其他操作之外的其他内容,我想要上面。
之前我在构造函数中尝试ArrayList<GalleryTestParser> mStatus
,但这是特定于类的。我想要的是从arraylist的对象以某种方式我必须知道它是什么类型,以便我输入转换arraylist对象到该类型。
这可能吗?
答案 0 :(得分:3)
试试这个
public A(Activity a, List<? extends GenericParser> mStatus)
然后从通用库中继承不同类型的解析器。
但是要小心,如果你需要使用instanceof告诉他们你可能做错了, 实际上只有解析器才需要知道它是什么类型!
答案 1 :(得分:2)
扩展StevieB的答案(并添加一个扭曲):您可以使用界面和唯一键来识别您正在处理的具体类:
public abstract interface GenericParser {
public String getType();
}
public class GalleryTestParser implements GenericParser {
public String getType() {
return "gallery";
}
}
public A(Activity a, List<? extends GenericParser> mStatus) {
GenericParser item = mStatus.get(0);
if (item.getType().equals("gallery")) {
item = (GalleryTestParser)item;
// Do stuff with item
}
}
这避免了“instanceof”,让您更好地控制处理。例如,getType()可能会在将来返回更复杂的内容,例如功能列表。
理想情况下,您可能希望将执行移至GalleryTestParser,这将使代码更清晰:
public abstract interface GenericParser {
public void execute();
}
public class GalleryTestParser implements GenericParser {
public void execute() {
// Do stuff with item
}
}
public A(Activity a, List<? extends GenericParser> mStatus) {
GenericParser item = mStatus.get(0);
item.execute();
}
答案 2 :(得分:1)
您需要instanceof
运营商吗?
if (mStatus.get(i) instanceof GalleryTestParser){
GalleryTestParser parser = (GalleryTestParser) mStatus.get(i)
}
但这种做法并不好。
答案 3 :(得分:0)
将您的签名更改为
public A(Activity a, List<GalleryTestParser> mStatus)