Как программно обновить линейный макет

В моем приложении есть один 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();
       }
    }       
};

person naresh    schedule 06.07.2011    source источник


Ответы (3)


Получите LinearLayout, который содержит все. Когда вам нужно «обновить» его, вызовите invalidate. Однако вызывайте его только в потоке пользовательского интерфейса. Если вы вызываете его в другом потоке (скажем, таймере), то вызовите postInvalidate. Оба вызывают вызов метода View onDraw, когда ОС готова его вызвать.

person DeeV    schedule 06.07.2011
comment
я добавил мой код, пожалуйста, смотрите это. В коде LLExitDetails является основным Linear Layout. и я добавляю недействительность, но она не работает. - person naresh; 06.07.2011
comment
не освежает. означает, что он не показывает первый линейный макет, когда я вызываю недействительность. - person naresh; 06.07.2011
comment
Если проблема в том, что представления не становятся невидимыми при вызове .setVisibility(View.GONE), то уверены ли вы, что вызываются эти методы? Invalidate — это то, как вы перерисовываете представления. Еще одна вещь, которую можно попробовать, — вызвать LLExitDetails.invalidate() в конце метода onClick вне любого оператора if, чтобы убедиться, что он ВСЕГДА вызывается. Затем вы можете оптимизировать, когда у вас будет отработана логика метода. - person DeeV; 06.07.2011
comment
можно ли вызвать недействительность без потока? потому что здесь я вызываю недействительность без потока. - person naresh; 06.07.2011
comment
Как уже говорилось, недействительность всегда должна вызываться в потоке пользовательского интерфейса (что вы и делаете), так что не беспокойтесь об этом. - person DeeV; 06.07.2011
comment
я помещаю недействительный конец onclick, но он не работает - person naresh; 06.07.2011

Я тоже потратил много времени на решение этой проблемы. И я нашел простой метод обновления 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);
person Николай Сколунов    schedule 20.03.2015

Чтобы обновить представление в графическом виде, используйте аннулирование его вызова onDraw(), а для пересчета размеров представления и любых вещей, связанных с высотой, шириной, полями и отступами, используйте requestLayout, это вызов onMeasure()

person Mohamed Moamen    schedule 21.08.2017