【发布时间】:2016-11-09 21:51:51
【问题描述】:
尝试从列表视图和哈希图中删除特定条目时出现以下错误:
java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
at java.util.ArrayList.get(ArrayList.java:411)
at android.widget.ArrayAdapter.getItem(ArrayAdapter.java:349)
at android.widget.AdapterView.getItemAtPosition(AdapterView.java:790)
at com.example.cmmalli.helloworld.MainActivity.onContextItemSelected(MainActivity.java:120)
at android.app.Activity.onMenuItemSelected(Activity.java:3224)
at android.support.v4.app.FragmentActivity.onMenuItemSelected(FragmentActivity.java:406)
at android.support.v7.app.AppCompatActivity.onMenuItemSelected(AppCompatActivity.java:195)
at android.support.v7.view.WindowCallbackWrapper.onMenuItemSelected(WindowCallbackWrapper.java:103)
at com.android.internal.policy.PhoneWindow$PhoneWindowMenuCallback.onMenuItemSelected(PhoneWindow.java:3722)
at com.android.internal.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:761)
at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:152)
at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:904)
at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:894)
at com.android.internal.view.menu.MenuPopup.onItemClick(MenuPopup.java:128)
at android.widget.AdapterView.performItemClick(AdapterView.java:310)
at android.widget.AbsListView.performItemClick(AbsListView.java:1155)
at android.widget.AbsListView$PerformClick.run(AbsListView.java:3126)
at android.widget.AbsListView$3.run(AbsListView.java:4041)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6077)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
我的代码是:
public class MainActivity extends AppCompatActivity {
ArrayAdapter adapter;
TextView user_name;
TextView user_amount;
ImageButton addbtn;
ListView listView;
HashMap<String, Double> myMap = new HashMap<String, Double>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
user_name = (TextView) findViewById(R.id.nameeditText);
user_amount = (TextView) findViewById(R.id.amounteditText);
addbtn = (ImageButton)findViewById(R.id.moreImageButton);
listView = (ListView)findViewById(R.id.simple_list_item_1);
registerForContextMenu(listView);
adapter = new ArrayAdapter<User>(
MainActivity.this,
android.R.layout.simple_list_item_1);
listView.setAdapter(adapter);
addbtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String name = user_name.getText().toString();
Double amount = Double.parseDouble(user_amount.getText().toString());
adapter.add(new User(name, amount));
adapter.notifyDataSetChanged();
myMap.put(name,amount);
Iterator myVeryOwnIterator = myMap.keySet().iterator();
while(myVeryOwnIterator.hasNext()) {
Toast.makeText(getBaseContext(), (String) myVeryOwnIterator.next(),
Toast.LENGTH_SHORT).show();
}
}
});
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
menu.setHeaderTitle("Options");
if (v.getId()==R.id.simple_list_item_1) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu_list, menu);
}
}
@Override
public boolean onContextItemSelected(MenuItem item) {
android.widget.AdapterView.AdapterContextMenuInfo info = (android.widget.AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
switch(item.getItemId()) {
case R.id.edit:
//edit name or amount here
return true;
case R.id.delete:
adapter.remove(listView.getItemAtPosition(info.position));
adapter.notifyDataSetChanged();
myMap.remove(listView.getItemAtPosition(info.position));
return true;
case R.id.deleteall:
adapter.clear();
adapter.notifyDataSetChanged();
myMap.clear();
return true;
default:
return super.onContextItemSelected(item);
}
}
public class User {
public String name;
public double amount;
public User(String name, double amount) {
this.name = name;
this.amount = amount;
}
@Override
public String toString() {
return format("%s : %.2f", this.name, this.amount);
}
}
在列表视图中长按一行时,它会提供编辑、删除和全部删除的选项。删除所有选项有效,但特定行的删除选项会出错。我不确定我哪里出错了。建议将不胜感激。 我试图从用户那里获取用户名和数量,然后在列表视图中显示它并将键值对存储在哈希图中,以便也可以对其进行编辑。
【问题讨论】:
-
我正在尝试使用 HashMapAdapter 自定义适配器,它为此扩展了基本适配器,但不确定如何通过它设置和获取值。也不确定如何将 HashMapadapter 设置为 listview 以及如何设置和从中获取值。如果有人也能为我阐明这一点,那就太好了。使用以下自定义适配器示例 [stackoverflow.com/questions/5234576/…
-
您的适配器显然是空的。您如何选择要删除的任何项目?
标签: android listview hashmap android-arrayadapter