我有一個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?
謝謝!有什麼機會可以向我解釋爲什麼會發生這種情況?我的猜測是,每次添加新的ListItem時,getView方法都會運行,並且代碼將被覆蓋,直到它結束於最後一項。 – TobiasP
@TobiasP你是對的。瞭解listview如何工作。我建議你應該在getView方法中添加一個日誌。然後再次運行該應用程序並檢查logcat。我想你會知道你的問題爲什麼解決 –