0

車内のさまざまな電子機器間のメッセージを監視するためのListViewがあります。一部の部分では、1秒あたり数個のデータセットしか取得しませんが、他の部分では、これは最大1000になる可能性があります。

ListViewは私のアプリの一部にすぎず、他の部分は大量のデータをうまく処理しています。

次の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つのTextviewであるため、HolderはTextView配列項目はDataItemsを含むArrayListであり、getStrings()はStringarrayサイズ7を返します。

StringArrayの内容は、テストされてスムーズに実行されるバックグラウンドスレッドで定義されます。

notifyDataSetChanged()を1000回呼び出すと、完全に停止し、UIが応答しないため、バックグラウンドスレッドでDataItemをバッファリングし、実際のアダプターを1秒間に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);
    }
};

トレースリストはすべてのアイテムを表示し、ライトリストはすべてのIDを1回だけ表示します。update_rdlは両方のリストに対してnotifidatasetchangedを呼び出すだけです。

私はあなたが私に与えることができるすべての助けをうれしく思います。

4

0 に答える 0