android菜鸟求助:ListView点击删除按钮时,总是最后一个item被删除

qq_34242806 2017-03-03 06:57:50



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

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


public View getView(final int position, View view, ViewGroup arg2) {
// TODO Auto-generated method stub
if(view == null){
view = inflater.inflate(R.layout.mission_item, null);
SharedPreferences shared_mission = getSharedPreferences("mission",
Activity.MODE_PRIVATE);

mission_name = (TextView) view.findViewById(R.id.pro_name);
mission_add = (TextView) view.findViewById(R.id.pro_add);
mission_phone = (TextView) view.findViewById(R.id.pro_phone);

mission_name.setText(shared_mission.getString("name", ""));
mission_add.setText(shared_mission.getString("address", ""));
mission_phone.setText(shared_mission.getString("phone", ""));
}
Button del = (Button) view.findViewById(R.id.del);
del.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {

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 view;
}
}
...全文
678 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
tecsunwong 2017-03-11
  • 打赏
  • 举报
回复
对了Holder.btnDelete.setTag(postion);也要写上 else { _Holder = (Holder) convertView.getTag(); } //====================重点在这里 要放在else后面==================================== _Holder.btnDelete.setOnClickListener(你写的onclicklistener); Holder.btnDelete.setTag(postion);
tecsunwong 2017-03-11
  • 打赏
  • 举报
回复
把事件注册放到ELSE后面去
tecsunwong 2017-03-11
  • 打赏
  • 举报
回复
你要在 你的ViewHolder类中加个button成员 private class Holder { //你自己定义的我不写了,我也不知道 Button btnDelete; } Holder _Holder; if (convertView == null) { convertView = getLayoutInflater().inflate(R.layout.customer_list_item, null); _Holder = new Holder(); _Holder.btnDelete = (Button) convertView.findViewById(R.id.btnDelete); convertView.setTag(_Holder); } else { _Holder = (Holder) convertView.getTag(); } //====================重点在这里 你放错位置了==================================== _Holder.btnDelete.setOnClickListener(你写的onclicklistener);
qq_34242806 2017-03-11
  • 打赏
  • 举报
回复
引用 15 楼 tecsunwong 的回复:
这是修改后的 但还是删掉了最后一……能帮忙看一下哪里还需要修改吗 @Override public View getView(int position, View convertView, ViewGroup arg2) { 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); Button 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); del.setTag(position); del.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Button button1=(Button)v; int i =(int)button1.getTag(); arrlist.remove(i); mission_adapter.notifyDataSetChanged(); } }); }else { viewHolder = (ViewHolder) convertView.getTag(); } return convertView; } class ViewHolder { //任务界面 TextView mission_name,mission_add,mission_phone; }
tecsunwong 2017-03-10
  • 打赏
  • 举报
回复
tecsunwong 2017-03-10
  • 打赏
  • 举报
回复
引用 13 楼 qq_34242806 的回复:
[quote=引用 12 楼 tecsunwong 的回复:] 看了一下,其实解决方法很简单, Button也可以setag ,getView 方法中给button settag就可以解决了 比如button1.setTag(position) 然后在你的button的点击事件中 void onClick(View v) { Button button1=(Button)v; int i =(int)button1.getTag() 然后取出位置,你想干嘛就干嘛 }
我改了一下 现在是这样写的,但还是原来的问题没有解决。。。。 viewHolder.del.setTag(position); viewHolder.del.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Button button1=(Button)v; int i =Integer.valueOf(String.valueOf(button1.getTag())).intValue(); // TODO Auto-generated method stub arrlist.remove(i); mission_adapter.notifyDataSetChanged(); } });[/quote] int i =Integer.valueOf(String.valueOf(button1.getTag())).intValue(); 这句写法明显有问题button1.getTag得到Object对像 你直接强转(int)button1.getTag()就可以了,你那么写法是STRING转INT搞错了,第2你的BUTTON不该作为成员变量,你把他作为成员变量之一,当然你N条信息显示之后,当然最后引用的是最后一个BUTTON,肯定得来得去是最后一个值 把红色圈圈的内容移到GETVIEW那个方法里面去,还有参考下上面几楼的VIEWHOLDER的写法
qq_34242806 2017-03-10
  • 打赏
  • 举报
回复
引用 12 楼 tecsunwong 的回复:
看了一下,其实解决方法很简单, Button也可以setag ,getView 方法中给button settag就可以解决了 比如button1.setTag(position) 然后在你的button的点击事件中 void onClick(View v) { Button button1=(Button)v; int i =(int)button1.getTag() 然后取出位置,你想干嘛就干嘛 }
我改了一下 现在是这样写的,但还是原来的问题没有解决。。。。 viewHolder.del.setTag(position); viewHolder.del.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Button button1=(Button)v; int i =Integer.valueOf(String.valueOf(button1.getTag())).intValue(); // TODO Auto-generated method stub arrlist.remove(i); mission_adapter.notifyDataSetChanged(); } });
tecsunwong 2017-03-10
  • 打赏
  • 举报
回复
看了一下,其实解决方法很简单, Button也可以setag ,getView 方法中给button settag就可以解决了 比如button1.setTag(position) 然后在你的button的点击事件中 void onClick(View v) { Button button1=(Button)v; int i =(int)button1.getTag() 然后取出位置,你想干嘛就干嘛 }
咸鱼bang 2017-03-10
  • 打赏
  • 举报
回复
引用 10 楼 qq_34242806 的回复:
[quote=引用 9 楼 zx4471 的回复:] [quote=引用 8 楼 qq_34242806 的回复:] [quote=引用 7 楼 zx4471 的回复:] 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(); } 你把这个改成 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); convertView.setTag(viewHolder); }else { viewHolder = (ViewHolder) convertView.getTag(); } 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", ""));
我试过了 然后结果就是每次加入一个item后,所有的item数据都变成一样的了。也不知道删除的item对不对[/quote] 。。。那你就这样 viewHolder.mission_name.setText(shared_mission.getString("name", "") + position); viewHolder.mission_add.setText(shared_mission.getString("address", "") + position); viewHolder.mission_phone.setText(shared_mission.getString("phone", "") + position); 不就知道是第几个了。 你之前把数据弄的都一样当然看不出来[/quote] 我试过了 每个item数据是不一样的 都是对应他的position没错,但删除的时候还是不管点击哪个item的删除都会删除最下面的……[/quote] 。。。肯定啊 你删了肯定是最后一个没了啊。。以为是+postition 。那个是固定的啊。。。从1开始23456这样的。 你自己写一个list。。比如 苹果、西瓜、栗子、之类的 你看下删除才知道删了什么。。。
qq_34242806 2017-03-09
  • 打赏
  • 举报
