Android 在listview的每一行中动态添加视图

Android 在listview的每一行中动态添加视图,android,performance,android-layout,android-listview,android-linearlayout,Android,Performance,Android Layout,Android Listview,Android Linearlayout,我有一个嵌套数组要显示在我的Listview中。Listview的每一行都有一个水平线布局到HorizontalScrollView中 目前,我正在使用ViewHolder模式,并在ListView的getView方法中将视图动态添加到LinerLayout 问题是当我滚动时listview滞后 这是我的自定义适配器类 public class ChannelArrayAdapter extends ArrayAdapter<Kanal> { Context context; Lis

我有一个嵌套数组要显示在我的Listview中。Listview的每一行都有一个水平线布局到HorizontalScrollView中

目前,我正在使用ViewHolder模式,并在ListView的getView方法中将视图动态添加到LinerLayout

问题是当我滚动时listview滞后

这是我的自定义适配器类

public class ChannelArrayAdapter extends ArrayAdapter<Kanal> {
Context context;
List<Kanal> list;
List<Program> pList;
LayoutInflater inflator;

public ChannelArrayAdapter(Context context, List<Kanal> lis) {
    super(context, R.layout.channels, lis);
    // TODO Auto-generated constructor stub
    this.list = lis;
    this.context = context;
}

static class ViewHolder {
    ImageView imageView;
    LinearLayout l;
}

static class ProgramHolder {
    TextView programAdi;
    TextView programSaati;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
     ViewHolder viewHolder = null;
    if (convertView == null) {
        inflator = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = inflator.inflate(R.layout.channels, parent, false);
        viewHolder.imageView = (ImageView) convertView.findViewById(R.id.imageView1);
        viewHolder.l = (LinearLayout) convertView.findViewById(R.id.yayinAkisiLayout);
        convertView.setTag(viewHolder);

    } else {
        viewHolder = (ViewHolder)convertView.getTag();
        viewHolder.l.removeAllViews();
    }

    final Kanal kanal = list.get(position);
    pList = kanal.getKanalProgramListesi();
    viewHolder.imageView.setImageResource(kanal.getResourcesIkonKanal());

    for (Program p : pList) {
        View v = new View(context);
        v.setId(position);
        ProgramHolder pHolder = new ProgramHolder();
        v = inflator.inflate(R.layout.programs, null);          
        pHolder.programSaati = (TextView) v.findViewById(R.id.psaati);
        pHolder.programAdi = (TextView)v.findViewById(R.id.pname);
        pHolder.programAdi.setText(p.getProgramAdi());
        pHolder.programSaati.setText(p.getProgramBaslangic());
        v.setTag(pHolder);
        viewHolder.l.addView(v);
    }

    return convertView;
}

}
公共类ChannelArrayAdapter扩展了ArrayAdapter{
语境;
名单;
列表列表;
充气机;
公共通道ArrayAdapter(上下文,列表lis){
超级(上下文、右布局、频道、lis);
//TODO自动生成的构造函数存根
this.list=lis;
this.context=上下文;
}
静态类视窗夹{
图像视图图像视图;
线性布局;
}
静态类程序持有者{
文本视图程序;
文本视图程序;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
ViewHolder ViewHolder=null;
if(convertView==null){
充气器=(LayoutFlater)context.getSystemService(context.LAYOUT\u充气器\u服务);
convertView=充气机。充气(R.layout.Channel,父级,false);
viewHolder.imageView=(imageView)convertView.findViewById(R.id.imageView1);
viewHolder.l=(LinearLayout)convertView.findViewById(R.id.yayinAkisiLayout);
convertView.setTag(viewHolder);
}否则{
viewHolder=(viewHolder)convertView.getTag();
viewHolder.l.移除所有视图();
}
final-Kanal-Kanal=list.get(position);
pList=kanal.getkanalprogramlisti();
viewHolder.imageView.setImageResource(kanal.getResourcesIkonKanal());
for(程序p:pList){
视图v=新视图(上下文);
v、 setId(位置);
ProgramHolder pHolder=新的ProgramHolder();
v=充气机充气(R.layout.programs,空);
pHolder.programSaati=(文本视图)v.findViewById(R.id.psaati);
pHolder.programAdi=(TextView)v.findViewById(R.id.pname);
pHolder.programAdi.setText(p.getProgramAdi());
pHolder.programmaati.setText(p.getprogrammabaslangic());
v、 设置标签(pHolder);
viewHolder.l.addView(v);
}
返回视图;
}
}

将holder设置为静态类,只需在getView中编辑其字段即可。您的列表视图会滞后,因为每次调用getView->加载新项目或在ListView上获得可见性时,您都会创建很少的新对象


这详细解释了如何制作有效的适配器/列表视图。

您可以优化这段代码:

ProgramHolder pHolder = new ProgramHolder();
        v = inflator.inflate(R.layout.programs, null);          
        pHolder.programSaati = (TextView) v.findViewById(R.id.psaati);
        pHolder.programAdi = (TextView)v.findViewById(R.id.pname);
        pHolder.programAdi.setText(p.getProgramAdi());
        pHolder.programSaati.setText(p.getProgramBaslangic());
        v.setTag(pHolder);
        viewHolder.l.addView(v);
作为视图持有者模式,您应该存储这些布局,也可以存储在静态变量中:

static  ProgramHolder pHolder;

if (pHolder == null) {
    View v = new View(context);
    v = inflator.inflate(R.layout.programs, null);          
    pHolder.programSaati = (TextView) v.findViewById(R.id.psaati);
    pHolder.programAdi = (TextView)v.findViewById(R.id.pname);
}
这里的主要目的是减少使用
findviewbyd()
的次数。之后,在循环中,您可以创建自定义视图,并根据
pHolder
分配每个字段


希望有帮助:)

谢谢你的回答。。我已经试过了,但没什么区别。你能告诉我plist的大小吗?有一个json响应的动态数组,但列表计数是25,每个Kanal节点都有一个20-30的程序实体。我对我的一个实现厌倦了你的代码,它工作得很好。不过,我没有看到太多的滞后。