1

你好计算器,列表视图崩溃时滚动

我我的网页上有一个ListView - 问题是,它每次我试图滚动它在某个方向崩溃。这不是一个普通ListView,我使用的是GitHub的库,可以在这里找到: https://github.com/terlici/DragNDropList

这里是我的列表的设置:

DragNDropListView lv = (DragNDropListView) getListView(); 
DragNDropSimpleAdapter adapter = new DragNDropSimpleAdapter(this, listItems, R.layout.custom_row_view, new String[]{"name", "current", "reset"}, new int[] {R.id.text1, R.id.text2, R.id.text3}, R.id.handler); 
lv.setDragNDropAdapter(adapter); 

修订LOGACT

03-09 14:48:43.667: E/AndroidRuntime(18869): FATAL EXCEPTION: main 
03-09 14:48:43.667: E/AndroidRuntime(18869): java.lang.ArrayIndexOutOfBoundsException 
03-09 14:48:43.667: E/AndroidRuntime(18869): at com.terlici.dragndroplist.DragNDropSimpleAdapter.getView(DragNDropSimpleAdapter.java:66) 
03-09 14:48:43.667: E/AndroidRuntime(18869): at android.widget.AbsListView.obtainView(AbsListView.java:1409) 
03-09 14:48:43.667: E/AndroidRuntime(18869): at android.widget.ListView.makeAndAddView(ListView.java:1745) 
03-09 14:48:43.667: E/AndroidRuntime(18869): at android.widget.ListView.fillDown(ListView.java:670) 
03-09 14:48:43.667: E/AndroidRuntime(18869): at android.widget.ListView.fillGap(ListView.java:641) 
03-09 14:48:43.667: E/AndroidRuntime(18869): at android.widget.AbsListView.trackMotionScroll(AbsListView.java:3399) 
03-09 14:48:43.667: E/AndroidRuntime(18869): at android.widget.AbsListView.onTouchEvent(AbsListView.java:2233) 
03-09 14:48:43.667: E/AndroidRuntime(18869): at android.widget.ListView.onTouchEvent(ListView.java:3446) 
03-09 14:48:43.667: E/AndroidRuntime(18869): at com.terlici.dragndroplist.DragNDropListView.onTouchEvent(DragNDropListView.java:116) 
03-09 14:48:43.667: E/AndroidRuntime(18869): at android.view.View.dispatchTouchEvent(View.java:3885) 
03-09 14:48:43.667: E/AndroidRuntime(18869): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:903) 
03-09 14:48:43.667: E/AndroidRuntime(18869): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:942) 
03-09 14:48:43.667: E/AndroidRuntime(18869): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:942) 
03-09 14:48:43.667: E/AndroidRuntime(18869): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:942) 
03-09 14:48:43.667: E/AndroidRuntime(18869): at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1691) 
03-09 14:48:43.667: E/AndroidRuntime(18869): at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1125) 
03-09 14:48:43.667: E/AndroidRuntime(18869): at android.app.Activity.dispatchTouchEvent(Activity.java:2096) 
03-09 14:48:43.667: E/AndroidRuntime(18869): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1675) 
03-09 14:48:43.667: E/AndroidRuntime(18869): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:942) 
03-09 14:48:43.667: E/AndroidRuntime(18869): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:942) 
03-09 14:48:43.667: E/AndroidRuntime(18869): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:942) 
03-09 14:48:43.667: E/AndroidRuntime(18869): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:942) 
03-09 14:48:43.667: E/AndroidRuntime(18869): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:942) 
03-09 14:48:43.667: E/AndroidRuntime(18869): at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1691) 
03-09 14:48:43.667: E/AndroidRuntime(18869): at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1125) 
03-09 14:48:43.667: E/AndroidRuntime(18869): at android.app.Activity.dispatchTouchEvent(Activity.java:2096) 
03-09 14:48:43.667: E/AndroidRuntime(18869): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1675) 
03-09 14:48:43.667: E/AndroidRuntime(18869): at android.view.ViewRoot.deliverPointerEvent(ViewRoot.java:2194) 
03-09 14:48:43.667: E/AndroidRuntime(18869): at android.view.ViewRoot.handleMessage(ViewRoot.java:1878) 
03-09 14:48:43.667: E/AndroidRuntime(18869): at android.os.Handler.dispatchMessage(Handler.java:99) 
03-09 14:48:43.667: E/AndroidRuntime(18869): at android.os.Looper.loop(Looper.java:130) 
03-09 14:48:43.667: E/AndroidRuntime(18869): at android.app.ActivityThread.main(ActivityThread.java:3683) 
03-09 14:48:43.667: E/AndroidRuntime(18869): at java.lang.reflect.Method.invokeNative(Native Method) 
03-09 14:48:43.667: E/AndroidRuntime(18869): at java.lang.reflect.Method.invoke(Method.java:507) 
03-09 14:48:43.667: E/AndroidRuntime(18869): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
03-09 14:48:43.667: E/AndroidRuntime(18869): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
03-09 14:48:43.667: E/AndroidRuntime(18869): at dalvik.system.NativeStart.main(Native Method) 
03-09 14:48:48.897: I/Process(18869): Sending signal. PID: 18869 SIG: 9 

