更新LisView里面的进度条

本文介绍了一种在Android应用中更新UI的方法,通过处理线程发送包含进度信息的消息给Handler,Handler再更新List的Adapter,从而实现在List视图中动态展示进度。文中提供了一个具体的例子,包括代码实现和布局文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  今天看到论坛上有人问这个。估计是要搞一个类似下载软件的东西吧。

  所以就有了本篇,原理:

  处理线程先给handler发消息,消息中包括进度信息,handler在去更改List的Adapter里面的信息,并通知List更新UI。

  原理很简单,就直接上码了:

001package hol.test.listprogress;
002  
003import java.util.ArrayList;
004import java.util.HashMap;
005import java.util.List;
006  
007import android.app.Activity;
008import android.content.Context;
009import android.os.Bundle;
010import android.os.Handler;
011import android.os.Message;
012import android.view.LayoutInflater;
013import android.view.View;
014import android.view.ViewGroup;
015import android.widget.BaseAdapter;
016import android.widget.Button;
017import android.widget.ListView;
018import android.widget.ProgressBar;
019import android.widget.TextView;
020  
021public class TestListProgress extends Activity {
022    private Button testDo = null;
023    private ListView progressList = null;
024    private List<HashMap<String, Object>> list;
025    private MyAdapter myAdapet;
026    private MyHandler myHandler;
027  
028    @Override
029    public void onCreate(Bundle savedInstanceState) {
030        super.onCreate(savedInstanceState);
031        setContentView(R.layout.main);
032  
033        myHandler = new MyHandler();
034  
035        findView();
036        addListerner();
037        initList();
038    }
039  
040    private void findView() {
041        testDo = (Button) findViewById(R.id.btn_test);
042        progressList = (ListView) findViewById(R.id.lst_progress);
043    }
044  
045    private void addListerner() {
046        testDo.setOnClickListener(new ClickEvent());
047    }
048  
049    private void initList() {
050        list = new ArrayList<HashMap<String, Object>>();
051        HashMap<String, Object> dataA = new HashMap<String, Object>();
052        HashMap<String, Object> dataB = new HashMap<String, Object>();
053        dataA.put("title", "dataA");
054        dataA.put("current", 0);
055        list.add(dataA);
056        dataB.put("title", "dataB");
057        dataB.put("current", 0);
058        list.add(dataB);
059  
060        myAdapet = new MyAdapter(TestListProgress.this, list);
061        progressList.setAdapter(myAdapet);
062  
063    }
064  
065    // 模拟处理线程
066    class UpdateRunnable implements Runnable {
067        int id;
068        int currentPos = 0;
069        int delay;
070        MyHandler handler;
071  
072        public UpdateRunnable(int id, int delay, MyHandler handler) {
073            this.id = id;
074            this.handler = handler;
075            this.delay = delay;
076        }
077  
078        @Override
079        public void run() {
080            // TODO Auto-generated method stub
081            while (currentPos <= 100) {
082                Message msg = handler.obtainMessage();
083                msg.what = 1;
084                msg.arg1 = id;
085                msg.arg2 = currentPos;
086                currentPos = currentPos + 5;
087                msg.sendToTarget();
088                try {
089                    Thread.sleep(delay);
090                } catch (InterruptedException e) {
091                    // TODO Auto-generated catch block
092                    e.printStackTrace();
093                }
094            }
095        }
096  
097    }
098  
099    // 消息Handler用来更新UI
100    class MyHandler extends Handler {
101        @Override
102        public void handleMessage(Message msg) {
103            // TODO Auto-generated method stub
104            switch (msg.what) {
105            case 1:
106                int id = msg.arg1;
107                int current = msg.arg2;
108                updateProgress(id, current);
109                break;
110            }
111            super.handleMessage(msg);
112        }
113  
114        private void updateProgress(int id, int currentPos) {
115            HashMap<String, Object> dataTemp = list.get(id);
116            dataTemp.put("current", currentPos);
117            myAdapet.chargeProgress(id, dataTemp);
118        }
119    }
120  
121    // 按钮事件
122    class ClickEvent implements View.OnClickListener {
123  
124        @Override
125        public void onClick(View v) {
126            // TODO Auto-generated method stub
127            switch (v.getId()) {
128            case (R.id.btn_test):
129                new Thread(new UpdateRunnable(0, 400, myHandler)).start();
130                new Thread(new UpdateRunnable(1, 200, myHandler)).start();
131                System.out.println("OnClick");
132                break;
133            }
134        }
135  
136    }
137  
138    // List的显示
139    class MyAdapter extends BaseAdapter {
140  
141        List<HashMap<String, Object>> list;
142        LayoutInflater infl = null;
143  
144        public MyAdapter(Context context, List<HashMap<String, Object>> list) {
145            this.infl = (LayoutInflater) context
146                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
147            this.list = list;
148        }
149  
150        @Override
151        public int getCount() {
152            // TODO Auto-generated method stub
153            return list.size();
154        }
155  
156        @Override
157        public Object getItem(int position) {
158            // TODO Auto-generated method stub
159            return list.get(position);
160        }
161  
162        @Override
163        public long getItemId(int position) {
164            // TODO Auto-generated method stub
165            return position;
166        }
167  
168        @Override
169        public View getView(int position, View convertView, ViewGroup parent) {
170            // TODO Auto-generated method stub
171            convertView = infl.inflate(R.layout.list_layout, null);
172            ProgressBar progressBar = (ProgressBar) convertView
173                    .findViewById(R.id.progress);
174            TextView titleView = (TextView) convertView
175                    .findViewById(R.id.title);
176  
177            HashMap<String, Object> detail = list.get(position);
178            String t = (String) detail.get("title");
179            titleView.setText(t);
180            int progress = (Integer) detail.get("current");
181            progressBar.setProgress(progress);
182            return convertView;
183        }
184  
185        // 改变进度,postion就是要改的那个进度
186        public void chargeProgress(int postion, HashMap<String, Object> detail) {
187            this.list.set(postion, detail);
188            // System.out.println("charged:" + detail.get("current"));
189            notifyDataSetChanged();
190        }
191  
192    }
193}
MyAdapet 里面的 chargeProgress是在用来更新List里面的值。
Message里面arg1就是List中的第几个进度条,arg2就是这个进度条里面的当前应该有的进度。what暂时没什么意义,只是为了标识这类消息是用来更新进度条的。本例也只有这一类消息。
这个是List的LayoutXML文件内容:

