2016-03-05 87 views
0

我已經實施了一個ListViewListFragment,它附有AsyncTaskLoader。數據從數據庫填充。每行有一個PopUp的菜單按鈕,其中還有2個選項(編輯&刪除)。刪除用AsyncTaskLoader連接的一行ListView

我想要的是,當任何選項被點擊時,該對象從數據庫中刪除。

如何獲取已刪除對象的ID?

我的適配器:

public class ConferenceAdapter extends ArrayAdapter<Conference> implements View.OnClickListener, PopupMenu.OnMenuItemClickListener{ 
    private Context context; 
    private final LayoutInflater mInflater; 

    public ConferenceAdapter(Context context) { 
     super(context, R.layout....); 
     this.context = context; 
     mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 

    public void setData(List<Conference> data) { 
     clear(); 
     if (data != null) { 
      addAll(data); 
     } 
    } 

    /** 
    * Populate new items in the list. 
    */ 
    @Override public View getView(int position, View convertView, ViewGroup parent) { 
     ViewHolder holder = null; 
     Conference conference = (Conference)getItem(position); 

     if (convertView == null) { 
      convertView = mInflater.inflate(R.layout.item_conference_fragment, parent, false); 

      holder = new ViewHolder(); 
      ... 
      holder.btnOverflow = (ImageButton)convertView.findViewById(R.id.btn_overflow); 
      ... 

      convertView.setTag(holder); 
     } else { 
      holder = (ViewHolder)convertView.getTag(); 
     } 

     holder.btnOverflow.setOnClickListener(this); 
     ... 

     return convertView; 
    } 

    @Override 
    public void onClick(View v) { 
     if (v.getId() == R.id.btn_overflow) { 
      PopupMenu pm = new PopupMenu(context, v); 
      Menu menu = pm.getMenu(); 
      menu.add("Edit"); 
      menu.add("Delete"); 
      pm.show(); 

      pm.setOnMenuItemClickListener(this); 
     } 
    } 

    @Override 
    public boolean onMenuItemClick(MenuItem item) { 
     OnPopUpListener listener = (OnPopUpListener)context; 
     if (item.getTitle().equals("Delete")) { 
     // What logic should I use here? 
     // How can I get current Object as I do not have a list? 
      listener.onDelete(...); 
     } 
     return false; 
    } 

    static class ViewHolder { 
     ImageButton btnOverflow; 
     ... 
    } 
} 

回答

0

有時候,良好的編碼習慣可能導致困難的局面。無論如何,我將getView(...)中的事件偵聽器移動了出來,並且我能夠訪問該對象。將來可能對某人有所幫助。

 /** 
    * Populate new items in the list. 
    */ 
    @Override public View getView(final int position, View convertView, ViewGroup parent) { 
     ViewHolder holder = null; 
     final Conference conference = (Conference)getItem(position); 

     if (convertView == null) { 
      convertView = mInflater.inflate(R.layout.item_conference_fragment, parent, false); 

      holder = new ViewHolder();   
      holder.btnOverflow = (ImageButton)convertView.findViewById(R.id.btn_overflow); 
      ... 
      convertView.setTag(holder); 
     } else { 
      holder = (ViewHolder)convertView.getTag(); 
     } 

     final ViewHolder finalHolder = holder; 
     holder.btnOverflow.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       finalHolder.btnOverflow.setTag(position); 
       PopupMenu pm = new PopupMenu(context, v); 
       Menu menu = pm.getMenu(); 
       menu.add("Edit"); 
       menu.add("Delete"); 
       pm.show(); 

       pm.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { 
        @Override 
        public boolean onMenuItemClick(MenuItem item) { 
         if (item.getTitle().equals("Delete")) { 
          conferenceTable.delete(conference.id); 
         } else if (item.getTitle().equals("Edit")) { 
         } 
         return false; 
        } 
       }); 
      } 
     }); 
     ... 

     return convertView; 
    }