当前位置: 首页 > 知识库问答 >
问题:

如何在android中异步控制listview项

颛孙智勇
2023-03-14

我有一个listview,每个列表项都有一个ProgressBar。我想以这样的方式控制asynktask中的progressbar:在onPreExecute()中将progressbar设置为visible,在onPostExecute()中将progressbar设置为gone。我尝试了下面的代码,但有时它不起作用,而且progressbar总是可见的:

  private class sendMsg extends AsyncTask<String, String, String>{
            String mess;
            int ind;

            @Override 
            protected void onPreExecute(){
                ind=lv.getLastVisiblePosition(); 
                addItems(mess, false,false,nick,null);  //here I add the item to listview
        }
    @Override
            protected String doInBackground(String... arg0) {.....}
        @Override
            protected void onPostExecute(String temp){

                if(temp.equals("SUCCESS")) {
                     View v = lv.getChildAt(ind+1);
                     ProgressBar pbb = (ProgressBar)  v.findViewById(R.id.messric);
                     pbb.setVisibility(View.GONE); }
            }

listitem.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content" >

    <LinearLayout
        android:id="@+id/wrapper"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"

     >
         <LinearLayout
        android:id="@+id/bollavera"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:orientation="vertical"
        android:layout_margin="10dp"

        >

        <TextView
            android:id="@+id/comment"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="left"
            android:layout_margin="5dip"
            android:paddingLeft="10dip"
            android:textColor="@android:color/primary_text_light"
            android:textSize="18dp" />

        <ProgressBar
            android:id="@+id/messric"
            style="?android:attr/progressBarStyleSmall"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:visibility="gone" />

</LinearLayout>
    </LinearLayout>

</RelativeLayout>

这段代码的另一个问题是:如果试图使progressbar从适配器可见,当有其他项时,它们之前的项又有一个progressbar,如果我旋转屏幕也是如此。我不能在onPreExecute()方法中使progressbar可见,因为我不知道该项是否只是可见,因为我在第1行之前添加了该项。

共有1个答案

松亦
2023-03-14

您可能应该制作您的自定义适配器(您确实有一个,对吗?)有两种类型的项目:一种用于何时应该显示进度条,另一种用于何时不应该显示进度条。我对这个相关问题的回答可能会帮助你开始。

理论上,您可以将AsyncTask附加到每个适配器项。我从未对AsyncTask进行过基准测试,但我猜这样做会有性能问题。您最好启动一个辅助线程,或者几个辅助线程来处理项目,然后返回报告。实现这一点的最简单方法可能是使用带有自定义处理程序HandlerThread。我在这个问题中写了一些关于处理程序、处理程序线程和活套之间关系的非常基本的解释,您可能会在这里找到更多关于SO的搜索。

更新

>

  • 我猜您现在正在使用一个简单的数组作为数据结构。我会将其更改为自己的结构,并使其实现ContentObservable。这最终可能是一个数组或列表的薄包装器。

    在UI线程上设置处理程序。

    设置一个或多个处理与服务器的网络通信的工作线程。每一个都应该有一个接受任务的队列,然后一个接一个地运行这些任务。每次完成后,它都会向UI线程上的处理程序发回一条消息,类似于“嘿,我完成了消息#123的工作,服务器说这是成功的”。(然后它继续执行队列中的下一个任务。)

    您自己的适配器必须注册为数据结构上的观察者。当它接收到更改通知(来自您的数据结构)时,它将自己调用NotifyDataSetChanged,强制视图更新。如果您已经正确实现了getviewgetitemviewtype,这将自动使进度条可见或隐藏。

  •  类似资料:
    • 我试图使我的Android项目的ListView,但不幸的是,当我导入这些库: 上面说这些是“未使用的导入语句”!所以我不能使用“setListAdapter()”函数或其他类似的函数。 我的代码是

    • 异步控制(Sync Controller) 概述 众所周知,在分布式计算系统中,由于多个计算节点计算进度不可能完全一致,会导致了在汇总结果时需要等待那些计算速度较慢的节点,即慢节点会拖慢整个计算任务的进度,浪费计算资源。 考虑到机器学习的特殊性,系统其实可以适当放宽同步限制,没有必要每一轮都等待所有的计算节点完成计算,部分跑得快的Worker,其实完全可以先把训练好的增量Push上去,然后进行下一

    • 我的应用程序是简单的3-层Spring Boot rest Web服务,具有通常的同步endpoint。但是由于从我的服务发送请求的下游系统获得响应的时间相当长(有点像60秒),我需要向我的服务添加对异步REST调用的支持,以保存上游系统免于等待响应。换句话说,如果对下游系统的响应需要超过60秒(超时),那么上游系统会断开与我的服务的连接并继续运行... 但是当响应到来时,我的服务使用来自上游系统

    • 主要讲3个 Promise Generator/yield Async/await 顺序执行的代码和错误有限的回调方式都是js引擎默认支持的,这部分大家会调用接口,无太多变化,而Promise是对callback的思考,或者说改良方案,目前使用非常普遍,这里详细讲解一下。 node里的Promise promise最早是在commonjs社区提出来的,当时提出了很多规范。比较接受的是promise

    • 如何在Android应用程序中为垂直蒙古语脚本水平滚动ListView? Android对世界上许多语言都有相当好的支持,甚至包括阿拉伯语和希伯来语等RTL语言。但是,对于像传统蒙古语这样的自上而下的语言没有内置的支持(蒙古语在内蒙古仍然非常活跃,不要与西里尔蒙古语混淆)。下图显示了文字方向,为清晰起见,添加了英文。 由于Android没有内置这一功能,这使得应用程序开发的每一个方面都非常困难。水

    • 问题内容: 我有一个Android应用程序,它显示一个网格视图,该网格视图显示: 1个 2 3 4 目前正在运行,但是我想显示网格的foreach行,其中2列具有2维数组的值(类似于ASP.Net中的GridView-作为数据源-)。 我想展示: 1 | 人1 2 | 人2 3 | 人3 4 | 人4 任何想法? 问题答案: 是否必须是网格视图?ListView可以工作吗? 我编写了一个ListV