【问题标题】:How to refresh the linear layout programmatically如何以编程方式刷新线性布局
【发布时间】:2011-07-06 12:39:00
【问题描述】:

我的应用程序有一个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();
       }
    }       
};

【问题讨论】:

    标签: android android-linearlayout


    【解决方案1】:

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

    【讨论】:

    • 我添加了我的代码,请看。在代码中“LLExitDetails”是主要的线性布局。我添加了无效但它不起作用。
    • 不刷新。意味着当我调用无效时它不显示第一个线性布局。
    • 如果问题是当您调用 .setVisibility(View.GONE) 时视图不会变得不可见,那么您确定正在调用这些方法吗? Invalidate 是您重绘视图的方式。要尝试的另一件事是在任何 if 语句之外的“onClick”方法的末尾调用 LLExitDetails.invalidate() 以确保它总是被调用。然后,当您制定出方法的逻辑时,您可以进行优化。
    • 是否可以在没有线程的情况下调用无效?因为在这里我调用了没有线程的无效。
    • 我将 onclick 的无效结束,但它不起作用
    【解决方案2】:

    我也花了很多时间来解决这个问题。 而且我发现了一个简单的方法,用3行代码刷新LinearLayout

    您必须在 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);
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:
        linearLayout.removeAllViews();
        //The again load the linearlayout view
        runLinearLayout();
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-12-25
          • 2019-07-30
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多