在arrayadapter中堆叠framelayout顶部的视图

时间:2014-10-29 14:05:28

标签: android stack listadapter android-framelayout

我有一个arrayadapter,它显示从服务器获取的位图数组。屏幕上最多可以同时显示四个位图,列表使用通常的"持有者循环播放#34;图案。位图包含在对象中,其中一个属性是日期 - 如果位图对象的日期大于X,我希望能够在列表中的特定位图上放置一个图层,其中包含单词&# 34;新"透明度为50%。

为此,我在现有的位图布局中添加了一个framelayout,并对此执行了一个addView,添加了" new" layer(在一个单独的布局文件中),我在位图对象上更改一个布尔标志,以表明我将其标记为" new"在某一点。如果位图是旧的,我看到它被标记为" new"在过去的某个时刻,我将标志更改为旧并删除新图层。

问题在于,当我循环浏览列表并遇到一个应该是" new"它显示正确,但是当我循环返回列表并返回时,列表逐渐中毒,以便最终所有位图显示为" new"。此外,"新"的背景图层开始时为50%透明,在列表上下几次移动后,它们都是黑色的 - 表示它正在添加" new"一遍又一遍地覆盖每个位图的列表。为了使这个解释更清楚 - 这是相关的代码:

" new"的布局文件图层(R.layout.new_over_layer):

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/half_transparent"
android:gravity="top|center_horizontal"
>

<ImageView
    android:layout_width="wrap_content"
    android:layout_height="100dp"
    android:src="@drawable/new_icon"
    android:background="@color/transparent"
    />

每个位图的布局文件

<?xml version="1.0" encoding="utf-8"?>

<FrameLayout
android:id="@+id/newlistview_framelayout"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/white"
android:foregroundGravity="top|center_horizontal"
>

<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="180dp"
android:layout_marginBottom="4dp"
android:background="@color/white" >



<ImageView
    android:id="@+id/some_bitmap"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_gravity="center"
    android:layout_marginBottom="4dp"
    android:contentDescription="@string/some_bitmap_desc"
    android:scaleType="fitXY"
    android:src="@color/black" />

</RelativeLayout> </FrameLayout>

适配器的相关代码部分

public class myCustomAdapter extends ArrayAdapter<BitmapObject>
{
public View getView(final int position, View convertView, ViewGroup parent) {
    ViewHolder holder;
    View currentView = convertView;

    LayoutInflater inflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
    View newBitmapLayer = inflater.inflate(R.layout.new_over_layer,parent,false);

    getCurrentTime();

    if (isBitmapNew(bitmapList.get(position))) { 

        if (!bitmapList.get(position).getNew()) {
            bitmapList.get(position).setNew(true);
            ((FrameLayout)     currentView.findViewById(R.id.newlistiview_framelayout)).addView(newBitmapLayer);
        }
    } else { 

        if (bitmapList.get(position).getNew()) { //check if marked new before and reset to old
            bitmapList.get(position).setNew(false);
            ((FrameLayout)     currentView.findViewById(R.id.newlistiview_framelayout)).removeView(newBitmapLayer);
        }
    }

    if (null == currentView) {

        currentView = inflater.inflate(R.layout.new_listiview_item, parent, false);

        holder = new ViewHolder();
        holder.bitmapName = (TextView) currentView.findViewById(R.id.bitmap_name);
        currentView.setTag(holder);

    } else {
        holder = (ViewHolder) currentView.getTag();
    }

....
}

那么..当我向上和向下滚动时,为什么列表会自动中毒?如何更改代码以使其正常运行并且只添加&#34; new&#34;一次到每个需要标记为新的位图?

1 个答案:

答案 0 :(得分:1)

通过完全改变这样做的方式解决..而不是尝试从列表中添加和删除图层,我创建了透明&#34; new&#34;作为framelayout中的永久子层。然后,每当位图是新的时,我都会使用带有孩子的东西来对待新的&#34;图层,每当位图不是新的时候,我就会在位图图层上使用带有孩子的东西(它具有100%的不透明度,因此会隐藏&#34;新的&#34;图层)。

        if (isBitmapNew(bitmapList.get(position))) { 

        ((FrameLayout) currentView.findViewById(R.id.newlistiview_framelayout)).bringChildToFront(currentView.findViewById(R.id.bitmap_new));

    } else {

        ((FrameLayout) currentView.findViewById(R.id.newlistiview_framelayout)).bringChildToFront(currentView.findViewById(R.id.bitmap_old));
    }

因为我从不添加或删除图层,所以列表工作得更快,而且不会中毒。