2013-07-09 2 views
0

Я пытаюсь отправить данные в виде списка при нажатии кнопки.Определение отображаемой записи - listview

Однако мой список показывает 2 строки сразу по одной полной строке и одной частичной строке. Есть ли способ, который я могу определить, какая строка показывает частичную и которая отображается полностью.

Я могу получить только тот индекс. есть ли другой подход?

@Override 
public void onScrollStateChanged(AbsListView view, int scrollState) { 


    if (scrollState == SCROLL_STATE_IDLE){ 
     Rect r = new Rect(); 
     View child = recordListview.getChildAt(view.getFirstVisiblePosition()); // first visible child 
     if (child == null) 
      return; 
     double height = child.getHeight() * 1.0; 

     recordListview.getChildVisibleRect (child, r, null); 
     Log.d("Visible1 ", view.getFirstVisiblePosition() + " " + height + " " + r.height() ); 

     if (Math.abs (r.height()) < height/2.0) { 
        // show next child 
      recordListview.smoothScrollToPosition(view.getFirstVisiblePosition()+1); 
      Log.d("Visible1 Location", view.getFirstVisiblePosition() +1+ ""); 
     } 

     else { 
      recordListview.smoothScrollToPosition(view.getFirstVisiblePosition()); 
      Log.d("Visible1 Location", view.getFirstVisiblePosition()+ ""); 
     } 

    } 
} 
}); 
+0

Have Вы пытались getChildVisibleRect()? – sandrstar

+0

@sandrstar Я обновил свой код на примере, показанном на http://stackoverflow.com/questions/15338509/android-listview-stop-scrolling-at-whole-row-position. Это приводит к тому, что мой список больше не прокручивается. – sean

+0

Вызывается onScroll()? Я думаю, вам нужно использовать onScrollStateChanged(), обнаружить SCROLL_STATE_IDLE, а затем выполнить свою логику. – sandrstar

ответ

2

Похоже, вы неправильно понимали документацию getChildVisibleRect().

Он упоминает:

г Входной прямоугольник, определенный в системе координат ребенка. Будет перезаписаны содержать полученный видимый прямоугольник, выраженный в глобальной (корень) координаты

Так что, если вы предоставляете пустой прямоугольник у ребенка координат, то он может быть переведен только в пустой видимый rectagle , правильно?

Для меня этот код, кажется, работает:

recordListview.setOnScrollListener(new AbsListView.OnScrollListener() { 
    @Override 
    public void onScrollStateChanged(final AbsListView view, final int scrollState) { 
     if (scrollState == SCROLL_STATE_IDLE) { 
      final View child = recordListview.getChildAt(view.getFirstVisiblePosition()); 

      if (child == null) { 
       return; 
      } 

      final Rect r = new Rect (0, 0, child.getWidth(), child.getHeight()); 
      final double height = child.getHeight() * 1.0; 

      recordListview.getChildVisibleRect(child, r, null); 
      Log.d("Visible1 ", view.getFirstVisiblePosition() + " " + height + " " + r.height()); 

      if (Math.abs (r.height()) < height/2.0) { 
       // show next child 
       recordListview.smoothScrollToPosition(view.getFirstVisiblePosition()+1); 
       Log.d("Visible1 Location", view.getFirstVisiblePosition() +1+ ""); 
      } else { 
       recordListview.smoothScrollToPosition(view.getFirstVisiblePosition()); 
       Log.d("Visible1 Location", view.getFirstVisiblePosition()+ ""); 
      } 
     } 
    } 

    @Override 
    public void onScroll(final AbsListView view, final int firstVisibleItem, final int visibleItemCount, final int totalItemCount) { 
     // nothing to do here 
    } 
}); 

Что касается первоначального вопроса об определении того, какой вид виден полностью и которая не является, я бы предложил использовать следующий код:

@Override 
public void onScrollStateChanged(final AbsListView view, final int scrollState) { 
    if (scrollState == SCROLL_STATE_IDLE) { 

     final int firstVisiblePosition = view.getFirstVisiblePosition(); 
     View child = recordListview.getChildAt(firstVisiblePosition); 

     if (child == null) { 
      return; 
     } 

     if (mListItemsOnScreen == 0) { 
      // number of total visible items, including items which are not fully visible 
      mListItemsOnScreen = (int) Math.ceil(((double)recordListview.getHeight())/(child.getHeight() + recordListview.getDividerHeight())); 
     } 

     final Rect r = new Rect(0, 0, child.getWidth(), child.getHeight()); 
     final double height = child.getHeight(); 

     recordListview.getChildVisibleRect(child, r, null); 
     Log.d("Visible1", " items till " + firstVisiblePosition + " are not visible"); 
     // Check top item 
     Log.d("Visible1", firstVisiblePosition + " is visible " + (r.height() >= height ? " fully" : "partially")); 
     // check bottom item 
     child = recordListview.getChildAt(firstVisiblePosition + mListItemsOnScreen); 

     if (child != null) { 
      r.set(0, 0, child.getWidth(), child.getHeight()); 
      recordListview.getChildVisibleRect(child, r, null); 

      Log.d("Visible1", " items from " + firstVisiblePosition + " till " + (firstVisiblePosition + mListItemsOnScreen) + " are fully visible"); 
      Log.d("Visible1", (firstVisiblePosition + mListItemsOnScreen) + " is visible " + (r.height() >= height ? " fully" : "partially")); 
     } else { 
      Log.d("Visible1", " items from " + firstVisiblePosition + " till " + (firstVisiblePosition + mListItemsOnScreen) + " are fully visible"); 
      Log.d("Visible1", (firstVisiblePosition + mListItemsOnScreen) + " is invisible "); 
     } 
    } 
} 
+0

Привет, sandstar, я попробовал решение выше. Прокрутка от пункта 0 до 1 работает тонкой гайкой, когда я перехожу от пункта 1 до 2. Список начинает двигаться от 1 - 2 - 1 - 2 ... неопределенно. 07-10 02: 49: 46,930: D/Visible1 (2772): 1 190,0 190 2 07-10 02: 49: 46,930: D/Visible1 Местоположение (2772): 1 07-10 02:49: 46.980: D/Visible1 (2772): 1 190,0 52 2 07-10 02: 49: 46,980: D/Visible1 Местонахождение (2772): 2 07-10 02: 49: 47.040: D/Visible1 (2772): 1 190,0 190 2 07-10 02: 49: 47.070: D/Visible1 Местонахождение (2772): 1 07-10 02: 49: 47.113: D/Visible1 (2772): 1 190,0 52 2 ' – sean

+0

Что вы пытаетесь достигать? На самом деле, вы задаете вопрос: «Как определить, какая строка показывает частичную» - был ли вы в состоянии ее достичь? – sandrstar

+0

Да, это правильно. Я пытаюсь определить, какая строка показана, а затем прокручивается до строки, на которой показана самая большая область. Мне просто интересно, почему он будет работать для прокрутки пункта от 0 до 1, а не для последующего прокрутки. – sean

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