2015-02-07 13 views
6

tôi cố gắng sử dụng hai loại quan điểm và hai loại ViewHolrdes, nhưng đã nhận lỗi:ViewHolder ArrayIndexOutOfBoundsException: length = 2; index = 2

java.lang.ArrayIndexOutOfBoundsException: length=2; index=2 
     at android.widget.AbsListView$RecycleBin.addScrapView(AbsListView.java:6705) 
     at android.widget.AbsListView.trackMotionScroll(AbsListView.java:5210) 
     at android.widget.AbsListView$FlingRunnable.run(AbsListView.java:4368) 
     at android.view.Choreographer$CallbackRecord.run(Choreographer.java:776) 
     at android.view.Choreographer.doCallbacks(Choreographer.java:579) 
     at android.view.Choreographer.doFrame(Choreographer.java:547) 
     at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:762) 
     at android.os.Handler.handleCallback(Handler.java:800) 
     at android.os.Handler.dispatchMessage(Handler.java:100) 
     at android.os.Looper.loop(Looper.java:194) 
     at android.app.ActivityThread.main(ActivityThread.java:5371) 
     at java.lang.reflect.Method.invokeNative(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:525) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600) 
     at dalvik.system.NativeStart.main(Native Method) 

Và đây là bộ chuyển đổi của tôi:

public class FriendsListAdapterFromKesh extends ArrayAdapter<FriendListEntryItem> { 
    List<FriendListEntryItem> friends; 
    List<FriendListEntryItem> friendsWithoutPoints; 
    Context context; 
    private LayoutInflater inflater; 
    private LayoutInflater mLayoutInflater; 
    private static String ROOT_DIRECTORY_PATH = Environment.getExternalStorageDirectory() + File.separator + ".SleepKeeker/Photos old"; 
    FriendsTab friendsTab; 

    public FriendsListAdapterFromKesh(Context context, final List<FriendListEntryItem> friends, final List<FriendListEntryItem> friendsWithoutPoints) { 
     super(context, 0); 
     this.context = context; 
     inflater = LayoutInflater.from(context); 
     this.friendsWithoutPoints = friendsWithoutPoints; 
     this.friends = friends; 
     friendsTab = new FriendsTab(); 
     mLayoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 

    public void updateList(List<FriendListEntryItem> newlist1, List<FriendListEntryItem> newlist2) { 
     friends.clear(); 
     friends.addAll(newlist1); 
     friendsWithoutPoints.clear(); 
     friendsWithoutPoints.addAll(newlist2); 
     this.notifyDataSetChanged(); 
    } 

    public List<FriendListEntryItem> getFriends() { 
     return friends; 
    } 

    @Override 
    public int getCount() { 
     return friends.size() + friendsWithoutPoints.size(); 
    } 

    public String getIdSocTypeName(int position) { 

     if (friends == null || position + 1 >= friends.size()) { 
      return ""; 
     } 
     FriendListEntryItem ei = friends.get(position - 1); 
     return ei.userId + "," + ei.socType + "," + ei.name; 
    } 

    static class ViewHolder1 { 
     public ImageView image = null; 
     public TextView title = null; 
     public TextView subtitle = null; 
    } 

    static class ViewHolder2 { 
     public ImageView image; 
     public TextView title; 
     public TypefacedButton button; 
    } 

    @Override 
    public int getItemViewType(int pos) { 
     if (pos < friends.size()) 
      return 1; 
     return 2; 
    } 

    //@TargetApi(Build.VERSION_CODES.JELLY_BEAN) 
    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     int viewType = getItemViewType(position); 
     ViewHolder1 viewHolder1 = null; 
     ViewHolder2 viewHolder2 = null; 
     if (convertView == null) { 
      if (viewType == 1) { 
       LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
       convertView = inflater.inflate(R.layout.list_frnds_item_with_points, parent, false); 
       viewHolder1 = new ViewHolder1(); 
       viewHolder1.title = (TextView) convertView.findViewById(R.id.list_item_title_friend); 
       viewHolder1.image = (ImageView) convertView.findViewById(R.id.imageFriendAva); 
       viewHolder1.subtitle = (TextView) convertView.findViewById(R.id.list_item_friend_woke_time); 
       convertView.setTag(viewHolder1); 
      } else { 
       LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
       convertView = inflater.inflate(R.layout.list_frnds_item_without_points, parent, false); 

       viewHolder2 = new ViewHolder2(); 
       viewHolder2.title = (TextView) convertView.findViewById(R.id.list_item_title_friend); 
       viewHolder2.image = (ImageView) convertView.findViewById(R.id.imageFriendAva); 
       viewHolder2.button = (TypefacedButton) convertView.findViewById(R.id.inviteButton); 
       viewHolder2.button.setClickListner(); 
       convertView.setTag(viewHolder2); 
      } 

     } else { 
      if (viewType == 1) { 
       viewHolder1 = (ViewHolder1) convertView.getTag(); 
      } else { 
       viewHolder2 = (ViewHolder2) convertView.getTag(); 
      } 
     } 
     if (viewType == 1) { 
      final FriendListEntryItem ei = friends.get(position); 
      viewHolder1.title.setText(ei.name); 
      viewHolder1.subtitle.setText(ei.wokeTime); 
      File picture = findPicture(ei.name); 
      if (picture != null && picture.exists()) { 
        Picasso.with(context).load("file://" + picture.getAbsolutePath()).fit().centerCrop().into(viewHolder1.image); 
      } 

     } else { 
       final FriendListEntryItem ei2 = friendsWithoutPoints.get(position - friends.size()); 
       viewHolder2.title.setText(ei2.name); 
       viewHolder2.button.setFriendItem(ei2); 
       File picture = findPicture(ei2.name); 
       if (picture != null && picture.exists()) { 
        Picasso.with(context).load("file://" + picture.getAbsolutePath()).fit().centerCrop().into(viewHolder2.image); 
       } 
     } 
     return convertView; 
    } 
    @Override 
    public int getViewTypeCount() { 
     return 2; 
    } 

