Android:动态更新子ImageButtons后不刷新GridLayout

时间:2017-12-12 08:11:33

标签: android android-gridlayout

当我在其中动态添加/删除ImageButtons时,我无法弄清楚如何让我的GridLayout在屏幕上持续更新UI。我尝试在其他答案中添加invalidate()requestLayout refreshDrawableState和可见性技巧(再次从GONE切换到VISIBLE),但是没有办法做到

以下是我的活动中的相关代码:

DataInputStream data = new DataInputStream(btSocket.getInputStream());
while (true) {
   readImage("1"); // adds one image button
   readImage("2"); // adds one image button
   readImage("3"); // adds one image button
  }
});

上面的代码在一个单独的线程中运行,该线程侦听通过BlueTooth连接发送的图像数据。 readImage调用阻塞,直到收到数据(图像以3批次发送),第一次调用清除所有现有按钮(如果有)。

readImage方法包含以下代码,用于在通过runOnUiThreadimageGridLayout.post收到图片时将ImageButtons添加到GridLayout(我尝试了两种,同样的结果)。

runOnUiThread(new Runnable() {
   @Override
   public void run() {
      Button but = new Button(this);
      // Set different images for pressed and normal states
      StateListDrawable states = new StateListDrawable();
      states.addState(new int[] { },new BitmapDrawable(getResources(), bmp));
      states.addState(new int[] {android.R.attr.state_pressed},new BitmapDrawable(getResources(), modifiedBmp));
      but.setBackground(states);
      [...] // set various layout parameters
      but.setOnClickListener(buttonlistener);
      imageGridLayout.addView(but);
   }
});

目前,每次收到批次时,只显示两个按钮,即使GridLayout确实包含三个子节点。第三个ImageButton永远不会显示在屏幕上。此外,按钮单击侦听器和状态更改不起作用。

如果我在Activity的主线程内部使用虚拟ImageButtons手动填充GridLayout,则按钮会显示并完美运行。

调用runOnUiThreadimageGridLayout.post来更改用户界面的这个要求让我感到害怕。解决方案是什么?

0 个答案:

没有答案