我跟随this库添加拖放功能我的列表视图。将第一个项目移动到第二个位置时一切都很好。但是当我将listview第一个元素移动到第三位应用程序崩溃时。为了解释我的情况,我添加了图片。我认为它只是在Swap项目行引起的,但我认为我的代码是正确的。当我尝试将第一项替换为第三项时,应用程序崩溃了。任何帮助对我都有价值。谢谢你的帮助。
这是我的适配器代码。
public class NavigationDrawerListViewAdapter extends BaseAdapter implements Communicator,Swappable{
private LayoutInflater mInflater;
public ArrayList<NavigationDrawerFragment.ListItem> myItems;
public NavigationDrawerListViewAdapter(Context activity, ArrayList<NavigationDrawerFragment.ListItem> listItemElements) {
mInflater = (LayoutInflater) activity.getSystemService(
Context.LAYOUT_INFLATER_SERVICE);
myItems = listItemElements;
}
@Override
public int getCount() {
return myItems.size();
}
@Override
public NavigationDrawerFragment.ListItem getItem(int position) {
return myItems.get(position);
}
@Override
public long getItemId(int position) {
return myItems.get(position).hashCode();
}
@Override
public boolean hasStableIds(){
return true;
}
@Override
public View getView(final int position, View convertView, final ViewGroup parent) {
View v = convertView;
final ViewHolder holder;
final NavigationDrawerFragment.ListItem i = myItems.get(position);
if (i != null) {
holder = new ViewHolder();
convertView = mInflater.inflate(R.layout.navigation_drawer_listview_simple, null);
holder.text = (TextView) convertView.findViewById(R.id.textView123);
holder.text.setText(i.textdata);
convertView.setTag(holder);
parent.setTag(holder);
holder.text.setTag(position);
}
return convertView;
}
@Override
public void respond(String name) {
}
@Override
public void sendData(String url, String type) {
}
@Override
public void sendMapValues(Geometry featureGeometry, Symbol featureSymbol, Object featureAttrValues) {
//doinNothing
}
@Override
public void swapItems(int i, int i2) {
NavigationDrawerFragment.ListItem obj1 = myItems.get(i);
myItems.remove(i);
myItems.add(i2,obj1);
this.notifyDataSetChanged();
}
class ViewHolder {
TextView text;
}
}
答案 0 :(得分:2)
我认为您的代码会将第一个项目添加到第二个位置,但第二个项目会被删除。这在ArrayList内部发生,而不是在GUI中发生。
我建议使用一种技术来交换这两个项目,使用临时对象进行基本交换。这次temp是obj1。 使用您的风格的示例代码:
public void swapItems(int i, int i2) {
NavigationDrawerFragment.ListItem obj1 = myItems.get(i);
myItems.set(i, myItems.get(i2);
myItems.set(i2, obj1);
}
注意:我使用 ArrayList set 方法而不是add()。