回复
引用 9 楼 zx4471 的回复:
[quote=引用 8 楼 qq_34242806 的回复:] [quote=引用 7 楼 zx4471 的回复:] 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(); } 你把这个改成 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); convertView.setTag(viewHolder); }else { viewHolder = (ViewHolder) convertView.getTag(); } 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", ""));
我试过了 然后结果就是每次加入一个item后,所有的item数据都变成一样的了。也不知道删除的item对不对[/quote] 。。。那你就这样 viewHolder.mission_name.setText(shared_mission.getString("name", "") + position); viewHolder.mission_add.setText(shared_mission.getString("address", "") + position); viewHolder.mission_phone.setText(shared_mission.getString("phone", "") + position); 不就知道是第几个了。 你之前把数据弄的都一样当然看不出来[/quote] 我试过了 每个item数据是不一样的 都是对应他的position没错,但删除的时候还是不管点击哪个item的删除都会删除最下面的……
咸鱼bang 2017-03-07
  • 打赏
  • 举报
回复
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(); } 你把这个改成 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); convertView.setTag(viewHolder); }else { viewHolder = (ViewHolder) convertView.getTag(); } 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", ""));
咸鱼bang 2017-03-07
  • 打赏
  • 举报
回复
引用 8 楼 qq_34242806 的回复:
[quote=引用 7 楼 zx4471 的回复:] 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(); } 你把这个改成 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); convertView.setTag(viewHolder); }else { viewHolder = (ViewHolder) convertView.getTag(); } 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", ""));
我试过了 然后结果就是每次加入一个item后,所有的item数据都变成一样的了。也不知道删除的item对不对[/quote] 。。。那你就这样 viewHolder.mission_name.setText(shared_mission.getString("name", "") + position); viewHolder.mission_add.setText(shared_mission.getString("address", "") + position); viewHolder.mission_phone.setText(shared_mission.getString("phone", "") + position); 不就知道是第几个了。 你之前把数据弄的都一样当然看不出来
qq_34242806 2017-03-07
  • 打赏
  • 举报
回复
引用 7 楼 zx4471 的回复:
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(); } 你把这个改成 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); convertView.setTag(viewHolder); }else { viewHolder = (ViewHolder) convertView.getTag(); } 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", ""));
我试过了 然后结果就是每次加入一个item后,所有的item数据都变成一样的了。也不知道删除的item对不对
qq_34242806 2017-03-05
  • 打赏
  • 举报
回复
引用 4 楼 qsw15923 的回复:
你试试不重用第二个参数,就不会有这个情况了
我试了下,又在getView内新设了一个view,出现的问题是所有的item显示的都是最后一次添加的item的信息。
qq_34242806 2017-03-05
  • 打赏
  • 举报
回复
我捣鼓了一天 使用了viewholder 但是结果是一样的… 是不是哪里用错了? 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.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { 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; } }
YXTS122 2017-03-04
  • 打赏
  • 举报
回复
帮你顶顶。。。。。。。。。。。。。。。。
  • 打赏
  • 举报
回复
你试试不重用第二个参数,就不会有这个情况了
  • 打赏
  • 举报
回复
因为你重用了getView的第二个参数,所以出现了这个情况,这个要用ViewHolder解决,感觉不是几句话就说的清楚的……
justnews1212 2017-03-04
  • 打赏
  • 举报
回复
加上ViewHoler类(不知道怎么写到度娘去找),然后viewHolder.del设置监听。本质是什么时候触发getview()问题

80,350

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