到目前为止,我一直在开发Android应用程序。我想将DynamicListview的拖放功能添加到我的ListView中。我关注Google的tutorial并使用此教程代码。我成功添加了此功能,但drap drop重复工作,当我触摸listview元素并将其拖动到另一行时,它再次创建另一个listview元素。当我从listview元素释放我的手指时,它正常工作.Google的教程也正常工作它没有遇到这个问题。为了清除我的问题,我添加了两个视频。首先我的视频; drag-drop issue和工作良好google's tutorial video(正如您在视频中看到的那样,当我尝试移动区域时,区域字段在每次移动时都会重复,Google的教程效果很好)
我该如何解决这个问题。
我的代码很长,所以我在github gist上分享了;
这是我的DynamicListView类;
https://gist.github.com/salihyalcin/bd9a3c23179f44212419
这是我的NavigationDrawer类:
https://gist.github.com/salihyalcin/620467a96fdce3129d1b
最后我的NavigationDrawerListViewAdapter:
答案 0 :(得分:3)
我主要回顾了DynamicListView和NavigationDrawerListViewAdapter类中的代码。正如我在评论中所说,我熟悉DynamicListView代码,你的代码似乎很好。
我看到的问题是你的originalItem
在原始(错误)位置保持可见但在内部项目(在NavigationDrawerListViewAdapter中的ArrayList对象中)不再处于相同位置在ArrayList中。这是一个强烈的信号,表明该项目没有在正确的时间刷新。您确实在DynamicListView中调用了getAdapter()。notifyDataSetChanged(),但这仅适用于要移动的2个项目。未移动的项目(原始项目)保持在相同的错误位置,但需要刷新以更新到正确的位置。在视觉上我知道这不明显!
我怀疑NavigationDrawerListViewAdapter中的 getView 方法需要更新。方法getView负责显示Listiview中的所有项目! getView中的代码具有相当奇怪的编码技术,需要按照传统方式进行编码,正如Google developer.android.com所建议的那样。好的部分是我认为您不需要重大代码更新来解决您的问题。
代码建议:
public View getView(final int position, View convertView, final ViewGroup parent) {
ViewHolder holder = null;
final NavigationDrawerFragment.ListItem i = myItems.get(position);
if (convertView == null) {
holder = new ViewHolder();
convertView = mInflater.inflate(R.layout.navigation_drawer_listview_simple, null);
holder.text = (TextView) convertView.findViewById(R.id.textView123);
convertView.setTag(holder);
}
else {
holder = (ViewHolder) convertView.getTag();
}
holder.text.setText(i.textdata);
return convertView;
}
注意:
holder.text.setText
确保即使是不移动的项目也会像其他项目一样刷新。convertView
不是= null,则表示视图已被回收并已显示在当前视图中。我认为这是你的问题。