【问题标题】:Android LinearLayout doesn't update properlyAndroid LinearLayout 无法正确更新
【发布时间】:2016-05-24 04:14:05
【问题描述】:

我在使用我的第一个 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();
    }

【问题讨论】:

    标签: java android android-linearlayout


    【解决方案1】:

    你需要使用适配器

    ArrayAdapter<Button> buttons =new ArrayAdapter<Button>
    //add buttons to this variable
    l1.setAdaptor(buttons);
    

    添加按钮后调用此方法
    buttons.notifyDatasethasChanged()

    【讨论】:

      【解决方案2】:

      你可以这样做:

      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 方法。

      希望这会对你有所帮助。

      【讨论】:

        【解决方案3】:

        我建议使用RecyclerView,因为它非常适合此类任务,并且非常简单。你可以在这里找到有关如何使用它的信息https://developer.android.com/training/material/lists-cards.html

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-11-03
          • 1970-01-01
          • 2018-01-08
          • 1970-01-01
          • 2023-01-05
          相关资源
          最近更新 更多