如何通过编程刷新线性布局

6
我的应用程序有一个LinearLayout,该LinearLayout由3个Linearlayouts组成,每个线性布局都有一个Relativelayout和一个线性布局(最初这些线性布局的可见性是隐藏的)。如果单击相对布局,则会显示相关的线性布局。但是,如何在单击相对布局后刷新整个线性布局。
代码:
private OnClickListener exit2Listener = new OnClickListener()
{
    public void onClick(View v)
    {
       if(!exit2status)
       {
          if(RB_Constant.upcomingexits_obj.response.size() > 1)
          {
             if(RB_Constant.upcomingexits_obj.response.get(1).listRestaurants.size() > 0)
             {
                 // Create the views on the fly instead of using the ListView
                 UpcomingResultsListViewAdapter2 rbupcadapter2 = new UpcomingResultsListViewAdapter2(RB_UpcomingExits.this);
                 int numItems2 = 0;

                 if(RB_Constant.upcomingexits_obj.response.get(1).listRestaurants.size() > 0)
                 {
                    numItems2 = RB_Constant.upcomingexits_obj.response.get(1).listRestaurants.size();
                 }

                 //linearLayout2
                 for(int position=0; position < numItems2; position++)
                 {
                    View convertview = null;
                    convertview = rbupcadapter2.getView(position, convertview, null);
                    listLayout2.addView(convertview);
                 }
             }              
          }
          else
          {
             //toastMsg("No results!");
          }
          listLayout2.setVisibility(View.VISIBLE);
          exit2status=true;

          if(!exit1status || exit3status || exit4status || exit5status)
          {
             //System.out.println("exit2 GONE");
             listLayout1.setVisibility(View.GONE);
             listLayout3.setVisibility(View.GONE);
             exit1status = false;
             exit3status = false;

          }

          LLExitDetails.invalidate();
       }
       else
       {
          System.out.println("exit2 GONE");
          listLayout2.setVisibility(View.GONE);
          exit2status = false;

          LLExitDetails.invalidate();
       }
    }       
};
4个回答

7

获取包含所有内容的LinearLayout。当您需要“刷新”它时,请调用invalidate。但是只能在UI线程中调用它。如果您在另一个线程(例如计时器)中调用它,则调用postInvalidate。两者都会在操作系统准备好调用它时调用View的onDraw方法。


我添加了我的代码,请查看。在代码中,“LLExitDetails”是主线性布局。我添加了invalidate但它没有起作用。 - naresh
未刷新。这意味着当我调用invalidate时,它不会显示第一个线性布局。 - naresh
如果问题是当您调用.setVisibility(View.GONE)时视图不会变为不可见,那么您确定这些方法被调用了吗?Invalidate是重绘视图的方法。另一个尝试的方法是在“onClick”方法的结尾处调用LLExitDetails.invalidate(),在任何if语句之外,以确保它始终被调用。然后,当您解决方法的逻辑时,可以进行优化。 - DeeV
在没有线程的情况下调用invalidate是否可能?因为我正在调用invalidate而没有使用线程。 - naresh
如上所述,invalidate 应该始终在 UI 线程中调用(你正在这样做),所以不用担心。 - DeeV
2
我把invalidate放在onclick的结尾,但它没有起作用。 - naresh

1
我也花了很多时间解决这个问题。 我找到了一个刷新LinearLayout的简单方法,只需要3行代码。
你必须在style.xml中设置透明颜色。
   <color name="transparent">#00000000</color>

在代码中调用设置背景。
   LinearLayout ll = (LinearLayout) findViewById(R.id.noteList);
   ll.setBackgroundColor(getResources().getColor(R.color.transparent));
   ll.invalidate();

如果您有可绘制的背景,请调用:
  ll.setBackgroundResource(R.drawable.your_drawable);

0

如果要以图形方式刷新视图,请使用invalidate()方法并调用onDraw()。如果要重新计算视图的尺寸以及与高度、宽度、边距和填充相关的任何内容,请使用requestLayout()方法并调用onMeasure()。


-2
linearLayout.removeAllViews();
//The again load the linearlayout view
runLinearLayout();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接