Android LinearLayout无法正确更新

时间:2016-05-23 18:01:40

标签: java android android-linearlayout

我遇到了我的第一个Android应用程序问题。我要做的是制作一个动态HorizontalScrollView,其内容将来自可随时间变化的列表(如范围内的设备列表或类似内容)。

问题是当列表变空时它不起作用。之后,视图显示消失前的一个项目。当项目出现在列表中时,它可以正常工作。当在列表中添加或删除元素时,将调用以下方法。

也许我错过了一些非常基本的东西。我希望列表变空时列表为空

我会很感激解决方案的一些提示(以及一些批评,如果代码是androidwise可怕的话)

    protected void updateSlideMenu() {
        HorizontalScrollView slideMenu = (HorizontalScrollView) findViewById(R.id.scrollView);
        ArrayList<String> list = new ArrayList<>();

        /* 
         * ...
         * Here's some code that gets data into list
         */
        LinearLayout ll = new LinearLayout(this);
        ll.removeAllViews();
        ll.setOrientation(LinearLayout.HORIZONTAL);
        if(slideMenu == null) {
            Log.d("slideMenu is null in", "updateSlideMenu");
            return;
        }
        slideMenu.removeAllViews();
        slideMenu.addView(ll);
        for (String str: list) {
            Button b = new Button(this);
            b.setText(str);
            b.setOnClickListener(/*...*/);
            ll.addView(b);
        }
        slideMenu.refreshDrawableState();
    }

3 个答案:

答案 0 :(得分:1)

您需要使用适配器

     Var2  Value
Var1            
A       A     34
B       B     23
C       C     77
D       Q    100
E       N    102
F       P     44
>>> 

添加按钮后,请调用此方法
ArrayAdapter<Button> buttons =new ArrayAdapter<Button> //add buttons to this variable l1.setAdaptor(buttons);

答案 1 :(得分:0)

你可以这样做:

<强> activity_main.xml中

<HorizontalScrollView
        android:id="@+id/scrollView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <LinearLayout
            android:id="@+id/llParent"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">


        </LinearLayout>

    </HorizontalScrollView>

<强> MainActivity.java

public class MainActivity extends AppCompatActivity {

    private final String TAG = MainActivity.class.getSimpleName();
    private LinearLayout llParent;
    private HorizontalScrollView slideMenu;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        slideMenu = (HorizontalScrollView) findViewById(R.id.scrollView);
        llParent = (LinearLayout) findViewById(R.id.llParent);


    }

    protected void updateSlideMenu() {

        ArrayList<String> list = new ArrayList<>();

        /*
         * ...
         * Here's some code that gets data into list
         */
        llParent.removeAllViews();
        if(slideMenu == null) {
            Log.d("slideMenu is null in", "updateSlideMenu");
            return;
        }
        for (String str: list) {
            Button b = new Button(this);
            b.setText(str);
            b.setOnClickListener(/*...*/);
            llParent.addView(b);
        }
        slideMenu.refreshDrawableState();
    }
}

在您想要更新水平滚动视图的位置调用 updateSlideMenu 方法。

希望这会对你有所帮助。

答案 2 :(得分:0)

我建议使用RecyclerView作为这类任务的优点,它使它变得非常简单。您可以在https://developer.android.com/training/material/lists-cards.html

找到有关如何使用它的信息

使用LinearLayout的方法很糟糕,因为它没有回收视图。这意味着如果你有20个项目,但你只显示5个,其余的15个将坐在那里浪费你的记忆,同时RecyclerView将重用视图并管理内存