2015-04-20 5 views
0

У меня есть вид списка (для отображения элементов, выбранных внутри корзины), которые должны отображать элементы, которые добавляются во время выполнения. Когда я устанавливаю высоту списка в wrap_content, он отображает только первый элемент. Это представление списка находится в прокрутке с некоторыми другими виджетами, такими как кнопки. Невозможно удалить ошибки ant при получении значений, так как при изменении высоты до 500dp он отображает все элементы правильно. Как я могу указать высоту в виде списка без использования wrap_content, так как она не работает согласно моему требованию? Благодарю.Дисплей Набор элементов в виде списка

+1

«Этот вид списка находится внутри прокрутки», вероятно, это вопрос –

+0

Вы знаете высоту одного элемента списка? Вы знаете, сколько у вас есть? Просто умножьте их и установите высоту списка для этого числа. Вам нужно статическое значение, если у вас есть listview внутри scrollview. –

+0

можете ли вы разместить свой макет .xml? – Raghavendra

ответ

0

Что вам не хватает, это освежает вид.

После внесения любых изменений в содержимое необходимо внести View.requestLayout(). Это вынуждает просмотр перерисовывать и отображает все элементы, которые вы добавили.

Вы можете сделать это в своем адаптере ListView, если используете пользовательский адаптер (добавьте его в метод getView (..)).

Или вы можете сделать это, как только элемент будет добавлен в адаптер.

EDIT: Для вашей ситуации, возможно, вы не хотите, чтобы прокрутка отображала весь экран. Для этого установите границы макета для прокрутки и установите listview на wrap_content. Это должно предоставить вам прокручиваемый макет в области, которая вы назначаете. Если вам нужна более конкретная помощь, предоставьте соответствующий код.

0

Я не уверен, попробуйте следующее: измените свойство @android:layout_below="".

<ScrollView 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:id="@+id/scrollView2" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentStart="true" > 


<LinearLayout 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" 
    android:weightSum="1"> 

    <ImageView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/imageView" 
     android:src="@drawable/ic_launcher" 
     android:layout_centerHorizontal="true" 
     android:layout_gravity="center_horizontal" /> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textAppearance="?android:attr/textAppearanceLarge" 
     android:text="Items Selected" 
     android:id="@+id/textView2" 
     android:layout_gravity="center_horizontal" 
     android:layout_below="@+id/imageView" 
     android:layout_alignLeft="@+id/imageView" 
     android:layout_alignStart="@+id/imageView" 
     android:textColor="#ffff6b30" 
     android:textStyle="bold" /> 

    <ListView 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:id="@+id/carList" 
     android:layout_below="@+id/textView2" 
     android:layout_gravity="bottom" 
     android:fastScrollEnabled="false" 
     android:smoothScrollbar="false" 
     android:scrollingCache="false" /> 

    <Button 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:text="Calculate Bill" 
     android:id="@+id/button2" 
     android:layout_gravity="right" 
     android:textColor="#fffff536" 
     android:background="#ffff6714" 
     android:layout_marginTop="30dp" 
     android:layout_below="@+id/carList" 
     android:layout_centerHorizontal="true" 
     android:focusableInTouchMode="false" /> 

    <Button 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:text="Delete Item" 
     android:id="@+id/button11" 
     android:textColor="#fffff536" 
     android:background="#ffff6714" 
     android:layout_below="@+id/button2" 
     android:layout_centerHorizontal="true" 
     android:layout_marginTop="30dp"/> 

    <Button 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:text="Refresh Cart" 
     android:id="@+id/button12" 
     android:textColor="#fffff536" 
     android:background="#ffff6714" 
     android:layout_below="@+id/button11" 
     android:layout_centerHorizontal="true" 
     android:layout_marginTop="30dp" 
     android:onClick="refreshButtonClick" /> 

    <Button 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:text="Back to Main Menu" 
     android:id="@+id/button13" 
     android:textColor="#fffff536" 
     android:background="#ffff6714" 
     android:layout_below="@+id/button12" 
     android:layout_centerHorizontal="true" 
     android:layout_marginTop="30dp" 
     android:onClick="bakToMainButtonClick" /> 

</LinearLayout> 

+0

Я удалил его, но все равно никаких изменений. – user3406362

0

не рекомендуется, но можно поставить ListView в ScrollView. Если вы вставляете ListView в ScrollView, он сломает прикосновение. Они будут вести себя странно, это просто не сработает. Если вы хотите иметь прокручиваемый ListView в ScrollView, например. чтобы показать некоторый контент ниже ListView или поддерживать небольшие экраны (подумайте, BlackBerry ...), это может быть для вас решением. ListView в ScrollView, как прокручиваемый. Кроме того, решение ниже является взломанным. Не обвиняйте меня, если это нарушает ваши настройки.
Отказ от ответственности: это решение сочетается с различными сообщениями SO + с некоторыми настройками. У меня больше нет источников.