    private File findPicture(String name) { 
     File root = new File(ROOT_DIRECTORY_PATH); 
     if (root!= null) 
     { 
      File[] files = root.listFiles(); 
      if (files == null) 
       return null; 

      for (int i = 0; i<files.length; i++) { 
       Log.d("qedsds", "" + files[i].getName()); 
       if (files[i].getName().contains(name)) 
        return files[i]; 
      } 
     } 
     return null; 
    } 
} 

Lỗi xuất hiện khi tôi di chuyển qua danh sách. Nhưng tôi không thể hiểu tại sao. tôi đã dành rất nhiều thời gian đã giải quyết vấn đề này, nhưng không có kết quả

+0

thể trùng lặp của [ArrayIndexOutOfBoundsException với tùy chỉnh Android Adapter cho nhiều quan điểm trong ListView] (http://stackoverflow.com/questions/2596547/arrayindexoutofboundsexception-with-custom-android-adapter-for-multiple-views-in) – stkent

+0

bạn có thể đăng logcat đầy đủ của ngoại lệ này bởi vì tôi cũng nhận được lỗi tương tự nhưng tôi nghĩ rằng nó có liên quan đến bố trí Coordianator một số nơi. –

Trả lời

11

Thay

@Override 
public int getItemViewType(int pos) { 
    if (pos < friends.size()) 
     return 1; 
    return 2; 
} 

bởi

@Override 
public int getItemViewType(int pos) { 
    if (pos < friends.size()) 
     return 0; 
    return 1; 
} 

Từ the Adapter documentation for the method getItemViewType (tôi nhấn mạnh):

Returns

An integer representing the type of View. Two views should share the same type if one can be converted to the other in getView(int, View, ViewGroup). Note: Integers must be in the range 0 to getViewTypeCount() - 1. IGNORE_ITEM_VIEW_TYPE can also be returned.

Hiện tại, bạn đang trả về giá trị 1 và 2 cho chế độ xem t ype. Bạn cần trả về giá trị 0 và 1 để thỏa mãn điều kiện in đậm.

+1

Câu trả lời hay! Tôi đã có 6 Người xem có id [1,2,3,4,5,6] sau đó tôi phải thêm ** 0 ** vào số nguyên ID loại xem sao cho các ID chế độ xem của tôi bây giờ là [0,1,2,3, 4,5] – sud007

Các vấn đề liên quan