I tried to use ViewTreeObserver in getView . But I get 0 because view is not yet formed, but only filled. I need to know the size before displaying the view to make changes. Or at least when the view already displayed on the screen, you can quickly make changes without user intervention (without pressing a button).

 @Override public View getView(final int position, View convertView, ViewGroup parent) { final ViewHolder viewHolder; if (mData.get(position).mTemplateId == DYNAMIC_CARD){ if (convertView == null) { convertView = getActivity().getLayoutInflater().inflate(R.layout.card_tipe_3, parent, false); viewHolder = new ViewHolder(); viewHolder.imageViewLogo = (ImageView) convertView.findViewById(R.id.imageViewLogoUrl_1); viewHolder.textCompanyName = (TextView) convertView.findViewById(R.id.textViewCompanyName_1); viewHolder.textFullName = (TextView) convertView.findViewById(R.id.textViewFullName_1); viewHolder.textViewJobTitle = (TextView) convertView.findViewById(R.id.textViewJobTitle_1); viewHolder.textViewDepartment = (TextView) convertView.findViewById(R.id.textViewDepartment_1); viewHolder.textViewSite = (TextView) convertView.findViewById(R.id.textViewURLSite_1); viewHolder.textViewEmail = (TextView) convertView.findViewById(R.id.textViewEmail_1); viewHolder.textViewAddress = (TextView) convertView.findViewById(R.id.textViewAdress_1); viewHolder.layout = (LinearLayout) convertView.findViewById(R.id.telephone_1); convertView.setTag(viewHolder); } else { viewHolder = (ViewHolder) convertView.getTag(); } final ArrayList<String> phones_mPrimary = new ArrayList<>(); phones_mPrimary.addAll(mData.get(position).mContact.mPrimary.getPhoneOffice()); phones_mPrimary.addAll(mData.get(position).mContact.mPrimary.getPhoneDesk()); phones_mPrimary.addAll(mData.get(position).mContact.mPrimary.getPhoneMobile()); phones_mPrimary.addAll(mData.get(position).mContact.mPrimary.getPhoneFax()); viewHolder.imageViewLogo.setImageURI(Uri.parse(mData.get(position).mContact.mPrimary.getImageUrl())); viewHolder.textCompanyName.setText(mData.get(position).mContact.mPrimary.getOrganization()); viewHolder.textFullName.setText(mData.get(position).mContact.mPrimary.getFullName()); viewHolder.textViewJobTitle.setText(mData.get(position).mContact.mPrimary.getJobTitle()); viewHolder.textViewDepartment.setText(mData.get(position).mContact.mPrimary.getDepartment()); viewHolder.textViewSite.setText(mData.get(position).mContact.mPrimary.getURL().get(0)); viewHolder.textViewEmail.setText(mData.get(position).mContact.mPrimary.getEmail().get(0)); viewHolder.textViewAddress.setText(mData.get(position).mContact.mPrimary.getAddress().get(0)); //вариант 1 viewHolder.layout.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @SuppressLint("NewApi") @SuppressWarnings("deprecation") @Override public void onGlobalLayout() { //now we can retrieve the width and height viewHolder.layout.getHeight(); Log.d("MyLog", "getViewTreeObserver(). Size: " + viewHolder.layout.getHeight()); for (int i = 0; i < phones_mPrimary.size(); i++) { TextView textView = new TextView(getActivity()); textView.setText(phones_mPrimary.get(i)); textView.setTextSize(14); viewHolder.layout.addView(textView); } } }); //вариант 2 viewHolder.layout.post(new Runnable() { @Override public void run() { viewHolder.layout.getHeight(); Log.d("MyLog", "new Runnable(). Size: " + viewHolder.layout.getHeight()); for (int i = 0; i < phones_mPrimary.size(); i++) { TextView textView = new TextView(getActivity()); textView.setText(phones_mPrimary.get(i)); textView.setTextSize(14); viewHolder.layout.addView(textView); } } }); } Log.d("MyLog", "return convertView"); return convertView; } D/MyLog: return convertView D/MyLog: getViewTreeObserver(). Size: 526 D/MyLog: getViewTreeObserver(). Size: 526 D/MyLog: new Runnable(). Size: 526 

    2 answers 2

     public View getView (int position, final View convertView, ViewGroup parent) { ... convertView.post(new Runnable(){ @Override public void run() { convertView.getHeight(); //высота convertView.getWidth(); //ширина } }); return convertView; } 

    Z. Y. He wrote on his knee, there may be minor errors.

    • I tried. On logs, getView first completes then convertView.post(new Runnable()) returns the value. I tried to getView completion of this thread in getView but the application is stuck. True, I do not convertView , but one of its daughter views - Bogdan Shulga
    • 2
      @BogdanShulga transfer the code that should work with the width and height of the View inside run(){} - Vladyslav Matviienko
    • I tried. I fill in the view textView element. When the code is inside, then the view returns empty. If you think you should work, then I will try again. But I spent the whole day yesterday with this and other options. - Bogdan Shulga
    • one
      @BogdanShulga, can you show the code? Because this approach always works for me. - Vladyslav Matviienko
    • Added code and at the end of the log. But viewHolder.layout empty on the layout. If you add the ...viewHolder.layout.addView(textView) directly into getView the layout is filled. - Bogdan Shulga

    You can advise you to use RecyclerView, there the View is reused and you only reassociate the data, and then you can carry out the manipulations you need.