我一直在开发一个在列表活动中显示提要的应用程序。 首先,我要获取信息并进行解析,然后将其放入我创建的“ FeedType”数组中,该数组具有3个字段:位图图片,字符串名称和查看内容。 内容代表提要的内容,并且有不同类型的内容。 该数组正在解析过程中初始化。

我在xml文件中创建了Feed布局。 通过使用addView()创建了一个包含“内容”的ImageView,TextView和LinearLayout。 我创建了一个包装器,并创建了ListAdapter来重用列表中的对象。

我的问题开始于尝试使用已经是其他LinearLayout的子视图的视图时,之所以发生这种情况,是因为当我从数组中检索内容时,我将替换对现有视图的引用,而不是对新视图的引用。

有没有办法从现有视图创建新视图? 还是有人得到其他解决方案?

码:

public class FeedType {

    private Bitmap profilePicSrc;
    private String name;
    private View feedContent;
    private Context context;
    private final String PIC_BASE_SRC = "xxx";
    private final String PIC_END_SRC = "xxx";


    public FeedType(String contactId, String name, View feedContent, Context context){
        try {
            this.profilePicSrc = BitmapFactory.decodeStream((InputStream)new URL(PIC_BASE_SRC + contactId.toString() + PIC_END_SRC).getContent());
        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        this.name = name;
        this.context = context;
        this.feedContent = feedContent;
    }

    public String getName(){
        return name;
    }

    public Bitmap getProfilePicture(){
        return profilePicSrc;
    }

    public View getContent(){
        return this.feedContent;
    }
}

包装类:

public class FeedWrapper {

    private View base;
    private ImageView pic = null;
    private TextView name = null;
    private LinearLayout content = null;

    public FeedWrapper(View base) {
        this.base = base;
    }

    public ImageView getProfilePicture() {
        if (pic == null) {
            pic = (ImageView)base.findViewById(R.id.pic);
        }
        return(pic);
    }

    public TextView getName() {
        if (name == null) {
            name = (TextView)base.findViewById(R.id.name);
        }
        return(name);
    }

    public LinearLayout getContent() {
        if (content == null) {
            content = (LinearLayout)base.findViewById(R.id.content);
        }
        else content.removeAllViews();
        return(content);
    }

}

ListAdapter类:

private class FeedListAdapter extends ArrayAdapter<Object> {

        public FeedListAdapter() {
            super(Feeds.this, R.layout.feed, new Object[feedArrLength]);
        }

        public View getView(int position, View convertView, ViewGroup parent) {
            View feed = convertView;
            FeedWrapper wrapper = null;

            if (feed == null) {

                feed = getLayoutInflater().inflate(R.layout.feed, parent, false);
                wrapper = new FeedWrapper(feed);
                feed.setTag(wrapper);
            }
            else {
                wrapper = (FeedWrapper)feed.getTag();
            }

            wrapper.getName().setText(arr.get(position).getName());
            wrapper.getProfilePicture().setImageBitmap(arr.get(position).getProfilePicture());
            wrapper.getContent().addView(arr.get(position).getContent());
            return(feed);
        }
    }

我知道这有点难以理解,如果您有任何疑问,请询问。

预先感谢,埃拉德!

===============>>#1 票数:0 已采纳

我认为将View保留在FeedType对象中是错误的方法。 仅将数据保留在FeedType中。

例如,创建新类FeedContent ,其中包含有关提要内容(不是任何视图)的解析数据:

class FeedContent {

... // i.e. private List<String> contents;

}

然后更改您的FeedType类:

public class FeedType {

private Bitmap profilePicSrc;
private String name;
private FeedContent feedContent;
private Context context;
private final String PIC_BASE_SRC = "xxx";
private final String PIC_END_SRC = "xxx";


public FeedType(String contactId, String name, FeedContent feedContent, Context context){
    try {
        this.profilePicSrc = BitmapFactory.decodeStream((InputStream)new URL(PIC_BASE_SRC + contactId.toString() + PIC_END_SRC).getContent());
    } catch (MalformedURLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    this.name = name;
    this.context = context;
    this.feedContent = feedContent;
}

public String getName(){
    return name;
}

public Bitmap getProfilePicture(){
    return profilePicSrc;
}

public FeedContent getContent(){
    return this.feedContent;
}

}

然后使您的FeedListAdapter像这样:

private class FeedListAdapter extends ArrayAdapter<Object> {

