2016-12-07 4 views
0

В связи с изменениями в моих реквизитах я должен был изменить мой ListFragment к Fragment с ExpandableListView, я перешел от первого до последнего без особого труда за OnItemLongClickListener исключением.Android: Ошибка получения ID onItemLongClickListener в ExpandableListView

Фактические клики по различным строкам работают отлично, но когда я делаю длинный клик по любой строке, значение id всегда находится вне пределов моей базы данных. Я использую CursorTreeAdapter, чтобы заполнить ExpandableListView, и он работает нормально, поэтому я не знаю, что я делаю неправильно в процессе Long Click.

Я отправлю соответствующий код.

// Фрагмент

@Override 
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    Log.v(TAG, "onCreateView"); 
    View view = inflater.inflate(R.layout.activity_list_layout, container, 
      false); 
    mAdapter = new ExpandableActivityListCursorAdapter(getActivity(), null); 
    mExpListView = (ExpandableListView) view.findViewById(R.id.exp_list); 
    mExpListView.setAdapter(mAdapter); 

//... 
} 

@Override 
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) { 
    Log.v(TAG, "onLoadFinished"); 
     if (cursor != null) { 
     mAdapter.changeCursor(cursor); 
     } 
} 

@Override 
public void onLoaderReset(Loader<Cursor> loader) { 
    Log.v(TAG, "onLoaderReset"); 
    mAdapter.changeCursor(null); 
} 

if (mExpListView != null) { 
     mExpListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { 
      @Override 
      public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { 

       int res = DBActivity.changeHighlightedActivity(getActivity().getContentResolver(), id); // <-- Not working because id has values like 12323487364763 or -9843627183764 (not valid as IDs in my DB) 

       updateHighlightedActivityDB(id, res); 

       Toast.makeText(getActivity(), (res == 0 ? getString(R.string.activity_no_longer_highlighted) : 
         getString(R.string.activity_now_highlighted)), Toast.LENGTH_LONG).show(); 
       return true; 
      } 
     }); 


    mExpListView.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() { 
      @Override 
      public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) { 
       Intent i = new Intent(v.getContext(), ActivityPagerActivity.class); 

       Uri chatUri = ContentUris.withAppendedId(
         EPCTrackerContentProvider.CONTENT_URI_MESSAGE_PER_ACTIVITY, id); //<-- id is having the right values (1 to 500 more or less) 

       //.... 
       startActivity(i); 
       return true; 
      } 
     }); 

} 

// Адаптер

@Override 
public long getGroupId(int groupPosition) 
{ 
    if(getCursor() == null) 
     return -1; 

    Cursor group_cur = getCursor(); 

    if(!group_cur.moveToPosition(groupPosition)) 
    { 
     throw new IllegalStateException("couldn't move group cursor to position " + groupPosition); 
    } 

    return group_cur.getLong(group_cur.getColumnIndexOrThrow(DBActivity.COLUMN_ACTIVITY_ID)); 

} 

@Override 
public long getChildId(int groupPosition, int childPosition) 
{ 
    if(getCursor() == null) 
     return -1; 

    Cursor group_cur = getCursor(); 

    if(!group_cur.moveToPosition(groupPosition)) 
    { 
     throw new IllegalStateException("couldn't move group cursor to position " + groupPosition); 
    } 

    Cursor child_cur = getChildrenCursor(group_cur); 

    if(child_cur == null) 
     return -1; 

    if(!child_cur.moveToPosition(childPosition)) 
    { 
     throw new IllegalStateException("couldn't move child cursor to position " + childPosition); 
    } 

    return child_cur.getLong(group_cur.getColumnIndexOrThrow(DBActivity.COLUMN_ACTIVITY_ID)); 
} 

Как я уже упоминал ранее, когда я нажимаю на пункты группы или дочерние элементы возвращаемые идентификаторы правильны. Что мне не хватает?

Заранее спасибо.

EDIT

Я добавлю определение XML

<ExpandableListView 
     android:id="@+id/exp_list" 
     android:layout_below="@id/layout_text" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:clickable="true" 
     android:focusable="false" /> 

ответ

0

Ну, после некоторых исследований я не нашел никаких оснований для такого поведения, однако я нашел решение проблемы. Я получу из данной позиции позицию строки моего ExpandableListView, и я получу элемент id. Вот код:

mExpListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { 
      @Override 
      public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { 

       if (ExpandableListView.getPackedPositionType(id) == ExpandableListView.PACKED_POSITION_TYPE_CHILD) { 
        final long packedPosition = ((ExpandableListView) parent).getExpandableListPosition(position); 
        int groupPosition = ExpandableListView.getPackedPositionGroup(packedPosition); 
        int childPosition = ExpandableListView.getPackedPositionChild(packedPosition); 

        long id = mAdapter.getChildId(groupPosition,childPosition)); 

        //... 
        // Return true as we are handling the event. 
        return true; 
       } 
       else if(ExpandableListView.getPackedPositionType(id) == ExpandableListView.PACKED_POSITION_TYPE_GROUP) 
       { 
        final long packedPosition = ((ExpandableListView) parent).getExpandableListPosition(position); 
        int groupPosition = ExpandableListView.getPackedPositionGroup(packedPosition); 

        long id = mAdapter.getGroupId(groupPosition)); 

        //... 
        return true; 
      } 
     }); 

Надеется, что это помогает кто-то в моем положении

Приветствия

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

  • Нет связанных вопросов^_^