当前位置: 首页 > 知识库问答 >
问题:

动态添加的视图未显示在LinearLayout中

濮俊美
2023-03-14

我为之构建的客户端需要一个功能,该功能要求我围绕大量内容(包括“新闻”部分)包装一个滚动视图。因此,我不能使用ListView。我试图手动将所有ListItem视图膨胀为垂直线性布局。我意识到我会失去ListView的优化功能,但这是客户想要的,所以我不得不这样做。我觉得我的解决方案应该是可行的,但屏幕上没有任何视图。我的ScrollView内部是一个LinearLayout,内部是第二个LinearLayout:

<!-- News Fragment -->
        <LinearLayout
            android:id="@+id/news_frag"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:background="@color/test_yellow"/>

以下是NewsListItem的布局文件:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="5dp"
android:paddingBottom="5dp"
android:orientation="horizontal"
android:onClick="newsListItemClick"
android:background="@color/test_green">

<com.android.volley.toolbox.NetworkImageView
    style="@style/thumbnail_image"
    android:id="@+id/news_list_item_image"
    android:layout_width="@dimen/thumbnail_width"
    android:layout_height="@dimen/thumbnail_height" />

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical" >

    <TextView 
        style="@style/headline_text"
        android:id="@+id/news_list_item_headline"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <TextView 
        style="@style/promo_text"
        android:id="@+id/news_list_item_promo_brief"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>

最后,我以编程方式使用的代码。newsRequest()是我在onCreateView中的最后一个调用:

private void newsRequest() {
    Log.d("snw", "newsRequest()");
    JsonArrayRequest jsonRequest = new JsonArrayRequest(NEWS_FEED_URL, 
            new Response.Listener<JSONArray>() {

        @Override
        public void onResponse(JSONArray response) {
            for (int i = 0; i < response.length(); i++) {
                try {
                    NewsListItem item = new NewsListItem((JSONObject) response.get(i));
                    View view = addNewsToView(item);
                    containerView.addView(view);
                    containerView.invalidate();
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
            containerView.bringToFront(); //something I tried, didn't help
            containerView.postInvalidate(); //Same as above
        }

    }, new Response.ErrorListener() {

        @Override
        public void onErrorResponse(VolleyError error) {
            error.printStackTrace();
        }

    });

    volleyQueue.add(jsonRequest);
}

private View addNewsToView(NewsListItem item) {
    Log.d("snw", "addNewsToView()");
    ViewHolder holder;
    View view = new View(getActivity());

    if (view.getTag() == null) {
        Log.d("snw", "Holder was null, inflating view");
        LayoutInflater inflater = (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        view = inflater.inflate(R.layout.news_list_item, null);

        // set up ViewHolder
        holder = new ViewHolder();
        holder.thumbnail = (NetworkImageView) view.findViewById(R.id.news_list_item_image);
        holder.headline = (TextView) view.findViewById(R.id.news_list_item_headline);
        holder.promoBrief = (TextView) view.findViewById(R.id.news_list_item_promo_brief);

        //set custom fonts
        Typeface futuraBold =
                Typeface.createFromAsset(view.getContext().getAssets(), "fonts/futura_today_bold.ttf");
        Typeface futuraLight =
                Typeface.createFromAsset(view.getContext().getAssets(), "fonts/futura_today_light.ttf");

        holder.headline.setTypeface(futuraBold);
        holder.promoBrief.setTypeface(futuraLight);

        // store holder with the view
        view.setTag(holder);
    }
    else {
        holder = (ViewHolder) view.getTag();
    }
    holder.headline.setText(item.getHeadline());
    holder.promoBrief.setText(item.getPromoBrief());
    holder.thumbnail.setImageUrl(UrlBuilder.buildUrl(item.getImgUrl()),
            VolleySingleton.getInstance(getActivity()).getImageLoader());


    return view;
}

private class ViewHolder {
    NetworkImageView thumbnail;
    TextView headline;
    TextView promoBrief;
}

我读到的所有内容都表明这应该可以正常工作,就像调用addView并将膨胀视图附加到ViewGroup容器(LinearLayout)一样简单。我读到的一些东西建议在附加视图之前手动设置视图上的LayoutParameters,但据我所知,这没有任何效果。有什么见解吗?

共有1个答案

齐威
2023-03-14

我有了一个使用ListView的想法,即使你必须用它在上面和下面滚动内容。您可以为ListView定义页脚和页眉,这使得它像您所期望的那样显示在上方和下方。对我来说是这样的:

View headerView = inflater.inflate(R.layout.my_header_layout, null, false);
this.footer = new MyFooterView(getActivity());
this.interactionsList.addHeaderView(headerView);
this.interactionsList.addFooterView(this.footer);

很有魅力。:)

我找到了一个例子,注意上面和下面的元素,它们的行为就像在ListView:https://www.youtube.com/watch?v=pAiHQAE5G6c

 类似资料:
  • 对不起,我的英语…我会试着解释我想做什么。我有一个项目。它可以在链接上下载: < Li > https://drive . Google . com/file/d/0 bxhio ufkk 3 upcxjngtmvkg 4 tdq/view?usp =共享 正如你看到的截图: http://pixs.ru/showimage/Screenshot_9509352_15647059.png “隐藏/

  • 如何在swapCursor函数中实现回收器视图默认项添加/删除动画。notifyDataSetChanged()不会显示任何动画。

  • 我正在做一个需要VBoxes的“列表”表示的项目。我的应用程序分层布局是gridpane->VBox(在其中一个单元格中)->VBox(在彼此之上显示不同的数据集)->data。我有两个场景。 我的场景1控制器(控制器)如下所示: 这样设计是因为dataBox包含比标签更多的元素,但在本文中,这似乎与我无关。 我的场景2控制器(addDataController)如下所示: 我没有发布主类,因为加

  • 问题内容: 我正在将Facebook社交插件添加到网页中 当我手动添加时: 它起作用,但是,当javascript代码添加它时,它不起作用 有任何想法吗 ? 问题答案: 初始化文档后,JSSDK会遍历您的文档,以查找可解析为社交插件的元素。如果希望它还解析以后添加到文档中的内容,则需要调用。

  • 问题内容: 我正在尝试用Java中的TextViews创建LinearLayout,因为元素的数量是动态指定的,所以使用XML对我来说不可行。这是我的代码的一些示例: 当我启动此活动时,它不会显示此TextView,但也不会显示错误。有人有建议吗? 问题答案: 试试这个,

  • activity\u checklist\u详细信息。xml 以下是ChecklistDetail活动 但对我来说什么都不管用。如果我将activity\u checklist\u detail中的布局更改为水平或垂直,我将得到下图。 注意:我知道使用RecyclerView是最好的选择,但这里我没有很多项目。提前谢谢。