ListView实时数据集每秒最多1000个项目会减慢所有内容

时间:2013-02-21 08:27:22

标签: android android-listview android-arrayadapter real-time-data

我有一个ListView来观察汽车中不同电子设备之间的消息。 对于某些部分,我每秒只能获得一些数据集,但在其他部分,这可能会达到1000个。

ListView只是我App的一部分,另一部分是处理大量数据。

我使用带有以下getView的自定义ArrayAdapter:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    itemp = items.get(position);
    if (convertView == null) {
        tvs = new TextView[7];
        convertView = LayoutInflater.from(mycontext).inflate(container, parent,false);
        tvs[0] = (TextView) convertView.findViewById(R.id.rd_l_c_messzeit);
        tvs[1] = (TextView) convertView.findViewById(R.id.rd_l_c_frameid);
        tvs[2] = (TextView) convertView.findViewById(R.id.rd_l_c_can);
        tvs[3] = (TextView) convertView.findViewById(R.id.rd_l_c_dlc);
        tvs[4] = (TextView) convertView.findViewById(R.id.rd_l_c_typ);
        tvs[5] = (TextView) convertView.findViewById(R.id.rd_l_c_data);
        tvs[6] = (TextView) convertView.findViewById(R.id.rd_l_c_datum);

        convertView.setTag(tvs);
        convertView.setEnabled(false);
    }else {
        tvs=(TextView[]) convertView.getTag();
    }
    if (itemp != null) {
        strings = itemp.getStrings();
        if (container == R.layout.rawdata_list_container) {

            for (int i = 0; i < 7; i++) {
                if (tvs[i] != null) {
                    tvs[i].setText(strings[i]);
                }
            }
            tvs[3].setText(strings[3].substring(1));

        }

    }
    return convertView;
}

我的Rowlayout只有7个Textviews,所以我的Holder是一个TextView数组 items是带有DataItems的ArrayList,其中getStrings()返回一个Stringarray大小为7

StringArray的内容在后台线程中定义,后者线程经过测试和平稳运行。

调用1000次notifyDataSetChanged()导致完全停止,我的UI没有响应,所以我在后台线程中缓冲了DataItems,并且每秒只更新真实适配器5次。

Runnable updaterun=new Runnable(){

    @Override
    public void run()
    {
        for(RawdataItem rdi:templist)
        {
            tracelist.add(1,rdi);
            if(tracelist.size()>500)
            {
                tracelist.remove(500);
            }

        }

        for(RawdataItem rdi:templistlight)
        {
            count = 0;
            newtrl=true;
            for (RawdataItem r : tracelistlight) {
                if (rdi.lid == r.lid) {
                    tracelistlight.set(count,rdi);
                    newtrl=false;
                    break;
                }
                count++;
            }
            if(newtrl) {
                tracelistlight.add(rdi);
                    Collections.sort(tracelistlight);           
            }
        }
        update_rdl();
        templist.clear();
        templistlight.clear();
        updatehandler.postDelayed(updaterun, 200);
    }
};

tracelist将显示所有项目,而灯光列表仅显示每个id一次 update_rdl只为两个列表调用notifidatasetchanged;

我很乐意为你提供任何帮助。

0 个答案:

没有答案