ListView中不同的行布局

这篇文章与这个ViewHolder不能正常工作有关 。 在ViewHolder文章中,我正在关注如何在ListView上使用ViewHolder的教程。 我现在想要的是让ListView上的最后一个项目有不同的布局。 这是我的代码:

 int lastpos = mList.size()-1; System.out.println("position: "+position+" mlist: "+lastpos); if(position==lastpos){ view = vi.inflate(R.layout.list_item_record, null); holder.textView = (TextView)view.findViewById(R.id.record_view); }else{ view = vi.inflate(R.layout.list_item_bn, null); holder.textView = (TextView)view.findViewById(R.id.tv_name); } view.setTag(holder); 

我只是得到ListView大小减1并有一个条件,检查当前位置是否等于最后一个项目。 但是,此代码将最后一项的布局设置为与其余项相同。 getView方法完整代码:

 private class CustomListAdapter extends ArrayAdapter { private ArrayList mList; private Context mContext; public CustomListAdapter(Context context, int textViewResourceId, ArrayList list) { super(context, textViewResourceId, list); this.mList = list; this.mContext = context; } public View getView(final int position, View convertView, ViewGroup parent) { View view = convertView; final ToggleButton tb; if (view == null) { ViewHolder holder = new ViewHolder(); LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); int lastpos = mList.size()-1; System.out.println("position: "+position+" mlist: "+lastpos); if(position==lastpos){ view = vi.inflate(R.layout.list_item_record, null); holder.textView = (TextView)view.findViewById(R.id.record_view); }else{ view = vi.inflate(R.layout.list_item_bn, null); holder.textView = (TextView)view.findViewById(R.id.tv_name); } view.setTag(holder); } final ItemsDisplay listItem = (ItemsDisplay) mList.get(position); if (listItem != null) { ViewHolder holder1 = (ViewHolder)view.getTag(); holder1.textView.setText(listItem.getTag()); view.setOnClickListener(new OnClickListener() { public void onClick(View arg0) { //--clickOnListItem Toast.makeText(getBaseContext(), "Button is "+position+" "+listItem.getTag(), Toast.LENGTH_LONG).show(); } }); tb = (ToggleButton) view.findViewById(R.id.toggleButton); tb.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { if(tb.isChecked()){ Toast.makeText(getBaseContext(), "Button is "+position+" checked:"+tb.isChecked()+" "+listItem.getTag(), Toast.LENGTH_LONG).show(); }else{ Toast.makeText(getBaseContext(), "Button is "+position+" checked:"+tb.isChecked()+" "+listItem.getTag(), Toast.LENGTH_LONG).show(); } } }); } return view; } } 

有人可以帮我吗?

Solutions Collecting From Web of "ListView中不同的行布局"

为适配器实现getItemViewType()getViewTypeCount()

 @Override public int getViewTypeCount() { return 2; //return 2, you have two types that the getView() method will return, normal(0) and for the last row(1) } 

和:

 @Override public int getItemViewType(int position) { return (position == this.getCount() - 1) ? 1 : 0; //if we are at the last position then return 1, for any other position return 0 } 

然后在getView()方法中找出膨胀的视图types:

 public View getView(final int position, View convertView, ViewGroup parent) { View view = convertView; int theType = getItemViewType(position); if (view == null) { ViewHolder holder = new ViewHolder(); LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); if (theType == 0) { // inflate the ordinary row view = vi.inflate(R.layout.list_item_bn, null); holder.textView = (TextView)view.findViewById(R.id.tv_name); } else if (theType == 1){ // inflate the row for the last position view = vi.inflate(R.layout.list_item_record, null); holder.textView = (TextView)view.findViewById(R.id.record_view); } view.setTag(holder); } //other stuff here, keep in mind that you have a different layout for your last position so double check what are trying to initialize } 

来自评论的示例: http : //pastebin.com/gn65240B (或https://gist.github.com/2641914

问题是,一旦你膨胀的观点,它可以在任何位置多次重复使用。 我build议采用以下方法:除了最后一个项目(包括视图持有者)之外,其他所有项目都会膨胀,但是对于最后一个项目,您将引用保留为CustomListAdapter一个字段,并在每次请求最后一个项目时返回它:

 private class CustomListAdapter extends ArrayAdapter { ... private View mLastItem; public View getView(final int position, View convertView, ViewGroup parent) { View view = convertView; ... int lastpos = mList.size()-1; if (view == null) { ViewHolder holder = new ViewHolder(); LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); if (position == lastpos) { view = vi.inflate(R.layout.list_item_record, null); holder.textView = (TextView)view.findViewById(R.id.record_view); mLastItem = view; } else { view = vi.inflate(R.layout.list_item_bn, null); holder.textView = (TextView)view.findViewById(R.id.tv_name); } view.setTag(holder); } if (position == lastpos) { ... // Update the last item here return mLastItem; } ... } }