Получение позиции строки списка при пролистывании

Я знаю, что этот тип вопроса задается до здесь. Я пробовал оба детектора жестов:

 wholelistview.setOnTouchListener(new View.OnTouchListener() {

            public boolean onTouch(View v, MotionEvent event) {
                if (gestureDetector.onTouchEvent(event)) {
                    return true;
                }
                return false;
            }
        });

определяет только смахивание (здесь нельзя получить позицию строки).

аналогично в getview:

public View getView(int position, View convertView, ViewGroup parent) {
//other stuff

convertview.setOnTouchListener(same as above);

} 

но не может обнаружить смахивание.

Любое решение для этого??? Мне нужна только позиция строки, по которой производится свайп.


person Hanry    schedule 05.12.2011    source источник
comment
stackoverflow.com/questions/4373485/android-swipe-on-list в любом случае.. С Днем Рождения Тебе!   -  person MKJParekh    schedule 06.12.2011
comment
@Frankenstein Я уже это видел. Но как я могу получить из этого позицию строки.   -  person Hanry    schedule 06.12.2011
comment
Я точно не знаю, но использую этот software-workshop.eu/content/swiping-listview -elements вы можете сделать свайп, верно? там вы получаете View v в качестве аргумента, не можете ли вы сделать там getTag, чтобы узнать тег представления и установить его во время создания списка. Метод getView() делает setTag() там.. таким образом, используя set и getTag(), вы можете достичь это.. попробуй   -  person MKJParekh    schedule 06.12.2011


Ответы (4)


hanry, какие ошибки вы получаете? Я реализовал это, и это работает отлично. Но вместо сохранения положения элемента я сохраняю держатель представления, который среди прочих также имеет свойство модели. Помните, что вы должны проверить, не имеет ли значение convertview значение null. Взгляните на код:

public View getView(int position, View convertView, ViewGroup parent) {
    View view = null;

    Model m = filter.subItems.get(position);
    if(m != null)
    {
        if (convertView == null) {
            LayoutInflater inflator = context.getLayoutInflater();
            view = inflator.inflate(R.layout.rowlayout, null);
            ViewHolder viewHolder = new ViewHolder();
            viewHolder.position = position; - here you can put your position.
            view.setOnTouchListener(this.listener);
            //assign whatever you like to the viewHolder - in most cases the model and inlated controls and then assign 
        } else {
            view = convertView;
        }
        view.setTag(viewHolder);
    }

а потом

public boolean onTouch(View v, MotionEvent event) {
    ViewHolder viewHolder = ((ViewHolder) v.getTag());
}

хоп, который помогает. PS: Если вы ничего не знаете о держателях представлений и тегах, я предлагаю посмотреть здесь . И мой подход описан в ссылке, которую дал Франкенштейн.

person MariuszP    schedule 06.12.2011
comment
на котором я должен внедрить полный список или конвертировать в список onouchlistener???? так как я не могу обнаружить касание/пролистывание - person Hanry; 07.12.2011
comment
Я присоединяюсь к представлению в адаптере. view.setOnTouchListener(this.listener); Я делаю это только в том случае, если преобразование равно нулю, после раздувания нового представления. - person MariuszP; 07.12.2011
comment
+1 я получаю позицию строки при касании, но (gestureDetector.onTouchEvent(event)) не вызывается. - person Hanry; 09.12.2011
comment
У меня тоже были проблемы с детектором жестов, поэтому я перестал его использовать. - person MariuszP; 12.12.2011

Чтобы получить позицию строки для вашего представления, получите позицию представления, переданную onTouch для вашего списка, с помощью этой функции.

wholelistview.setOnTouchListener(new View.OnTouchListener() {         
 public boolean onTouch(View v, MotionEvent event) {                 
 if (gestureDetector.onTouchEvent(event)) {
    int position =  indexOfChild(View v);

     return true;                 
     }                 
     return false;             
                  }         }); 

Он возвращает индекс дочернего элемента. http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.3.5_r1/android/view/ViewGroup.java#ViewGroup.indexOfChild%28android.view.View%29

person om252345    schedule 05.12.2011
comment
можете ли вы объяснить это подробнее, так как я не могу использовать indexofchild, он говорит: несколько маркеров в этой строке - представление не может быть преобразовано в переменную - синтаксическая ошибка в токене v, удалите это - person Hanry; 05.12.2011
comment
Я не пробовал, и щас не могу попробовать это... Я попробую и расскажу вам однажды @дома - person om252345; 05.12.2011

вы можете сделать getTag и setTag, чтобы узнать тег представления, и с его помощью вы можете решить, какая строка была пропущена

public View getView(int position, View convertView, ViewGroup parent) { 
//other stuff 
     convertview.setTag(position);
}  

а для проведите по ссылке

 public boolean onTouch(View v, MotionEvent event) {
     int pos = (Integer)v.getTag();
     Log.i(TAG,pos+" is swiped");
 }

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

person MKJParekh    schedule 06.12.2011

private int position = -1;
@Override
protected void onListItemClick(ListView l, View v, int index, long id) {
position = index;
}

нравится?

person brian    schedule 05.12.2011