我有一个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;
我很乐意为你提供任何帮助。