01<LinearLayout
03  android:orientation="horizontal"
04  android:layout_width="fill_parent"
05  android:layout_height="fill_parent">
06  <TextView  android:id="@+id/title"
07    android:layout_width="wrap_content"
08    android:layout_height="wrap_content"
09    android:text="In list"
10    android:layout_marginRight="5dip"
11    >
12  </TextView>
13  <ProgressBar android:id="@+id/progress"
14    android:layout_width="wrap_content"
15    android:layout_height="wrap_content"
16    style="?android:attr/progressBarStyleHorizontal"
17    android:max="100"
18    android:layout_weight="1.0"
19    android:visibility="visible"
20  />
21</LinearLayout>
Acitvity的布局:

01<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
02    android:orientation="vertical"
03    android:layout_width="fill_parent"
04    android:layout_height="fill_parent"
05    >
06<TextView  
07    android:layout_width="fill_parent" 
08    android:layout_height="wrap_content" 
09    android:text="@string/hello"
10    />
11    <Button android:id="@+id/btn_test"
12        android:layout_width="fill_parent"
13        android:layout_height="wrap_content"
14        android:text="ListProgress"
15    />
16    <ListView android:id="@+id/lst_progress"
17        android:layout_width="fill_parent"
18        android:layout_height="wrap_content"
19        android:layout_weight="1.0"
20        >
21    </ListView>
22</LinearLayout>
效果图如下:

转载于:https://www.cnblogs.com/jdsjlzx/archive/2011/08/01/2123974.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值