    public FeedListAdapter() {
        super(Feeds.this, R.layout.feed, new Object[feedArrLength]);
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        View feed = convertView;
        FeedWrapper wrapper = null;

        if (feed == null) {

            feed = getLayoutInflater().inflate(R.layout.feed, parent, false);
            wrapper = new FeedWrapper(feed);
            feed.setTag(wrapper);
        }
        else {
            wrapper = (FeedWrapper)feed.getTag();
        }

        wrapper.getName().setText(arr.get(position).getName());
        wrapper.getProfilePicture().setImageBitmap(arr.get(position).getProfilePicture());
        View feedContentView = createContentView(arr.get(position).getContent());
        wrapper.getContent().addView(feedContentView);
        return(feed);
    }

    private View createContentView(FeedContent feedContent) {
        ... // Here you shuold inflate new view and fill it with data from "feedContent"
    }
}

  ask by Elad92 translate from so

未解决问题?本站智能推荐:

1回复

addView方法不显示新视图

我想向FrameLayout添加一个新视图,但是它只能“有时”工作。 例如:我已经为布局设置了OnClickListener (在活动的onCreate方法内部),这为布局添加了一个新视图(这OnClickListener )。 在活动的运行方法中,我正在使用完全相同的代码来添加此类视图,但
3回复

创建片段视图时崩溃

我放置了一个单击事件,目的是通过片段内部的ImageButton进行活动。 但是该应用程序因以下错误而崩溃。 尝试在空对象引用上调用虚拟方法'void android.widget.ImageButton.setOnClickListener(android.view.View $
4回复

样式化在Android上以编程方式创建的视图

所以我正在阅读的家伙们说,根本不可能通过Java设置view的样式。 尚无此类方法myView.setStyle("styleName") 。 然后,当您通过代码创建布局元素(例如textvews , imageviews或linearlayouts作为容器)时,如何设置它们的样式?
1回复

如何识别在Android上用Java创建的视图

我有以下疑问: 我在Java上创建视图,并将其添加到LinearLayout ,在这种情况下,为TextView(这是我的表单的标签)和位于他下方的两个EditText,它们都可以接收带有浮点数的数字。 因此,我创建了一个ArrayList<TextView>和Array
1回复

膨胀视图

我需要使用view.getWidth() ,但我不能,因为我还没有夸大视图。 如何在使用view.getWidth()之前对视图进行充气? MainActivity类: GameView类:
3回复

NullPointer在视图中

我在另一个活动中将自定义视图实现为XML布局。 该视图可以工作并显示画布的颜色,但是一旦视图通过,信息就会绘制到画布上,程序就会死掉。 问题似乎来自mPath,我认为这可能与位图大小与xml布局不同有关。 该程序似乎可以处理与mPath有关的任何事情。 这是带有内部自定义视图的活
1回复

如何将数据更新为从自定义视图类创建的对象,以便可以在自定义视图上绘制?

我的应用程序需要将数据发布到自定义视图,并根据MainActivity发送的数据重绘视图。 这是示例代码。 自定义视图 - > 这是主要活动 - > 按下按钮时我无法更新x_val,我哪里出错了,需要做什么来更新x_val?
2回复

返回片段中的多个视图?

我像往常一样通过Fragments Java文件扩展XML: 然后当然 效果很好,但是,我也试图利用Syncfusion库在屏幕上获取量规,而这需要我设置setContentView() ,它无法与Fragments一起使用,因此我决定return该量规我正在这样构建:
2回复

在绘制之前调整视图的大小

在我的布局中,我有一个包含4个自定义ImageView的GridView。 我将GridView的可见性设置为不可见,直到首先调整所有ImageView的大小,但是当显示GridView时,ImageViews仍然短暂闪烁。 眨眼一秒钟 稍后调整视图大小 每个ImageVie
1回复

Android布局/视图旋转/定位

我有一个带有ImageView和8 TextView的RelativeLayout。 我想在该图像周围动态放置标签。 我认为最好的方法是将图像每隔45度旋转一次,并在每个位置放置一个标签,但是直到下一个predetermind onDraw调用以及所有TextViews时,Image / R