我尝试使用两种类型的视图和两种类型的ViewHolrdes,但收到错误:
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)
这是我的适配器:
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,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; } }
解决方法
更换
@Override public int getItemViewType(int pos) { if (pos < friends.size()) return 1; return 2; }
通过
@Override public int getItemViewType(int pos) { if (pos < friends.size()) return 0; return 1; }
从the Adapter documentation for the method getItemViewType
(我的重点):
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.
此时,您将返回视图类型的值1和2.您需要返回值0和1,以满足粗体条件.