Android新手急求:ListView点击删除按钮时,总是最后一个item被删除

如题,我的ListView的每个item都有一个删除按钮,但是每次点击按钮后都是删除了最后一个item。

   调试后position是正确的,索引是没有问题的,每次删除的都是正确的位置,而且每次item一删除就调用notifyDataSetChanged()去刷新,这个问题困扰好几天了…麻烦大神帮帮忙。

        另外我这个MyAdapter类是写在MainActivity类里面的,我是有添加到arr里的,纯粹是为了方便……我不知道是不是这个引起的问题。

        public class MyAdapter  extends BaseAdapter {
    private Context context;
    private LayoutInflater inflater;
    public ArrayList<String> arr;
    public MyAdapter(Context context) {
        super();
        this.context = context;
        inflater = LayoutInflater.from(context);
        arr = new ArrayList<String>();
    }
    @Override
    public int getCount() {
        return arr.size();
    }
    @Override
    public Object getItem(int arg0) {
        // TODO Auto-generated method stub
        return arg0;
    }
    @Override
    public long getItemId(int arg0) {
        // TODO Auto-generated method stub
        return arg0;
    }
    @Override
    public View getView(final int position, View convertView, ViewGroup arg2) {
        // TODO Auto-generated method stub
        ViewHolder viewHolder = null;
        if(convertView == null){
            viewHolder = new ViewHolder();
            convertView = inflater.inflate(R.layout.mission_item, null);

            viewHolder.mission_name = (TextView) convertView.findViewById(R.id.pro_name);
            viewHolder.mission_add = (TextView) convertView.findViewById(R.id.pro_add);
            viewHolder.mission_phone = (TextView) convertView.findViewById(R.id.pro_phone);
            viewHolder.del = (Button) convertView.findViewById(R.id.del);
            SharedPreferences shared_mission = getSharedPreferences("mission",
                    Activity.MODE_PRIVATE);
            viewHolder.mission_name.setText(shared_mission.getString("name", ""));
            viewHolder.mission_add.setText(shared_mission.getString("address", ""));
            viewHolder.mission_phone.setText(shared_mission.getString("phone", ""));
            convertView.setTag(viewHolder);
        }else
        {
            viewHolder = (ViewHolder) convertView.getTag();
        }
        viewHolder.del.setTag(position);
        viewHolder.del.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                arr.remove(position);
                mission_adapter.notifyDataSetChanged();
            }
        });
        listview.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> arg0, View arg1, final int arg2,
                                    long arg3) {             
                Intent intent = new Intent();
                intent.setClass(MainActivity.this, MissionInfo.class);
                startActivity(intent);
            }
        });
        return convertView;
    }
     class ViewHolder
    {
        //任务界面
        TextView mission_name,mission_add,mission_phone;
        Button del;
    }
}

6个回答

调试position传的值正确么

qq_34242806
qq_34242806 position是正确的
大约 3 年之前 回复

position是正确的

你的arr这个集合不要在MyAdapter构造函数里NEW出来,你在MyAdapter构造函数里传进一个集合进来,在赋值给arr,我猜测是数据源问题

qq_34242806
qq_34242806 不好意思我不太懂,写了好几次都是错的,我java接触的不多…这个要怎样传到构造函数来呢?能大概写一下吗?麻烦了
大约 3 年之前 回复

arr直接放在Activity或者构造器传进来,估计是数据源出问题了 没有完整代码也看不出什么

jinjin10086
GJianAJ 回复qq_34242806: 另外你的getItem方法不对 ,应该是arr.get(arg0),另外你这个参数默认出来应该是position,你这个说明没有关联源码,百度关联系下
大约 3 年之前 回复
jinjin10086
GJianAJ 回复qq_34242806: 应该是可以的 而且在activity的集合在内部类是能直接用的 不需要再传进去
大约 3 年之前 回复
qq_34242806
qq_34242806 修改成这样可以吗? arrt是在MainActivity里定义并且new出来的
大约 3 年之前 回复
qq_34242806
qq_34242806 public ArrayList<String> arrlist; public MyAdapter(Context context,ArrayList<String> arrt) { super(); this.context = context; inflater = LayoutInflater.from(context); arrlist = arrt; }
大约 3 年之前 回复

写个内部类。

 class DelOnClickListener implements OnClickListener{
 int position;
 public DelOnClickListener(int position){
 this.position=position;
 }
                        @Override
            public void onClick(View v) {
                arr.remove(position);
                mission_adapter.notifyDataSetChanged();
            }
 }

setonclick改下
viewHolder.del.setOnClickListener(new DelOnClickListener(position));

position错了吧

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