Android SecionList和Holder
我有一个带有部分的列表,但是这个列表视图非常慢 我需要一个支架,但我不知道怎样才能弄到 当我有一种观点时,它很简单,但在这里我遇到了问题 我创建了holder,但当ListView显示时,我看到: “头衔”、“头衔”、“头衔”、“物品”、“物品” “头衔”、“头衔”、“头衔”、“物品” “滴度”、“标题”、“标题”、“项目”、“项目”、“项目” 这是我的代码:Android SecionList和Holder,android,listview,android-arrayadapter,Android,Listview,Android Arrayadapter,我有一个带有部分的列表,但是这个列表视图非常慢 我需要一个支架,但我不知道怎样才能弄到 当我有一种观点时,它很简单,但在这里我遇到了问题 我创建了holder,但当ListView显示时,我看到: “头衔”、“头衔”、“头衔”、“物品”、“物品” “头衔”、“头衔”、“头衔”、“物品” “滴度”、“标题”、“标题”、“项目”、“项目”、“项目” 这是我的代码: public class EntryAdapter extends ArrayAdapter<Item> { privat
public class EntryAdapter extends ArrayAdapter<Item> {
private ArrayList<Item> items;
private LayoutInflater vi;
Context context;
private String nazwa;
public EntryAdapter(Context context,ArrayList<Item> items, String nazwa) {
super(context,0, items);
this.items = items;
this.context = context;
this.nazwa = nazwa;
vi = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
。与视图持有者讨论listview性能
。查看标题下链接中的文档在视图保持架中保持视图对象
根据文件:
在滚动ListView期间,您的代码可能会频繁调用findViewById(),这会降低性能。即使适配器返回一个膨胀视图进行循环,您仍然需要查找元素并更新它们。避免重复使用findViewById()的一种方法是使用“视图持有者”设计模式
viewholder的示例
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
ViewHolder holder;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.list, null);
convertView.setLayoutParams(new AbsListView.LayoutParams(LayoutParams.FILL_PARENT,
LayoutParams.WRAP_CONTENT));
// Creates a ViewHolder and store references to the two children views
// we want to bind data to.
holder = new ViewHolder();
holder.t1=(TextView) convertView.findViewById(R.id.textView1);
holder.t2 = (TextView) convertView.findViewById(R.id.textView2);
holder.t3 = (TextView) convertView.findViewById(R.id.textView3);
convertView.setTag(holder);
} else {
// Get the ViewHolder back to get fast access to the TextView
holder = (ViewHolder) convertView.getTag();
}
holder.t1.setText("set text")
holder.t2.setText("set text2");
holder.t3.setText("set text3");
return convertView;
}
}
class ViewHolder
{
TextView t1,t2,t3;
}
首先,您必须检查
convertView
是否已充气。如果它已经充气,你可以循环使用,你不必再充气。这就是你获得表现的地方
示例:
public View getView(int position, View convertView, ViewGroup parent) {
View itemView = null;
// not inflated
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) parent.getContext()
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
itemView = inflater.inflate(R.layout.list_item_section, null);
}
// already inflated
else {
itemView = convertView;
}
// get your textview's etc.
return itemView;
}
我有一个带有部分的列表,但是这个列表视图非常慢
您总是在getView()方法中膨胀新视图。
膨胀视图通常需要很长时间
您希望通过检查“convertView”是否为null来重用以前的视图。这将提高性能。注意,您还必须实现getItemViewType()
和getViewTypeCount()
,因为您有两个不同的视图:
public class MyAdapter extends ArrayAdapter<Item> {
private List<Item> items;
private int TYPE_SECTION = 0;
private int TYPE_OBIEKT = 1;
private static LayoutInflater vi;
public MyAdapter(Context context, List<Item> _items) {
super(context, 0);
vi = (LayoutInflater) context.getSystemService(Service.LAYOUT_INFLATER_SERVICE);
items = _items;
}
@Override
public int getCount() {
return items.size();
}
/**
* @see android.widget.BaseAdapter#getViewTypeCount()
* Determines how many different views you have
*/
@Override
public int getViewTypeCount() {
return 2; // We have two different kinds of views
}
/**
* @see android.widget.BaseAdapter#getItemViewType(int)
*/
@Override
public int getItemViewType(int position) {
Item item = items.get(position);
if (item.isSection())
return TYPE_SECTION;
return TYPE_OBIEKT;
}
/**
* @see android.widget.ArrayAdapter#getView(int, android.view.View, android.view.ViewGroup)
*/
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// Get the item
final Item item = items.get(position);
if (getItemViewType(position) == TYPE_SECTION) {
// Return a SectionView object
return getSectionView(position, convertView, parent, (SectionItem) item);
}
// Return an Obiekt object
return getObiektView(position, convertView, parent, (Obiekt) item);
}
/**
* SectionView specific
*
* @param position
* @param convertView
* @param parent
* @param item
* @return
*/
public View getSectionView(int position, View convertView, ViewGroup parent, SectionItem item) {
SectionHolder holder;
if(convertView == null){
holder = new SectionHolder();
// Inflate a new View
convertView = vi.inflate(R.layout.list_item_section, null);
holder.sectionView = (TextView) convertView.findViewById(R.id.list_item_section_text);
// Set the ObiektHolder as the tag, to retrieve it for re-using
convertView.setTag(holder);
} else {
holder = (SectionHolder) convertView.getTag();
}
// Holder is never null here
holder.sectionView.setText(item.getSectionTitle());
return convertView;
}
public View getObiektView(int position, View convertView, ViewGroup parent, Obiekt item) {
ObiektHolder holder;
if(convertView == null){
holder = new ObiektHolder();
// Inflate a new View
convertView = vi.inflate(R.layout.row_list, null);
holder.title = (TextView)convertView.findViewById(R.id.row_tytul);
holder.odleglosc = (TextView)convertView.findViewById(R.id.row_odleglosc);
holder.obrazek = (ImageView)convertView.findViewById(R.id.row_ikona_mala);
holder.pole = (LinearLayout)convertView.findViewById(R.id.LinearLayout1);
// Set the ObiektHolder as the tag, to retrieve it for re-using
convertView.setTag(holder);
} else {
holder = (ObiektHolder) convertView.getTag();
}
// Holder is never null here
holder.title.setText(item.getObiektTitle());
return convertView;
}
private static class SectionHolder {
TextView sectionView;
}
private static class ObiektHolder {
TextView title;
TextView odleglosc;
ImageView obrazek;
LinearLayout pole;
}
}
公共类MyAdapter扩展了ArrayAdapter{
私人清单项目;
私有int类型_段=0;
私有int类型_OBIEKT=1;
专用静态布局器vi;
公共MyAdapter(上下文、列表项){
超级(上下文,0);
vi=(LayoutInflater)context.getSystemService(Service.LAYOUT\u INFLATER\u Service);
项目=_个项目;
}
@凌驾
public int getCount(){
返回items.size();
}
/**
*@请参阅android.widget.BaseAdapter#getViewTypeCount()
*确定您有多少个不同的视图
*/
@凌驾
public int getViewTypeCount(){
return 2;//我们有两种不同的视图
}
/**
*@see android.widget.BaseAdapter#getItemViewType(int)
*/
@凌驾
public int getItemViewType(int位置){
Item=items.get(位置);
if(item.isSection())
返回类型_段;
返回类型_OBIEKT;
}
/**
*@see android.widget.ArrayAdapter#getView(int,android.view.view,android.view.ViewGroup)
*/
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
//获取项目
最终项目=项目。获取(位置);
if(getItemViewType(位置)=类型\u节){
//返回一个SectionView对象
返回getSectionView(位置、转换视图、父项、(SectionItem)项);
}
//返回一个Obiekt对象
返回getObiektView(位置、转换视图、父项、(Obiekt)项);
}
/**
*特定于剖视图
*
*@param位置
*@param-convertView
*@param父级
*@param项目
*@返回
*/
公共视图getSectionView(int位置、视图转换视图、视图组父级、SectionItem){
部分持有人;
if(convertView==null){
保持架=新的部分保持架();
//夸大新的观点
convertView=vi.充气(R.布局.列表项目部分,空);
holder.sectionView=(TextView)convertView.findViewById(R.id.list\u item\u section\u text);
//将ObiektHolder设置为标记,以检索它以便重新使用
convertView.setTag(支架);
}否则{
holder=(SectionHolder)convertView.getTag();
}
//Holder在这里永远不为空
holder.sectionView.setText(item.getSectionTitle());
返回视图;
}
公共视图getObiektView(int位置、视图转换视图、视图组父项、Obiekt项){
双夹持器;
if(convertView==null){
保持架=新的ObiektHolder();
//夸大新的观点
convertView=vi.充气(R.布局.行列表,空);
holder.title=(TextView)convertView.findViewById(R.id.row_tytul);
holder.odleglosc=(TextView)convertView.findViewById(R.id.row_odleglosc);
holder.obrazek=(ImageView)convertView.findViewById(R.id.row_ikona_mala);
holder.pole=(LinearLayout)convertView.findViewById(R.id.LinearLayout1);
//将ObiektHolder设置为标记,以检索它以便重新使用
convertView.setTag(支架);
}否则{
holder=(ObiektHolder)convertView.getTag();
}
//Holder在这里永远不为空
holder.title.setText(item.getobiektitle());
返回视图;
}
私有静态类节持有者{
文本视图-剖面视图;
}
私有静态类ObiektHolder{
文本视图标题;
文本视图odleglosc;
ImageView-obrazek;
直线布置杆;
}
}
注意:已测试并正在工作 我这里有个错误:java.lang.ClassCastException:EntryAdapter$SectionViewHolder不能EntryAdapter$ItemViewHolder com.edytor.ruciane.lista.EntryAdapter.getView(EntryAdapter.java:90)也看看这篇文章:我修改了答案。我测试了它,并确认它是有效的。您还需要定义所拥有的不同视图的数量,请参见修改后的代码示例。还有问题吗?请尽管问我。祝你好运
public class MyAdapter extends ArrayAdapter<Item> {
private List<Item> items;
private int TYPE_SECTION = 0;
private int TYPE_OBIEKT = 1;
private static LayoutInflater vi;
public MyAdapter(Context context, List<Item> _items) {
super(context, 0);
vi = (LayoutInflater) context.getSystemService(Service.LAYOUT_INFLATER_SERVICE);
items = _items;
}
@Override
public int getCount() {
return items.size();
}
/**
* @see android.widget.BaseAdapter#getViewTypeCount()
* Determines how many different views you have
*/
@Override
public int getViewTypeCount() {
return 2; // We have two different kinds of views
}
/**
* @see android.widget.BaseAdapter#getItemViewType(int)
*/
@Override
public int getItemViewType(int position) {
Item item = items.get(position);
if (item.isSection())
return TYPE_SECTION;
return TYPE_OBIEKT;
}
/**
* @see android.widget.ArrayAdapter#getView(int, android.view.View, android.view.ViewGroup)
*/
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// Get the item
final Item item = items.get(position);
if (getItemViewType(position) == TYPE_SECTION) {
// Return a SectionView object
return getSectionView(position, convertView, parent, (SectionItem) item);
}
// Return an Obiekt object
return getObiektView(position, convertView, parent, (Obiekt) item);
}
/**
* SectionView specific
*
* @param position
* @param convertView
* @param parent
* @param item
* @return
*/
public View getSectionView(int position, View convertView, ViewGroup parent, SectionItem item) {
SectionHolder holder;
if(convertView == null){
holder = new SectionHolder();
// Inflate a new View
convertView = vi.inflate(R.layout.list_item_section, null);
holder.sectionView = (TextView) convertView.findViewById(R.id.list_item_section_text);
// Set the ObiektHolder as the tag, to retrieve it for re-using
convertView.setTag(holder);
} else {
holder = (SectionHolder) convertView.getTag();
}
// Holder is never null here
holder.sectionView.setText(item.getSectionTitle());
return convertView;
}
public View getObiektView(int position, View convertView, ViewGroup parent, Obiekt item) {
ObiektHolder holder;
if(convertView == null){
holder = new ObiektHolder();
// Inflate a new View
convertView = vi.inflate(R.layout.row_list, null);
holder.title = (TextView)convertView.findViewById(R.id.row_tytul);
holder.odleglosc = (TextView)convertView.findViewById(R.id.row_odleglosc);
holder.obrazek = (ImageView)convertView.findViewById(R.id.row_ikona_mala);
holder.pole = (LinearLayout)convertView.findViewById(R.id.LinearLayout1);
// Set the ObiektHolder as the tag, to retrieve it for re-using
convertView.setTag(holder);
} else {
holder = (ObiektHolder) convertView.getTag();
}
// Holder is never null here
holder.title.setText(item.getObiektTitle());
return convertView;
}
private static class SectionHolder {
TextView sectionView;
}
private static class ObiektHolder {
TextView title;
TextView odleglosc;
ImageView obrazek;
LinearLayout pole;
}
}