卡片视图里面的饼图在android中不可见

时间:2014-11-28 07:01:18

标签: android xml android-layout charts

我正在尝试在卡片视图中创建一个饼图。使用 achartEngine-1.1 在上午创建一个饼图。我正在使用卡片视图bcz我想在列表视图中的图表数量。 我设计了一个XML文件名dashboard_graph_view,其中包含线性布局和文本视图,用于图表的标题。并创建了一个相对布局,我在其中放置饼图。但是当我运行代码饼图时没有创建。但是当尝试在同一个内部创建文本视图时它是可见的。我试图谷歌但没有找到任何有用的东西。 这是getview的代码。

public View getView(int arg0, View v, ViewGroup arg2) {
    // TODO Auto-generated method stub
    if(v==null)
        v = inflater.inflate(R.layout.dashboard_graph_view, null);

    TextView txt1 = (TextView) v.findViewById(R.id.tittle);
    txt1.setText(port_list.get(arg0).get("portlet_title"));
    // Pie Chart Section Names
    String[] code = new String[] {
            "Eclair & Older", "Froyo", "Gingerbread", "Honeycomb",
            "IceCream Sandwich", "Jelly Bean"
    };

    // Pie Chart Section Value
    double[] distribution = { 3.9, 12.9, 55.8, 1.9, 23.7, 1.8 } ;

    // Color of each Pie Chart Sections
    int[] colors = { Color.BLUE, Color.MAGENTA, Color.GREEN, Color.CYAN, Color.RED,
            Color.YELLOW };

    // Instantiating CategorySeries to plot Pie Chart
    CategorySeries distributionSeries = new CategorySeries(" Android version distribution as on October 1, 2012");
    for(int i=0 ;i < distribution.length;i++){
        // Adding a slice with its values and name to the Pie Chart
        distributionSeries.add(code[i], distribution[i]);
    }

    // Instantiating a renderer for the Pie Chart
    DefaultRenderer defaultRenderer  = new DefaultRenderer();
    for(int i = 0 ;i<distribution.length;i++){
        SimpleSeriesRenderer seriesRenderer = new SimpleSeriesRenderer();
        seriesRenderer.setColor(colors[i]);
        seriesRenderer.setDisplayChartValues(true);
        // Adding a renderer for a slice
        defaultRenderer.addSeriesRenderer(seriesRenderer);
    }

    defaultRenderer.setChartTitle("Android version distribution as on October 1, 2012 ");
    defaultRenderer.setChartTitleTextSize(20);
    defaultRenderer.setZoomButtonsVisible(true);
    GraphicalView graph_view = ChartFactory.getPieChartView(app.getApplicationContext(), distributionSeries, defaultRenderer);
    // Creating an intent to plot bar chart using dataset and multipleRenderer
    //        Bundle intent = ChartFactory.getPieChartIntent(app.getBaseContext(), distributionSeries , defaultRenderer, "AChartEnginePieChartDemo");
    RelativeLayout l1 = (RelativeLayout) v.findViewById(R.id.graph_view);

    l1.addView(graph_view,new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
    // Start Activity

    graph_view.repaint();
    l1.refreshDrawableState();

    return v;
}

这是xml文件。

 <?xml version="1.0" encoding="utf-8"?>
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/feed_bg"
android:layout_marginBottom="-9dp"
android:orientation="vertical" >

<LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_marginLeft="@dimen/feed_item_margin"
    android:layout_marginRight="@dimen/feed_item_margin"
    android:layout_marginTop="@dimen/feed_item_margin"
    android:background="@drawable/bg_parent_rounded_corner"
    android:orientation="vertical"
    android:paddingBottom="@dimen/feed_item_padding_top_bottom"
    android:paddingTop="@dimen/feed_item_padding_top_bottom" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:paddingLeft="@dimen/feed_item_padding_left_right"
        android:paddingRight="@dimen/feed_item_padding_left_right" >

        <TextView
            android:id="@+id/tittle"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:textColor="#FF000000"
            android:textSize="@dimen/feed_item_profile_name"
            android:textStyle="bold" />
    </LinearLayout>

    <RelativeLayout
        android:id="@+id/graph_view"
        android:layout_width="fill_parent"
        android:layout_height="match_parent"
        android:layout_weight="0.91"
        android:orientation="horizontal"
        android:paddingLeft="@dimen/feed_item_padding_left_right"
        android:paddingRight="@dimen/feed_item_padding_left_right" >
    </RelativeLayout>
  </LinearLayout>

  </LinearLayout>

提前致谢。

1 个答案:

答案 0 :(得分:1)

它是否为标题下面的饼图留出空间,或者卡片中是否有标题并且没有空格?如果是这样,那么问题就是Android并不认为graph_view不需要任何垂直空间,所以它不会让你失望。我知道你在视图层次结构中使用了match_parent,但是ListView仍然可以计算出它的列表项真正需要多少垂直空间,并且只给它们那么大的空间。

你有可能在列表中使用固定高度的饼图吗?当然是在逢低中。

修改

回答评论中的问题:当您在列表中向上和向下滚动时,ListView会反复调用getView。目前,您每次都在调用addView,这意味着您每次都要添加一个新图表。一个简单的解决方案是每次删除上一个图表:

RelativeLayout l1 = (RelativeLayout) v.findViewById(R.id.graph_view);
if (l1.getChildCount() > 0) {
    l1.removeAllViews();
}
l1.addView(graph_view,new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));

对于这种情况,当你想要在列表中显示不同的东西时,更好的解决方案是创建一个&#34;视图类型&#34;你的清单的概念。您可以在适配器中执行此操作:

private static final int TYPE_PIE = 0;
private static final int TYPE_BAR = 1;

@Override
public int getViewTypeCount() {
    return 2;
}

@Override
public int getItemViewType(int position) {
    MyPortClass port = port_list.get(position);
    if (port.shouldShowPie()) {
        return TYPE_PIE;
    } else {
        return TYPE_BAR;
    }
}

接下来,您应该创建两个版本的XML文件,一个在布局中已经有饼图,另一个带有条形图。然后在你的getView方法中:

public View getView(int position, View v, ViewGroup arg2) {
    MyPortClass port = port_list.get(position);

    if (v == null) {
        if (getViewType(position) == TYPE_PIE) {
            v = inflater.inflate(R.layout.dashboard_pie_view, null);
        } else {
            v = inflater.inflate(R.layout.dashboard_bar_view, null);
        }
    }
    ...

这是一个更好的解决方案,但如果ChartFactory不支持配置现有的图表视图,您可能无法使用它。目前您只显示ChartFactory.getPieChartView,但可能有一个ChartFactory方法接受现有视图,并允许您使用渲染器重建视图。如果没有,那么上面的简单解决方案应该可以正常工作。