Listview 具有两行布局的列表视图的异步任务
我有一个具有两种不同行类型的listview(如本问题中所示)。它工作正常,但滚动时非常滞后。所以我读到,解决这个问题的方法是使用异步任务。当使用两种不同的行类型时,如何实现这一点 我尝试过使用两种不同的AsyncTask(在doInBackground中增加行数),但我遇到了各种各样的错误: 在getView()中: 我也尝试过使用相同的AsyncTask类并传递相同的数据和类型_DAY/TYPE _data,但这非常复杂,我得到了NullPointerException 有什么想法吗?提前谢谢 我是这样解决的:Listview 具有两行布局的列表视图的异步任务,listview,android-asynctask,android-listfragment,Listview,Android Asynctask,Android Listfragment,我有一个具有两种不同行类型的listview(如本问题中所示)。它工作正常,但滚动时非常滞后。所以我读到,解决这个问题的方法是使用异步任务。当使用两种不同的行类型时,如何实现这一点 我尝试过使用两种不同的AsyncTask(在doInBackground中增加行数),但我遇到了各种各样的错误: 在getView()中: 我也尝试过使用相同的AsyncTask类并传递相同的数据和类型_DAY/TYPE _data,但这非常复杂,我得到了NullPointerException 有什么想法吗?提前谢
- 我扩展了一个BaseAdapter,它有一个所有可能列表项的列表
- getView使用ViewHolderPattern循环视图
- 视图的宽度取决于HolderItem resp。所需时间(显示不同持续时间的广播的水平列表)
- GetView启动一个异步任务,该任务包含两个持有者:ViewHolder和DataHolder
- AsyncTask需要在PostExecute上启动一个执行GUIStuff的线程,即DrawRunnable
- 在DrawRunnable中,我决定如何给背景上色,以及根据广播的持续时间向用户呈现什么
@覆盖
公共视图getView(最终整数位置、视图转换视图、视图组父视图){
ViewBroadcastItemHolder viewItemHolder;
if(convertView==null){
convertView=(相对)LAYOUTING变平。充气(layoutId,
父母,假);
viewItemHolder=新的ViewBroadcastItemHolder();
viewItemHolder.logo=(ImageView)convertView
.findViewById(R.id.广播指南\图像);
viewItemHolder.time=(TextView)convertView
.findViewById(R.id.广播指南\时间);
viewItemHolder.title=(TextView)convertView
.findViewById(R.id.广播指南\标题);
viewItemHolder.divider=convertView
.findViewById(R.id.广播指南\U分割器);
viewItemHolder.layout=(LinearLayout)convertView
.findViewById(R.id.广播、指南、项目、线性布局);
setTag(viewItemHolder);
}否则{
viewItemHolder=(ViewBroadcastItemHolder)convertView.getTag();
convertView.setVisibility(View.GONE);
}
BroadcastHolder broadcastItem=getItem(位置);
viewItemHolder.layout.getLayoutParams().width=broadcastItem.width;
BroadcastHolderAsyncArgument持有人=新的BroadcastHolderAsyncArgument持有人(
convertView、viewItemHolder、broadcastItem、position);
holder.bcViewHolder.logo
.setImageBitmap(controller.getLogoPlaceholder());
BroadcastHolderAsyncArgument[]参数={holder};
新建异步任务(){
@凌驾
受保护的广播HolderAsyncarGument doInBackground(
广播控股公司(控股公司){
返回bcHolderArg[0];
}
@凌驾
受保护的void onPostExecute(
广播控股公司(控股公司){
//在决策中,应该把哪些策略放在哪里
//if(XTYPE){new DrawBroadcast30ViewRunnable(..).run()}
//else if(YTYPE){new DrawBroadcast200ViewRunnable(..).run()}
//else if(ZTYPE){new DrawBroadcast10ViewRunnable(..).run()}
//else{new DrawBroadcast5ViewRunnable(..).run()}
新建DrawBroadcastViewRunnable(bcHolderArg,位置).run();
}
}.executeOnExecutor(AsyncTask.THREAD\u POOL\u EXECUTOR,参数);
返回视图;
}
公共类DrawBroadcastViewRunnable实现Runnable{
私人广播持有人Syncargument BCN持有人;
私人职位;
公共广播可视可运行(
BroadcastHolderAsyncArgument bcHolderArgument,内部位置){
超级();
this.bcAsyncArgumentHolder=bcHolderArgument;
这个位置=位置;
}
公开募捐{
if(bcAsyncArgumentHolder.position==位置){
//设置CatchUp、Live和Upcomming的背景色
if(Helper.isLiveBroadcast(
bcAsyncArgumentHolder.bcItemHolder.start,
bcAsyncArgumentHolder.bcItemHolder.stop){
bcAsyncArgumentHolder.bcViewHolder.isCatchup=false;
bcAsyncArgumentHolder.convertView
.setBackgroundColor(context.getResources()
.getColor(R.color.guide_live_broadcast));
}else if(bcAsyncArgumentHolder.bcViewHolder.isCatchup=Helper
.IsCatch广播公司(
bcAsyncArgumentHolder.bcItemHolder.start,
bcAsyncArgumentHolder.bcItemHolder.stop){
bcAsyncArgumentHolder.convertView
.setBackgroundColor(context.getResources()
.getColor(R.color.guide_replay_broadcast));
}否则{
//即将播出
bcAsyncArgumentHolder.convertView
.setBackgroundColor(context.getResources()
.getColor(R.color.guide_countain_broadcast));
bcAsyncArgumentHolder.bcViewHolder.isCatchup=false;
}
//非常大的布局,超过30分钟
如果(bcAsyncArgumentHolder.bcItemHolder.width>=20*控制器
.getPixelPerMinute()){
bcAsyncArgumentHolder.bcViewHolder.logo
.setVisibility(View.VISIBLE);
if (convertView == null) {
switch (type) {
case TYPE_DAY:
new ForecastDayTask(position, forecastHolder, convertView,
forecastHolder, mInflater, forecastdata).execute();
break;
case TYPE_DATA:
new ForecastTask(position, forecastHolder, convertView,
forecastHolder, mInflater, forecastdata).execute();
break;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
ViewBroadcastItemHolder viewItemHolder;
if (convertView == null) {
convertView = (RelativeLayout) layoutInflater.inflate(layoutId,
parent, false);
viewItemHolder = new ViewBroadcastItemHolder();
viewItemHolder.logo = (ImageView) convertView
.findViewById(R.id.broadcast_guide_image);
viewItemHolder.time = (TextView) convertView
.findViewById(R.id.broadcast_guide_time);
viewItemHolder.title = (TextView) convertView
.findViewById(R.id.broadcast_guide_title);
viewItemHolder.divider = convertView
.findViewById(R.id.broadcast_guide_divider);
viewItemHolder.layout = (LinearLayout) convertView
.findViewById(R.id.broadcast_guide_item_linear_layout);
convertView.setTag(viewItemHolder);
} else {
viewItemHolder = (ViewBroadcastItemHolder) convertView.getTag();
convertView.setVisibility(View.GONE);
}
BroadcastHolder broadcastItem = getItem(position);
viewItemHolder.layout.getLayoutParams().width = broadcastItem.width;
BroadcastHolderAsyncArgument holder = new BroadcastHolderAsyncArgument(
convertView, viewItemHolder, broadcastItem, position);
holder.bcViewHolder.logo
.setImageBitmap(controller.getLogoPlaceholder());
BroadcastHolderAsyncArgument[] argument = { holder };
new AsyncTask<BroadcastHolderAsyncArgument, Void, BroadcastHolderAsyncArgument>() {
@Override
protected BroadcastHolderAsyncArgument doInBackground(
BroadcastHolderAsyncArgument... bcHolderArg) {
return bcHolderArg[0];
}
@Override
protected void onPostExecute(
BroadcastHolderAsyncArgument bcHolderArg) {
// Where to put in the decision which Strategy has to get done
//if(XTYPE){ new DrawBroadcast30ViewRunnable(..).run()}
//else if(YTYPE){new DrawBroadcast200ViewRunnable(..).run()}
//else if(ZTYPE){new DrawBroadcast10ViewRunnable(..).run()}
//else{new DrawBroadcast5ViewRunnable(..).run()}
new DrawBroadcastViewRunnable(bcHolderArg, position).run();
}
}.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, argument);
return convertView;
}
public class DrawBroadcastViewRunnable implements Runnable {
private BroadcastHolderAsyncArgument bcAsyncArgumentHolder;
private int position;
public DrawBroadcastViewRunnable(
BroadcastHolderAsyncArgument bcHolderArgument, int position) {
super();
this.bcAsyncArgumentHolder = bcHolderArgument;
this.position = position;
}
public void run() {
if (bcAsyncArgumentHolder.position == position) {
// Set Background Color of CatchUp, Live and Upcomming
if (Helper.isLiveBroadcast(
bcAsyncArgumentHolder.bcItemHolder.start,
bcAsyncArgumentHolder.bcItemHolder.stop)) {
bcAsyncArgumentHolder.bcViewHolder.isCatchup = false;
bcAsyncArgumentHolder.convertView
.setBackgroundColor(context.getResources()
.getColor(R.color.guide_live_broadcast));
} else if (bcAsyncArgumentHolder.bcViewHolder.isCatchup = Helper
.isCatchupBroadcast(
bcAsyncArgumentHolder.bcItemHolder.start,
bcAsyncArgumentHolder.bcItemHolder.stop)) {
bcAsyncArgumentHolder.convertView
.setBackgroundColor(context.getResources()
.getColor(R.color.guide_replay_broadcast));
} else {
// Upcoming Broadcast
bcAsyncArgumentHolder.convertView
.setBackgroundColor(context.getResources()
.getColor(R.color.guide_upcoming_broadcast));
bcAsyncArgumentHolder.bcViewHolder.isCatchup = false;
}
// very large layout, more than 30min
if (bcAsyncArgumentHolder.bcItemHolder.width >= 20 * controller
.getPixelPerMinute()) {
bcAsyncArgumentHolder.bcViewHolder.logo
.setVisibility(View.VISIBLE);
ImageLoader.getInstance().displayImage(
bcAsyncArgumentHolder.bcItemHolder.imageUrl,
bcAsyncArgumentHolder.bcViewHolder.logo);
bcAsyncArgumentHolder.bcViewHolder.title
.setVisibility(View.VISIBLE);
bcAsyncArgumentHolder.bcViewHolder.time
.setVisibility(View.VISIBLE);
bcAsyncArgumentHolder.bcViewHolder.title
.setText(bcAsyncArgumentHolder.bcItemHolder.title);
bcAsyncArgumentHolder.bcViewHolder.time.setText(Helper
.formatBroadcastTime(
bcAsyncArgumentHolder.bcItemHolder.start,
bcAsyncArgumentHolder.bcItemHolder.stop));
}
// medium layout, between 20 to 15min
if (bcAsyncArgumentHolder.bcItemHolder.width < 20 * controller
.getPixelPerMinute()
&& bcAsyncArgumentHolder.bcItemHolder.width > 15 * controller
.getPixelPerMinute()) {
ImageLoader.getInstance().displayImage(
bcAsyncArgumentHolder.bcItemHolder.imageUrl,
bcAsyncArgumentHolder.bcViewHolder.logo);
bcAsyncArgumentHolder.bcViewHolder.logo
.setVisibility(View.VISIBLE);
bcAsyncArgumentHolder.bcViewHolder.time
.setVisibility(View.VISIBLE);
bcAsyncArgumentHolder.bcViewHolder.title
.setVisibility(View.VISIBLE);
bcAsyncArgumentHolder.bcViewHolder.title
.setText(bcAsyncArgumentHolder.bcItemHolder.title);
bcAsyncArgumentHolder.bcViewHolder.time.setText(Helper
.formatBroadcastTime(
bcAsyncArgumentHolder.bcItemHolder.start,
bcAsyncArgumentHolder.bcItemHolder.stop));
}
// medium layout, between 15 to 5min
if (bcAsyncArgumentHolder.bcItemHolder.width <= 15 * controller
.getPixelPerMinute()
&& bcAsyncArgumentHolder.bcItemHolder.width > 5 * controller
.getPixelPerMinute()) {
bcAsyncArgumentHolder.bcViewHolder.logo
.setVisibility(View.GONE);
bcAsyncArgumentHolder.bcViewHolder.time
.setVisibility(View.GONE);
bcAsyncArgumentHolder.bcViewHolder.title
.setVisibility(View.VISIBLE);
bcAsyncArgumentHolder.bcViewHolder.title
.setText(bcAsyncArgumentHolder.bcItemHolder.title);
}
// smal layout, to 5min
if (bcAsyncArgumentHolder.bcItemHolder.width <= 5 * controller
.getPixelPerMinute()) {
bcAsyncArgumentHolder.bcViewHolder.logo
.setVisibility(View.GONE);
bcAsyncArgumentHolder.bcViewHolder.time
.setVisibility(View.GONE);
bcAsyncArgumentHolder.bcViewHolder.title
.setVisibility(View.GONE);
}
if (bcAsyncArgumentHolder.bcItemHolder.dummy) {
bcAsyncArgumentHolder.bcViewHolder.divider
.setVisibility(View.GONE);
} else {
bcAsyncArgumentHolder.bcViewHolder.divider
.setVisibility(View.VISIBLE);
}
if (!bcAsyncArgumentHolder.bcItemHolder.id.equalsIgnoreCase("")) {
bcAsyncArgumentHolder.bcViewHolder.broadcastId = Long
.parseLong(bcAsyncArgumentHolder.bcItemHolder.id);
}
bcAsyncArgumentHolder.convertView.setVisibility(View.VISIBLE);
}
}