Java奇怪的问题

时间:2011-03-17 11:38:32

标签: java android

我在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对象到该类型。

这可能吗?

4 个答案:

答案 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)