Сделать прокруткуПросмотреть свой элемент head в вашем xml и вставить в него относительную компоновку и вставить в нее ListView. Сделайте ScrollView match_parent и ListView wrap_content. Прикосновения будет сломано, так что вы должны использовать этот специальный Scrollview (новый класс в новом файле):

public class ScrollViewExt extends ScrollView { 
    private ScrollViewListener scrollViewListener = null; 
    public ScrollViewExt(Context context) { 
     super(context); 
    } 

    public ScrollViewExt(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
    } 

    public ScrollViewExt(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public void setScrollViewListener(ScrollViewListener scrollViewListener) { 
     this.scrollViewListener = scrollViewListener; 
    } 

    @Override 
    protected void onScrollChanged(int l, int t, int oldl, int oldt) { 
     super.onScrollChanged(l, t, oldl, oldt); 
     if (scrollViewListener != null) { 
      scrollViewListener.onScrollChanged(this, l, t, oldl, oldt); 
     } 
    } 
} 

Вы видели меня с помощью ScrollViewListener, сделать интерфейс с этим именем, и пусть ваша активность или фрагмент реализации он (также новый файл, на этот раз интерфейс):

public interface ScrollViewListener 
{ 
    void onScrollChanged(ScrollViewExt scrollView, 
     int x, int y, int oldx, int oldy); 
} 

Далее вы должны реализовать скроллинг самостоятельно в вашей деятельности или фрагмента, который использует макет. Чтобы реализовать прокрутку, вам нужно знать, насколько велик ваш контент (ListView + другой материал), например. с помощью фонового изображения:

//get the size of the image 
    int bitmapWidth = yourBitmapWidth; 
    int bitmapHeight = yourBitmapHeight; 

    // set maximum scroll amount (based on center of image) 
    int maxX = (int)((bitmapWidth/2) - (displayWidth/2)); 
    int maxY = (int)((bitmapHeight/2) - (displayHeight/2)); 


