В связи с изменениями в моих реквизитах я должен был изменить мой 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" />