Intereting Posts
Анимация двухслойных графических элементов Pre-Honeycomb Как я могу подавать блоки NAL H.264 в Android MediaCodec для декодирования? Android Studio с использованием библиотеки и проекта с тем же именем пакета Не удается установить версию отладки и выпуска на том же устройстве Java.io.IOException: обнаружено не было Scrollview не прокручивается, если он слишком короткий для прокрутки В Android Studio 2.0 не удается найти локальную переменную метода в режиме отладки Запустите IntentService из Activity и обновите Activity, когда IntentService закончен Событие прокрутки браузера не срабатывает достаточно часто на устройствах iOS и Android Не удается открыть Android SDK Manager Платформа Android с квадратными кнопками В чем смысл SharedPreferences.getFloat () "Android: elevation =" не работает на устройствах pre-Lollipop с компилятором API21 Обнаружение физического нажатия клавиши меню на Android «Посланник» Facebook имеет приемник SMS-вещания, который имеет наивысший приоритет после перезагрузки

Как получить местоположение (на экране) строки в списке

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

public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { int itemId = MainActivity.this.getListView().pointToPosition((int) e1.getX(),(int) e1.getY()); Offer order = (Offer)MainActivity.this.getListView().getAdapter().getItem(itemId); View v = MainActivity.this.getListView().getChildAt(itemId); } } 

Я хочу отобразить представление поверх вершинной строки с набором параметров, чувствительных к контексту для этой строки.

Мои проблемы заключаются в следующем:

 v.getTop() v.getBottom() 

Верните правильные значения только до прокрутки представления. Я мог бы, вероятно, сделать некоторые вычисления, чтобы выработать смещения, используя позиции прокрутки и т. Д., Но я также заметил, что я получаю значения только тогда, когда я прокручиваю строку, которая видна на экране, для начала. Если я прокручиваю список вниз и затем прокручиваю строку (которая первоначально не была за пределами экрана), то эти методы возвращают нулевые значения.

Кажется, что методы, приведенные ниже, страдают от одной и той же проблемы …

 v.getLocationOnScreen(loc) v.getLocationInWindow(loc) 

В конечном счете, я ищу, чтобы найти расстояние между вершиной видимого listView и строки, которая была пробита. Затем я воспользуюсь этим расстоянием, чтобы добавить представление к родительскому FrameLayout с соответствующим заполнением высоты (так, чтобы он охватывал строку с прокруткой).

Любая помощь приветствуется!

Solutions Collecting From Web of "Как получить местоположение (на экране) строки в списке"

Существует два разных способа индексирования элементов ListView, расположение в адаптере или видимое место на экране. Элемент всегда будет находиться в одном месте внутри адаптера (если вы не измените его). Индекс в view.getChildAt () будет меняться в зависимости от того, что видно на экране.

Позиция, возвращаемая pointToPosition, – это позиция внутри адаптера. Если вы хотите получить физическое представление, вам нужно учитывать, если прокручивается представление. Попробуй это:

 int adapterIndex = MainActivity.this.getListView().pointToPosition((int) e1.getX(),(int) e1.getY()); int firstViewItemIndex = MainActivity.this.getListView().getFirstVisiblePosition(); int viewIndex = adapterIndex - firstViewItemIndex; View v = MainActivity.this.getListView().getChildAt(viewIndex); 

Я решил это, но это похоже на хак и, вероятно, не самая эффективная реализация. Разумеется, должен быть более чистый способ сделать это с помощью API Android?

В приведенном ниже коде я добавил HashMap в свой массив ArrayAdaptor, чтобы отслеживать, какие представления на экране содержат строки (поскольку они переработаны при прокрутке списка)

Все изменения, внесенные мной в исходный адаптер, были описаны ниже.

  class RestaurantAdapter extends ArrayAdapter<Offer> { Map hash = null; //HashMap to keep track of rowId and on screen View RestaurantAdapter() { super(MainActivity.this, android.R.layout.simple_list_item_1, model); hash = new HashMap(); //instantiate HashMap in constructor } //method to return correct View on screen for row id public View getViewOnScreen(int rowId) { return (View)hash.get(rowId); } public View getView(int position, View convertView, ViewGroup parent) { View row=convertView; hash.put(position, convertView); // add/update view for row position as it is recycled RestaurantWrapper wrapper=null; if (row==null) { LayoutInflater inflater=getLayoutInflater(); row=inflater.inflate(R.layout.row, parent, false); wrapper=new RestaurantWrapper(row); row.setTag(wrapper); } else { wrapper=(RestaurantWrapper)row.getTag(); } wrapper.populateFrom(model.get(position)); return(row); } } 

Это лучший способ найти, какая строка была затронута.

  Rect rect = new Rect(); int childCount = mListView.getChildCount(); int[] listViewCoords = new int[2]; mListView.getLocationOnScreen(listViewCoords); int listX = (int) event.getRawX() - listViewCoords[0]; int listY = (int) event.getRawY() - listViewCoords[1]; View child; for (int i = 0; i < childCount; i++) { child = mListView.getChildAt(i); child.getHitRect(rect); if (rect.contains(listX, listY)) { mDownView = child; break; } } 

Вы можете использовать это в методе onTouch при событии ACTION_DOWN. Приветствую.