Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/233.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 从ListView中删除项时发生IndexAutofBound错误_Android_Listview - Fatal编程技术网

Android 从ListView中删除项时发生IndexAutofBound错误

Android 从ListView中删除项时发生IndexAutofBound错误,android,listview,Android,Listview,我已经搜索了几乎所有与此主题相关的可能问题,但无法解决此问题。每当我试图通过嵌入ListView项的自定义删除按钮删除项时,删除几个项后,它会给我IndexOutOfBound error错误。我知道这个错误是由于列表无法刷新自己后,该项目已与位置删除。这是我的密码: MainActivity: import java.util.ArrayList; import java.util.List; import android.os.Bundle; import android.app.Act

我已经搜索了几乎所有与此主题相关的可能问题,但无法解决此问题。每当我试图通过嵌入ListView项的自定义删除按钮删除项时,删除几个项后,它会给我IndexOutOfBound error错误。我知道这个错误是由于列表无法刷新自己后,该项目已与位置删除。这是我的密码:

MainActivity:

import java.util.ArrayList;
import java.util.List;

import android.os.Bundle;
import android.app.Activity;
import android.app.ListActivity;
import android.view.Menu;
import android.widget.ArrayAdapter;

public class MainActivity extends ListActivity 
{

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

        ArrayAdapter<Model> adapter = new InteractiveArrayAdapter(this,getModel());
            //adapter.clear();
        setListAdapter(adapter);
    }

    private List<Model> getModel() {
        List<Model> list = new ArrayList<Model>();
        list.add(get("Linux"));
        list.add(get("Windows7"));
        list.add(get("Suse"));
        list.add(get("Eclipse"));
        list.add(get("Ubuntu"));
        list.add(get("Solaris"));
        list.add(get("Android"));
        list.add(get("iPhone"));
        // Initially select one of the items
        //list.get(1).setSelected(true);
        return list;
      }

    private Model get(String s)
    {
        return new Model(s);
    }

}

关于这方面的任何帮助都将是非常好的。

正如我读到的,您正在使用一个最终位置来扩展视图,以便在OnClick Listener中使用

public View getView(final int position, View convertView, ViewGroup parent)
现在,您可以通过删除一些项目来更改列表,尽管列表也声明为final,但它可以更改,因为它是可变的

private final List<Model> list;

取消对下一行的注释

    //((ViewHolder) view.getTag()).text.setTag(list.get(position));
将remove语句替换为以下语句

    list.remove(viewHolder.btn.getTag());

使用以下代码更改适配器

public class InteractiveArrayAdapter extends ArrayAdapter<Model> {

  private final List<Model> list;
  private final Activity context; 
  private MainActivity ma;

 LayoutInflater inflator;
  public InteractiveArrayAdapter(Activity context, List<Model> list)
  {
    super(context, R.layout.rowbuttonlayout, list);
    this.context = context;
    inflator =  context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);;
  }

  static class ViewHolder
  {
    protected TextView text;
    protected Button btn;
  }

  @Override
  public View getView(final int position, View convertView, ViewGroup parent) {
    ViewHolder viewHolder;
    if (convertView == null) 
    {    
      convertView = inflator.inflate(R.layout.rowbuttonlayout, null);
      viewHolder = new ViewHolder();

      viewHolder.text = (TextView) view.findViewById(R.id.label);
      viewHolder.btn = (Button) view.findViewById(R.id.button1);     
      convertView.setTag(viewHolder);
      }

    else 
    {
        viewHolder = (ViewHolder)convertView.getTag();
     }
    viewHolder.btn.setOnClickListener(new OnClickListener()
      {
            public void onClick(View v)
            {       
            list.remove(position);
                    notifyDataSetChanged();  

            }

      });

   viewHolder.text.setText(list.get(position).getName());
   return convertView;
  }

  @Override
  public int getCount()
  {
      return list.size();
  }

  @Override
  public long getItemId(int position) {
        return position;
    }

  @Override
  public Object getItem(int position) {
      return list.get(position);
  }
公共类InteractiveArrayAdapter扩展了ArrayAdapter{
私人最终名单;
私人最终活动背景;
私人活动硕士;
充气机;
公共InteractiveArrayAdapter(活动上下文、列表)
{
super(上下文,R.layout.rowbuttonlayout,列表);
this.context=上下文;
充气器=context.getSystemService(context.LAYOUT_充气器_SERVICE);;
}
静态类视窗夹
{
受保护的文本查看文本;
受保护按钮btn;
}
@凌驾
公共视图getView(最终整数位置、视图转换视图、视图组父视图){
持票人持票人;
if(convertView==null)
{    
convertView=充气机。充气(R.layout.rowbuttonlayout,null);
viewHolder=新的viewHolder();
viewHolder.text=(TextView)view.findViewById(R.id.label);
viewHolder.btn=(按钮)view.findViewById(R.id.button1);
convertView.setTag(viewHolder);
}
其他的
{
viewHolder=(viewHolder)convertView.getTag();
}
viewHolder.btn.setOnClickListener(新的OnClickListener()
{
公共void onClick(视图v)
{       
列表。删除(位置);
notifyDataSetChanged();
}
});
viewHolder.text.setText(list.get(position.getName());
返回视图;
}
@凌驾
public int getCount()
{
返回list.size();
}
@凌驾
公共长getItemId(int位置){
返回位置;
}
@凌驾
公共对象getItem(int位置){
返回列表。获取(位置);
}

您需要了解如何为listview创建自定义适配器。它几乎可以正常工作,但当列表中剩下3个项目时,删除项目就会停止…这里可能有什么问题?事实上,它是以非常随机的顺序删除的。.单击其他项目时删除另一个项目。.奇怪。.我需要做的就是替换此“列表。删除(位置);”使用您的行“list.remove(viewHolder.btn.getTag());”…你是救命恩人..谢谢!!是的,你是对的。但我无法通过代码来理解。也许你可以切换到HashMap并将字符串传递给侦听器,这样它将删除正确的条目。然后,完成后,你可以迭代映射中剩余的键来执行进一步的逻辑。
    //((ViewHolder) view.getTag()).text.setTag(list.get(position));
    list.remove(viewHolder.btn.getTag());
public class InteractiveArrayAdapter extends ArrayAdapter<Model> {

  private final List<Model> list;
  private final Activity context; 
  private MainActivity ma;

 LayoutInflater inflator;
  public InteractiveArrayAdapter(Activity context, List<Model> list)
  {
    super(context, R.layout.rowbuttonlayout, list);
    this.context = context;
    inflator =  context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);;
  }

  static class ViewHolder
  {
    protected TextView text;
    protected Button btn;
  }

  @Override
  public View getView(final int position, View convertView, ViewGroup parent) {
    ViewHolder viewHolder;
    if (convertView == null) 
    {    
      convertView = inflator.inflate(R.layout.rowbuttonlayout, null);
      viewHolder = new ViewHolder();

      viewHolder.text = (TextView) view.findViewById(R.id.label);
      viewHolder.btn = (Button) view.findViewById(R.id.button1);     
      convertView.setTag(viewHolder);
      }

    else 
    {
        viewHolder = (ViewHolder)convertView.getTag();
     }
    viewHolder.btn.setOnClickListener(new OnClickListener()
      {
            public void onClick(View v)
            {       
            list.remove(position);
                    notifyDataSetChanged();  

            }

      });

   viewHolder.text.setText(list.get(position).getName());
   return convertView;
  }

  @Override
  public int getCount()
  {
      return list.size();
  }

  @Override
  public long getItemId(int position) {
        return position;
    }

  @Override
  public Object getItem(int position) {
      return list.get(position);
  }