导致此崩溃的lib中的类(DragNDropSimpleAdapter第66行): ` public class DragNDropSimpleAdapter扩展了SimpleAdapter,实现了DragNDropAdapter {int; mPosition []; int mHandler;

public DragNDropSimpleAdapter(Context context, List<? extends Map<String, ?>> data, int resource, String[] from, int[] to, int handler) { 
     super(context, data, resource, from, to); 

     mHandler = handler; 
     setup(data.size()); 
    } 

    private void setup(int size) { 
     mPosition = new int[size]; 

     for (int i = 0; i < size; ++i) mPosition[i] = i; 
    } 

    @Override 
    public View getDropDownView(int position, View view, ViewGroup group) { 
     return super.getDropDownView(mPosition[position], view, group); 
    } 

    @Override 
    public Object getItem(int position) { 
     return super.getItem(mPosition[position]); 
    } 

    @Override 
    public int getItemViewType(int position) { 
     return super.getItemViewType(mPosition[position]); 
    } 

    @Override 
    public long getItemId(int position) { 
     return super.getItemId(mPosition[position]); 
    } 

    @Override 
    public View getView(int position, View view, ViewGroup group) { 
     return super.getView(mPosition[position], view, group); 
    } 

    @Override 
    public boolean isEnabled(int position) { 
     return super.isEnabled(mPosition[position]); 
    } 

    @Override 
    public void onItemDrag(DragNDropListView parent, View view, int position, long id) { 

    } 

    @Override 
    public void onItemDrop(DragNDropListView parent, View view, int startPosition, int endPosition, long id) { 
     int position = mPosition[startPosition]; 

     if (startPosition < endPosition) 
      for(int i = startPosition; i < endPosition; ++i) 
       mPosition[i] = mPosition[i + 1]; 
     else if (endPosition < startPosition) 
      for(int i = startPosition; i > endPosition; --i) 
       mPosition[i] = mPosition[i - 1]; 

     mPosition[endPosition] = position; 
    } 

    @Override 
    public int getDragHandler() { 
     return mHandler; 
    } 
} 

我的XML代码

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" 
    android:id="@+id/relativelayout" > 

    <LinearLayout 
     android:id="@+id/profile_and_reset" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_below="@+id/relativelayout" 
     android:orientation="horizontal" > 

     <TextView 
      android:id="@+id/profileView" 
      android:layout_width="0dip" 
      android:layout_height="wrap_content" 
      android:layout_weight="0.94" 
      android:layout_gravity="center_vertical" 
      android:textSize="18sp"/> 

     <Button 
      android:id="@+id/reset" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_gravity="right" 
      android:text="@string/reset_button" /> 
    </LinearLayout> 

<View 
    android:layout_width="fill_parent" 
    android:layout_height="1dp" 
    android:background="@android:color/darker_gray" 
    android:layout_below="@+id/profile_and_reset" 
    android:id="@+id/seperator"/> 

    <com.terlici.dragndroplist.DragNDropListView 
     android:id="@android:id/list" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:layout_below="@+id/seperator" 
     android:layout_above="@+id/second_seperator"/> 

<View 
    android:layout_width="fill_parent" 
    android:layout_height="1dp" 
    android:background="@android:color/darker_gray" 
    android:id="@+id/second_seperator" 
    android:layout_above="@+id/add_and_instructions"/> 

    <LinearLayout 
     android:id="@+id/add_and_instructions" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_below="@+id/relativelayout" 
     android:layout_alignParentBottom="true" 
     android:orientation="horizontal" > 

    <Button 
     android:id="@+id/add" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="bottom" 
     android:text="@string/add_button" /> 

    <TextView 
     android:id="@+id/textView1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="@string/instructions" /> 

    </LinearLayout> 

</RelativeLayout> 

UPDATE

现在

,我切换到普通的活动,这种方法是行不通的:

@SuppressWarnings("unchecked") 
protected void onListItemClick(ListView l, View v, int position, long id) { 
     // TODO Auto-generated method stub 
     if(lv.isClickable()){ 
      super.onListItemClick(l, v, position, id); 
      Map<String, String> map = (Map<String, String>) lv.getAdapter().getItem(position); 
      String scurrents = map.get("current"); 
      String getnames = map.get("name"); 
      String getname = java.net.URLEncoder.encode(getnames); 

      int current = Integer.parseInt(scurrents); 
      if(current>0){ 
       int newcurrent = current-1; 

       SetSql UC = new SetSql(this); 
       UC.open(); 
       UC.changeCurrent(newcurrent, current, getname); 
       UC.close(); 
       onResume(); 
      } 
     } 
} 

我我得到了一个错误super.onListItemClick,因为它不适用于活动。我该如何解决这个问题?

+0

它,因为你正在访问阵列出来的指标后你的代码获得更多帮助 – DjHacktorReborn 2013-03-09 11:17:43

+0

@DjHacktorReborn我没有访问任何数组..虽然,我会发布该代码中给出错误的libs代码。 – arielschon12 2013-03-09 11:21:26

+0

@DjHacktorReborn更多附加程序码! – arielschon12 2013-03-09 11:23:46

回答

0

由于getView()尝试访问数组超出范围,我认为这是由于listView未被正确引用以连接到适配器,您正在运行该错误。

DragNDropListView lv = (DragNDropListView)findViewById(R.id.list);

+0

当删除'android.R.id.list'并用'R.id.list'替换它时,我得到以下错误:'列表无法解析或不是字段' – arielschon12 2013-03-09 11:27:37

+0

在这种情况下,您需要* *清理并建立你的项目。即使Eclipse建议你这样做,也不要使用android.R。执行清理和构建。还要确保你的xml文件没有任何错误。 – Swayam 2013-03-09 11:28:48

+0

在我的XML文件中,该listview id的设置是这样的:'android:id =“@ android:id/list”'这样好吗? – arielschon12 2013-03-09 11:29:58

0

在你的logcat的文件中显示:

你必须有你的listview设置好的的id是

android.R.id.list 
+0

这已修复,请在我的帖子中查看我的代码。然而,它仍然不能正常工作(看看logcat,它也被更新了) – arielschon12 2013-03-09 12:58:13