2014-12-22 3 views
0

Так что я немного запутался прямо сейчас. Я использую simpleCursorAdapter с внутренним классом, который расширяет BaseAdapter, поэтому я могу показывать объявление в моем ListView каждые x элементов. Теперь, когда пользователь щелкает элемент в ListView, открывается диалоговое окно, и пользователь может выбрать «Удалить», который явно удаляет эту строку. В моем адаптере базы данных ему нужна _id в базе данных, чтобы удалить строку, поэтому я передаю идентификатор, который я получаю из метода onItemClick. Теперь я узнал, что при использовании пользовательского адаптера длинный идентификатор из onItemClick возвращает позицию, поэтому мне нужно найти _id в базе данных.Android - Получить _id в базе данных onItemClick

Это мой onItemClick:

myList.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View viewClicked, 
       int position, long idInDB) { 

Cursor cursor = (Cursor)parent.getItemAtPosition(position); 
       if(cursor != null && cursor.moveToFirst()){ 
        int rowCol = cursor.getColumnIndex("_id"); 
        idInDB1 = cursor.getLong(rowCol); 

The "idInDB1" является давно, что получить передаваемый в мой метод удаления из моей базы данных адаптера.

Я устанавливаю мой SimpleCursorAdapter так:

myList.setAdapter(new ListViewAdapter(getActivity(), myCursorAdapter)); 

Вот класс ListViewAdapter, что я должен показывать объявления:

public class ListViewAdapter extends BaseAdapter { 

private Activity mContext; 
private SimpleCursorAdapter listAdapter; 
private LayoutInflater mLayoutInflater; 
private int k = 6; // interval ad every 6 items 
int baseItems; 
int noAds; // used for listview offset 

// Constructor takes in a BaseAdapter 
public ListViewAdapter(FragmentActivity activity, SimpleCursorAdapter delegate) { 
    mContext = activity; 
    listAdapter = delegate; 
    baseItems = listAdapter.getCount(); 
    noAds = baseItems/k; 
    mLayoutInflater = (LayoutInflater) mContext 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

} 



@Override 
public int getCount() { 
    // Total count includes list items and ads. 
    return baseItems + noAds; 
} 

@Override 
public Object getItem(int position) { 
    // Return null if an item is an ad. Otherwise return the delegate item. 
    if (isItemAnAd(position)) { 
     return null; 
    } 
    return listAdapter.getItem(getOffsetPosition(position)); 
} 

@Override 
public long getItemId(int position) { 
    return position; 
} 

@Override 
public int getViewTypeCount() { 
    return listAdapter.getViewTypeCount() + noAds; 
} 

@Override 
public int getItemViewType(int position) { 
    if (isItemAnAd(position)) { 
     return listAdapter.getViewTypeCount(); 
    } else { 
     return listAdapter.getItemViewType(getOffsetPosition(position)); 
    } 
} 

@Override 
public boolean areAllItemsEnabled() { 
    return false; 
} 

@Override 
public boolean isEnabled(int position) { 
    return (!isItemAnAd(position)) && listAdapter.isEnabled(getOffsetPosition(position)); 
} 

private boolean isItemAnAd(int position) { 
    if (position < k) return false; 
    // Calculate current offset caused by ads already embedded 

    if (position==k){ 
     return true; 
    } 
    else { 
     return isItemAnAd(position-k); 
    } 

} 




// Get the position that is offset by the insertion of the ads 
private int getOffsetPosition(int position) { 

    int currentNoAds = position/k; 
    return position - currentNoAds; 

} 



@Override 
public View getView(int position, View convertView, ViewGroup parent) { 

    // Display every n list items 
    if (isItemAnAd(position)) { 
     if (convertView instanceof AdView) { 
      // Don’t instantiate new AdView, reuse old one 
      return convertView; 
     } else { 
      // Create a new AdView 
      AdView adView = new AdView(mContext); 
      adView.setAdSize(AdSize.SMART_BANNER); 
      adView.setAdUnitId("ca-app-pub-2454167205089490/6335584363"); 

      // Disable focus for sub-views of the AdView to avoid problems with 
      // trackpad navigation of the list. 
      for (int i = 0; i < adView.getChildCount(); i++) 
      { 
       adView.getChildAt(i).setFocusable(false); 
      } 
      adView.setFocusable(false); 

      // Convert the default layout parameters so that they play nice with 
      // ListView. 

      float density = mContext.getResources().getDisplayMetrics().density; 
      int height = Math.round(AdSize.BANNER.getHeight() * density); 
      AbsListView.LayoutParams params = new AbsListView.LayoutParams(
        AbsListView.LayoutParams.MATCH_PARENT, 
        height); 
      adView.setLayoutParams(params); 
      AdRequest bannerIntermediateReq = new AdRequest.Builder().build(); 
      adView.loadAd(bannerIntermediateReq); 

      return adView; 
     } 
    } else { 

     // Offload displaying other items to the delegate 
     return listAdapter.getView(getOffsetPosition(position) , 
       convertView, parent); 

    } 
} 
} 

Мой "idInDB1" всегда является _id верхней строки в моем ListView, и я не могу понять, почему. Кто угодно?

ответ

1

Изменить код в onItemClick от

Cursor cursor = (Cursor)parent.getItemAtPosition(position); 
if(cursor != null && cursor.moveToFirst()){ 
    int rowCol = cursor.getColumnIndex("_id"); 
idInDB1 = cursor.getLong(rowCol); 

в

Cursor cursor = (Cursor)((YourAdapter)listView.getAdapter()).getCursor(); 
cursor.moveToPosition(positon); 
int rowCol = cursor.getColumnIndex("_id"); 
idInDB1 = cursor.getLong(rowCol); 

Причина, почему вы всегда получить первый идентификатор, потому что вы перемещаете курсор на первую позицию, а затем получить id.

+0

Наконец-то нашёл правильный ответ! Спасибо огромное! Работает как шарм. Я хотел бы поддержать ваш ответ, но я пока не могу :( – Sam

+0

@Sam - О, это хорошо .. Рад, что это сработало для u –

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