Android - addView()在removeAllViews()之后不起作用

时间:2013-12-27 21:40:37

标签: java android

我在ScrollView内的另一个LinearLayout中有一个LinearLayout ll


<ScrollView
    android:layout_width="270px"
    android:layout_height="fill_parent" >
    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:gravity="center_horizontal"
        android:orientation="vertical" >
        <LinearLayout
            android:id="@+id/gifcreator_thumbs"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:gravity="center_horizontal"
            android:orientation="vertical" />
        <Button
            android:id="@+id/gifcreator_add"
            android:layout_width="250px"
            android:layout_height="125px"
            android:layout_margin="10px"
            android:textColor="#000000"
            android:text="Добавить кадр" />
    </LinearLayout>
</ScrollView>

onCreate我正在运行update_frames()方法:


public void update_frames(String a)
{
    Log.e("EmSy", "Updating Frame @ " + a);
    try
    {
        File f = new File(a);
        tag = ll.getChildCount();
        View v = getLayoutInflater().inflate(R.layout.gifcreator_item, null);
        v.setTag(tag);
        v.setOnLongClickListener(new OnLongClickListener() { 
                public boolean onLongClick(View v)
                {
                    delete_frame(Integer.parseInt(v.getTag().toString()));
                    return true;
                }
            });

        ImageView thumb = (ImageView)v.findViewById(R.id.gircreator_item_thumb);
        TextView desc = (TextView)v.findViewById(R.id.gifcreator_item_desc);

        Bitmap t = BitmapFactory.decodeFile(a);
        Bitmap t2 = Bitmap.createScaledBitmap(t, 110, 110, false);
        thumb.setImageBitmap(t2);

        desc.setText("Кадр №" + tag);

        data.add(new GIFFrame(t, 42, a));

        ll.addView(v);
    }
    catch (Exception e)
    {
        Toast.makeText(this, e.toString(), Toast.LENGTH_LONG).show();
        e.printStackTrace();
    }
}

以下是delete_frame方法:


public void delete_frame(int tag_for_deleting)
{
    try
    {
        ll.removeAllViews();
        data.remove(tag_for_deleting);
        temp_data = data;
        data.clear();

        for (GIFFrame gf : temp_data)
        {
            update_frames(gf.p);
            frames.notify();
        }

        temp_data.clear();
    }
    catch (Exception e)
    {
        Toast.makeText(this, e.toString(), Toast.LENGTH_LONG).show();
        e.printStackTrace();
    }
}

因此,在执行delete_view方法之前,所有视图都已添加,但在执行该方法后,视图不会添加到ll。我的代码在ll.addView(v)行停止,所以我在LogCat中有文件的路径:


`ru.mso.gb - EmSy - Updating Frame @ /sdcard/pic.png`

为什么它不起作用?

2 个答案:

答案 0 :(得分:0)

在你的代码中,当你长视图时,主要的想法是删除视图,虽然你似乎删除了所有视图,delete_frame(int tag_for_deleting)应删除一个视图,而不是所有视图,如此行所做的ll.removeAllViews();

获取视图的索引,然后执行此操作

ll.removeViewAt(index)

编辑: 再次阅读您的代码后,看起来当您要删除1行时,删除所有内容并从头开始构建布局,这是BAD,非常糟糕,而是删除要删除的一个视图我在上面发布的一行,并从arraylist中删除了一个信息,就是它

答案 1 :(得分:0)

这里的问题

temp_data = data;
data.clear();

您只需添加对数据的新引用,然后将其清除。这意味着循环中的代码永远不会运行。

您可以执行以下操作 替换

temp_data = data;

使用

temp_data = new ArrayList<your type here>(data)