2017-02-21 142 views
0

我有一個ListView,每個Listitem都有一個ImageButton,它在單擊時顯示帶有兩個按鈕的溢出菜單。我使用了一個自定義的ArrayAdapter,該對象名爲TrackedRun。我想要引用與通過溢出菜單單擊的ListItem對應的TrackedRun對象。Android按鈕點擊時獲取列表項的位置

這是我的轉接器(包括剛剛相關的代碼):

public class HistoryListItemAdapter extends ArrayAdapter<TrackedRun> { 

public interface OnOverflowButtonListener { 
    void onDeleteClick(int id); 
    void onEditClick(int id); 
} 


private Context context; 
private TrackedRun currentItem; 
private View rootView; 
private OnOverflowButtonListener listener; 
private int position; 

public HistoryListItemAdapter(Context context, ArrayList<TrackedRun> items, 
           HistoryFragment historyFragment, OnOverflowButtonListener listener){ 
    super(context, 0, items); 
    this.context = context; 
    this.listener = listener; 
} 

@NonNull 
@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    LayoutInflater inflater = (LayoutInflater) getContext() 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

    rootView = convertView; 
    currentItem = getItem(position); 
    this.position = position; 

    if (null == rootView) { 
     rootView = inflater.inflate(
       R.layout.history_list_item, 
       parent, 
       false); 
    } 
    setOverflowMenu(); 

    return rootView; 
} 

private void setOverflowMenu(){ 
    final ImageButton button = (ImageButton) rootView.findViewById(R.id.overflow_icon); 
    button.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(final View v) { 

      final PopupMenu menu = new PopupMenu(getContext(), button); 
      menu.getMenuInflater().inflate(R.menu.list_item_overflow, menu.getMenu()); 
      menu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { 
       @Override 
       public boolean onMenuItemClick(MenuItem item) { 

        switch (item.getItemId()){ 

         case R.id.edit_button : 
          listener.onEditClick(currentItem.getId()); 
          break; 

         case R.id.delete_button : 
          listener.onDeleteClick(currentItem.getId()); 
          break; 
        } 
        return true; 
       } 
      }); 
      menu.show(); 
     } 
    }); 
} 

} 

而這正是我初始化ListView控件(相關代碼)的片段:

public class HistoryFragment extends Fragment { 

private View rootView; 
private HistoryListItemAdapter adapter; 
private ListView listView; 

public HistoryFragment(){ 
    //Required empty constructor. 
} 

@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
    rootView = inflater.inflate(R.layout.fragment_history, container, false); 
    initListView(); 

    return rootView; 
} 

private void initListView(){ 
    listView = (ListView) rootView.findViewById(R.id.history_listview); 
    ArrayList<TrackedRun> trackedRuns = new DatabaseHandler(getContext()).getAllTrackedRuns(); 
    adapter = new HistoryListItemAdapter(getContext(), trackedRuns, this, new HistoryListItemAdapter.OnOverflowButtonListener() { 
     @Override 
     public void onDeleteClick(int id) { 
      System.out.println(id); 
     } 

     @Override 
     public void onEditClick(int id) { 
      System.out.println(id); 
     } 
    }); 
    listView.setAdapter(adapter); 
    listView.setEmptyView(rootView.findViewById(R.id.empty_view)); 

} 

private void loadRecords() { 
    //Gets records from database, and reloads ListView with new records. 
} 

} 

當我打電話onEditClick和onDeleteClick在我的適配器中,來自currentItem的id總是來自最後一次添加的ListItem的id,而不是被點擊的id。我如何獲得與被點擊的ListItem相對應的TrackedRun對象,以獲得正確的ID?

回答

2

當初始化每個溢出菜單,需要從全局變量傳遞當前項目這樣

private void setOverflowMenu(final TrackedRun currentItem){ 
... 
} 

,並更改private TrackedRun currentItem一個局部變量

+0

謝謝!有什麼機會可以向我解釋爲什麼會發生這種情況?我的猜測是,每次添加新的ListItem時,getView方法都會運行,並且代碼將被覆蓋,直到它結束於最後一項。 – TobiasP

+1

@TobiasP你是對的。瞭解listview如何工作。我建議你應該在getView方法中添加一個日誌。然後再次運行該應用程序並檢查logcat。我想你會知道你的問題爲什麼解決 –

1

當充氣的ListView,getView方法將被excuted getCount() times.So當您的ListView充氣完成後,currentItem是last.here是我的建議:

private void setOverflowMenu(final int position){ 
    ... 
} 

使用位置更加簡單,因爲您已在Activity中擁有您的數組。