    // set scroll limits 
    final int maxLeft = (maxX * -1); 
    final int maxRight = maxX; 
    final int maxTop = (maxY * -1); 
    final int maxBottom = maxY; 

Это где RelativeLayout приходит в использовании: Вы будете использовать его в качестве поддельного ScrollView, установив TouchListener к нему.

yourRelativeLayout.setOnTouchListener(new View.OnTouchListener() 
    { 
     float downX, downY; 
     int totalX, totalY; 
     int scrollByX, scrollByY; 
     @Override 
     public boolean onTouch(View view, MotionEvent event) 
     { 

      if(hasToScroll) 
      { 

      float currentX, currentY; 
      switch (event.getAction()) 
      { 
       case MotionEvent.ACTION_DOWN: 
        downX = event.getX(); 
        downY = event.getY(); 
        break; 

       case MotionEvent.ACTION_MOVE: 
        currentX = event.getX(); 
        currentY = event.getY(); 
        scrollByX = (int)(downX - currentX); 
        scrollByY = (int)(downY - currentY); 

        if (currentY > downY) 
        { 
         if (totalY == maxTop) 
         { 
          scrollByY = 0; 
         } 
         if (totalY > maxTop) 
         { 
          totalY = totalY + scrollByY; 
         } 
         if (totalY < maxTop) 
         { 
          scrollByY = maxTop - (totalY - scrollByY); 
          totalY = maxTop; 
         } 
        } 

        if (currentY < downY) 
        { 
         if (totalY == maxBottom) 
         { 
          scrollByY = 0; 
         } 
         if (totalY < maxBottom) 
         { 
          totalY = totalY + scrollByY; 
         } 
         if (totalY > maxBottom) 
         { 
          scrollByY = maxBottom - (totalY - scrollByY); 
          totalY = maxBottom; 
         } 
        } 

        yourRelativeLayout.scrollBy(0, scrollByY); 
        downX = currentX; 
        downY = currentY; 
        break; 

      } 

      return true; 

      } 
      else 
      { 
       return false; 
      } 
     } 

    }); 

Еще не сделано. Нам нужно определить, когда разрешено прокручивать представление.

@Override 
public void onScrollChanged(ScrollViewExt scrollView, int x, int y, int oldx, int oldy) { 
    // We take the last son in the scrollview 
    View view = (View) scrollView.getChildAt(scrollView.getChildCount() - 1); 
    int diff = (view.getBottom() - (scrollView.getHeight() + scrollView.getScrollY())); 

    // if diff is zero, then the bottom has been reached 
    if (diff == 0) { 
     isBottom = true; 
     isTop = false; 

    } 
    else if(scrollView.getScrollY() < 10) 
    { 
     isBottom = false; 
     isTop = true; 

    } 
    else 
    { 
     isBottom = false; 
     isTop = false; 

    } 
} 

public void scrollViewIsAllowedToScroll(Boolean isAllowed) 
{ 
    scrollView.requestDisallowInterceptTouchEvent(!isAllowed); 
} 

Если установили ваш ListView глобальный, потому что вы должны реализовать ее прокруткой вручную, тоже:

public void addOnTouchListenerToListView() 
{  

    try{ 
    if((listView.getChildAt(listView.getChildCount() - 1).getBottom()) > listView.getHeight()) 
    { 
     listView.setOnTouchListener(new ListView.OnTouchListener() { 
      @SuppressLint("NewApi") 
      @Override 
      public boolean onTouch(View v, MotionEvent event) { 

       Boolean alldown = false; 
       Boolean allup = false; 

       if (listView.getLastVisiblePosition() == listView.getAdapter().getCount() -1 && listView.getChildAt(listView.getChildCount() - 1).getBottom() <= listView.getHeight()) 
       { 
        //The list is scrolled all the way down here 
        alldown = true; 
        alldown = false; 
       } 
       else if (listView.getFirstVisiblePosition() == 0 && listView.getChildAt(0).getTop() >= 0) 
       { 
        //The list is scrolled all the way up here 
        allup = true; 
        alldown = false; 
       } 
       else 
       { 
        // The list is scrolled anywhere between top and bottom 
        allup = false; 
        alldown = false; 
       } 

       // filter different touch events 
       switch (event.getAction()) { 
        case MotionEvent.ACTION_DOWN: 
        { 
         // save the position where list was touched first 
         downXValue = event.getX(); 
         downYValue = event.getY(); 

         v.onTouchEvent(event); 
         return true; 
        } 

        case MotionEvent.ACTION_UP: 
        {      
         v.onTouchEvent(event); 
         return false; 
        } 

        case MotionEvent.ACTION_MOVE: 
        { 

         // get the current position of the touch 
         float currentY = event.getY(); 

         // if the current touch position is smaller than the first touch, the touch (finger) has moved down, so the list has to scroll up 
         if (downYValue < currentY) { 
          direction = Constants.kDirectionDown; 
         } 
         // if the current touch position is bigger than the first touch, the touch (finger) has moved up, so the list has to scroll down 
         else if (downYValue > currentY) 
         { 
          direction = Constants.kDirectionUp; 
         } 

         // cases to figure out when the scrollView is allowed to scroll instead of the list 
         if(isTop && allup) 
         { 
          scrollViewIsAllowedToScroll(true); 
         } 
         else if(isBottom && allup) 
         { 
          if(direction == Constants.kDirectionDown) 
          { 
           scrollViewIsAllowedToScroll(true); 
          } 
          else if(direction == Constants.kDirectionUp) 
          { 
           scrollViewIsAllowedToScroll(false); 
          } 
         } 
         else if(isBottom && alldown) 
         { 
          scrollViewIsAllowedToScroll(false); 
         } 
         else if (!allup && !alldown) 
         { 
          scrollViewIsAllowedToScroll(false); 
         } 
         else if (isBottom) 
         { 
          scrollViewIsAllowedToScroll(false); 
         } 


         v.onTouchEvent(event); 
         return true; 
        } 

        case MotionEvent.ACTION_CANCEL: 
        { 
         v.onTouchEvent(event); 
         return false; 
        } 

        default: 
        { 
         v.onTouchEvent(event); 
         return false; 
        } 
       } 
      } 
     }); 
    } 
    else 
    { 
     scrollViewIsAllowedToScroll(true); 
    } 
    }catch(Exception e) 
    { 
     e.printStackTrace(); 
    } 
} 

Итак, это так. Я не знаю, было ли это то, что вы хотели, но это мне очень помогло.

Редактировать: almoust забыли об этом: Вам нужно вызвать addOnTouchListenerToListView один раз, но только после ожидания короткого периода времени, так как ваш listView не будет заполнен немедленно. Также вы можете вызвать это только один раз, так как после этого ListView все еще установлен.

@Override 
public void onResume(){ 
    super.onResume(); 
    adjustScrolling(); 
} 

public void adjustScrolling() 
{ 

     handler = new Handler(); 
     runnable = null; 
     runnable = new Runnable() { 
       @Override 
       public void run() { 
        if(listView.getHeight() > 0) 
        { 
         firstStart = false; 
         handler.removeCallbacks(runnable); 
         addOnTouchListenerToListView(); 
        } 
        else 
        { 
         handler.postDelayed(this, 500); 
        } 
       } 
      }; 
     handler.postDelayed(runnable, 0); 

} 
Смежные вопросы