从listview和hashmap中删除特定条目时出错 [英] Getting error while removing specific entry from listview and hashmap

查看:179
本文介绍了从listview和hashmap中删除特定条目时出错的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在尝试从listview和hashmap中删除特定条目时出现以下错误:

  java.lang.IndexOutOfBoundsException:索引:0,大小:0 
at java.util.ArrayList.get(ArrayList.java:411)
at android.widget.ArrayAdapter.getItem(ArrayAdapter.java:349)
at android.app.Activity.onMenuItemSelected()获取b $ b的值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)
在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)
在com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:894)
at com.android.internal.view.menu.MenuPopup.onItemClick(MenuPopup.java:128)
在android.widget.AdapterView.performItemClick(AdapterView.java:310)
at android.widget.AbsListView.performItemClick(AbsListView.java:1155)
at android.widget.AbsListView $ PerformClick.run(AbsListView .java:3126)
在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)

我的代码是:

 公共类MainActivity扩展AppCompatActivity {

ArrayAdapter适配器;
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菜单,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);




$覆盖
public boolean onContextItemSelected(MenuItem item){
android.widget.AdapterView.AdapterContextMenuInfo info =( android.widget.AdapterView.AdapterContextMenuInfo)item.getMenuInfo();
switch(item.getItemId()){
case R.id.edit:
//在此处编辑名称或金额
返回true;
case R.id.delete:
adapter.remove(listView.getItemAtPosition(info.position));
adapter.notifyDataSetChanged();
myMap.remove(listView.getItemAtPosition(info.position));
返回true;
case R.id.deleteall:
adapter.clear();
adapter.notifyDataSetChanged();
myMap.clear();
返回true;
default:
return super.onContextItemSelected(item);
}
}


public class User {
public String name;
公共双重金额;

public User(String name,double amount){
this.name = name;
this.amount =金额;
}

@Override
public String toString(){
返回格式(%s:%.2f,this.name,this.amount);


$ / code $ / pre

长按一下listview中的一行,编辑,删除和删除所有选项。删除所有选项的作品,但删除特定行的选项会导致错误。我不确定我会在哪里出错。建议将不胜感激。
我想从用户那里获取User_name和金额,然后在listview中显示它,并将key值对存储在hashmap中,以便它可以被编辑。

解决方案

你的错误是Adapter是空的,所以你需要添加一些数据给它,然后才能开始删除从它的东西。



我不确定为什么你需要HashMap,但是如果你想从适配器中移除一个元素,你可能需要一个 ArrayList的


$ b (我重命名ListView ID,因为它不是一个简单的列表项)

  public class MainActivity extends AppCompatActivity {

ArrayAdapter< User>适配器;
列表<用户>用户; //添加
ListView listView;

@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

listView =(ListView)findViewById(R.id.listView);
registerForContextMenu(listView);

users = new ArrayList< User>(); //添加

adapter = new ArrayAdapter< User>(
MainActivity.this,
android.R.layout.simple_list_item_1
users); //添加

listView.setAdapter(adapter);
// listView.setOnLongClickListener ... //你也可以使用这个...

我没有很多关于上下文菜单的经验,但我想像的是这样的。

  @Override 
public void onCreateContextMenu(ContextMenu menu,View v,ContextMenu.ContextMenuInfo menuInfo){
super.onCreateContextMenu(menu,v,menuInfo);
menu.setHeaderTitle(Options);
if(v.getId()== R.id.listView){
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu_list,menu);


$ b @Override
public boolean onContextItemSelected(MenuItem item){
AdapterView.AdapterContextMenuInfo info =(AdapterView.AdapterContextMenuInfo)item.getMenuInfo( );
final int index = info.position;
final User u = users.get(index); //或adapter.getItem(index);

switch(item.getItemId()){
case R.id.edit:
//在此处编辑名称或金额
返回true;
case R.id.delete:
users.remove(index);
adapter.notifyDataSetChanged();
返回true;
case R.id.deleteall:
users.clear();
adapter.notifyDataSetChanged();
返回true;
default:
return super.onContextItemSelected(item);
}
}


I am getting the following error while trying to delete specific entry from listview and hashmap:

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)

My Code is:

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);
    }
}

On long click over a row in listview, it gives options of edit, delete and delete all. Delete all option works, but delete option for specific row gives error. I am not sure where am I going wrong. Suggestions would be much appreciated. I am trying to take User_name and amount from user and then show it in the listview and store the key value pair in a hashmap so that it can be edited as well.

解决方案

Your error is that the Adapter is empty, so you'll need to add some data to it before you can start deleting things from it.

I am not sure why you need the HashMap, but if you are wanting to remove an element from the adapter, you'll probably need an ArrayList.

(I renamed the ListView ID because it is not a simple list item)

public class MainActivity extends AppCompatActivity {

    ArrayAdapter<User> adapter;
    List<User> users;   // added
    ListView listView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        listView = (ListView)findViewById(R.id.listView);
        registerForContextMenu(listView);

        users = new ArrayList<User>();   // added

        adapter = new ArrayAdapter<User>(
                MainActivity.this,
                android.R.layout.simple_list_item_1
                users);   // added

        listView.setAdapter(adapter);
        // listView.setOnLongClickListener...  // You also could use this...

I don't have much experience with context menus, but I am imagining something like this

@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
    super.onCreateContextMenu(menu, v, menuInfo);
    menu.setHeaderTitle("Options");
    if (v.getId()==R.id.listView) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.menu_list, menu);
    }
}

@Override
public boolean onContextItemSelected(MenuItem item) {
    AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
    final int index = info.position;
    final User u = users.get(index);  // or adapter.getItem(index);

    switch(item.getItemId()) {
        case R.id.edit:
            //edit name or amount here
            return true;
        case R.id.delete:
            users.remove(index);
            adapter.notifyDataSetChanged();
            return true;
        case R.id.deleteall:
            users.clear();
            adapter.notifyDataSetChanged();
            return true;
        default:
            return super.onContextItemSelected(item);
    }
}

这篇关于从listview和hashmap中删除特定条目时出错的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