C# 界面初始化时listview需要加载大量数据,求教提高速度的方法!!!

C# 界面初始化时listview需要加载大量数据,求教提高速度的方法!!!,第1张

首先,一个列表里面有7万格项目是不合理的,因为你将没有办法通过拖动滚动条来准确定位,毕竟7万条记录的list滚动条得多小啊

其次,如果非要显示的话,建议使用异步填充,先组织好一批数据,然后填充这一批,期间UI线程还是可以相应的,这样虽然速度没有提升,但是用户体验会好一些

再次,如果要求必须一次填充完成的话,在开始填充时使用SuspendLayout(),挂起更新画面项目,然后在填充完以后ResumeLayout(true)恢复更新画面,并将前面挂起的画面更新恢复。这样可以一定程度上节省更新的时间。

thislistviewSampleSuspendLayout();

thisLoadListData();

thislistviewSampleResumeLayout(true);

Ps: IsPostback是BS系统上面的,在你的Winform上没有意义。金山词霸采用的是我说的第二种方案配合第三种方案,只加载一小部分,在你拖动滚动条的时候填充当前滚动条指定的那一段。相当于分页。

1定义Adapter

public class SignalListAdapter extends BaseAdapter {

//信标数组-存储信标名字

private String[] DataList;

private Context mContext;

public SignalListAdapter(Context context, List<String> DataList){

super();

thisDataList=DataListtoArray(new String[]{});

thismContext = context;

}

@Override

public int getCount() {

return DataListlength;

}

public void setData( List<String> DataList){

thisDataList=DataListtoArray(new String[]{});

}

@Override

public Object getItem(int position) {

return isOnline[position];

}

@Override

public long getItemId(int position) {

return position;

}

@Override

public View getView(final int index, View convertView, ViewGroup parent) {

if (convertView==null){

convertView=Viewinflate(mContext,Rlayoutfragment_item,null);

}

//设置fragment中的textview

TextView tx=convertViewfindViewById(Ridfragment_text);

txsetText(DataList[index]);

//设置imageview里单独的click监听

ImageView iv_setting=convertViewfindViewById(Ridiv_setting);

iv_settingsetOnClickListener(new ViewOnClickListener() {

@Override

public void onClick(View v) {

Intent intent=new Intent(mContext,Settingsclass);

intentputExtra("Data",DataList[index]);

mContextstartActivity(intent);

}

});

//设置整个fragment的监听

convertViewsetOnClickListener(new ViewOnClickListener() {

@Override

public void onClick(View v) {

Intent intent;

intent=new Intent(mContext,BDMapActivityclass);

intentputExtra("Data",DataList[index]);//

mContextstartActivity(intent);

}

});

return convertView;

}

}

这里主要是写getItemId,getItem,getCount,getView这几个方法,Adapter里应该定义这段动态生成所需要的数据是什么,然后在构造函数里进行赋值,getView的方法就是对于动态生成里的每个子项该怎么设置textview,设置监听之类的。

除此之外,还应该自己写个setData方法,用于重新给private的数据进行赋值,告诉Adapter数据已经发生改变

2使用Adapter进行生成

signalListView=findViewById(RidsignalList);

mSignalListAdapter=new SignalListAdapter(MainActivitythis,DataList);

signalListViewsetAdapter(mSignalListAdapter);

3对于动态生成的ListView的控件进行更改

当想要对动态生成的控件里面的某一个属性进行更改的时候就麻烦了,这个时候首先应该进行数据的修改,当DataList中的值改变之后,调用之前写的setData方法告诉Adapter数据已经改变, 再调用Adapter的notifyDataSetChanged方法,调用后,Listview里的数据就会重新生成一次,还是在geiView中对于控件的属性进行更改, 数据的改变和notifyDataSetChanged方法写在handler里就行

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/12186564.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存