今天看到论坛上有人问这个。估计是要搞一个类似下载软件的东西吧。
所以就有了本篇,原理:
处理线程先给handler发消息,消息中包括进度信息,handler在去更改List的Adapter里面的信息,并通知List更新UI。
原理很简单,就直接上码了:
001 | package hol.test.listprogress; |
003 | import java.util.ArrayList; |
004 | import java.util.HashMap; |
005 | import java.util.List; |
007 | import android.app.Activity; |
008 | import android.content.Context; |
009 | import android.os.Bundle; |
010 | import android.os.Handler; |
011 | import android.os.Message; |
012 | import android.view.LayoutInflater; |
013 | import android.view.View; |
014 | import android.view.ViewGroup; |
015 | import android.widget.BaseAdapter; |
016 | import android.widget.Button; |
017 | import android.widget.ListView; |
018 | import android.widget.ProgressBar; |
019 | import android.widget.TextView; |
021 | public 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; |
029 | public void onCreate(Bundle savedInstanceState) { |
030 | super .onCreate(savedInstanceState); |
031 | setContentView(R.layout.main); |
033 | myHandler = new MyHandler(); |
040 | private void findView() { |
041 | testDo = (Button) findViewById(R.id.btn_test); |
042 | progressList = (ListView) findViewById(R.id.lst_progress); |
045 | private void addListerner() { |
046 | testDo.setOnClickListener( new ClickEvent()); |
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 ); |
056 | dataB.put( "title" , "dataB" ); |
057 | dataB.put( "current" , 0 ); |
060 | myAdapet = new MyAdapter(TestListProgress. this , list); |
061 | progressList.setAdapter(myAdapet); |
066 | class UpdateRunnable implements Runnable { |
072 | public UpdateRunnable( int id, int delay, MyHandler handler) { |
074 | this .handler = handler; |
081 | while (currentPos <= 100 ) { |
082 | Message msg = handler.obtainMessage(); |
085 | msg.arg2 = currentPos; |
086 | currentPos = currentPos + 5 ; |
090 | } catch (InterruptedException e) { |
100 | class MyHandler extends Handler { |
102 | public void handleMessage(Message msg) { |
107 | int current = msg.arg2; |
108 | updateProgress(id, current); |
111 | super .handleMessage(msg); |
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); |
122 | class ClickEvent implements View.OnClickListener { |
125 | public void onClick(View v) { |
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" ); |
139 | class MyAdapter extends BaseAdapter { |
141 | List<HashMap<String, Object>> list; |
142 | LayoutInflater infl = null ; |
144 | public MyAdapter(Context context, List<HashMap<String, Object>> list) { |
145 | this .infl = (LayoutInflater) context |
146 | .getSystemService(Context.LAYOUT_INFLATER_SERVICE); |
151 | public int getCount() { |
157 | public Object getItem( int position) { |
159 | return list.get(position); |
163 | public long getItemId( int position) { |
169 | public View getView( int position, View convertView, ViewGroup parent) { |
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); |
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); |
186 | public void chargeProgress( int postion, HashMap<String, Object> detail) { |
187 | this .list.set(postion, detail); |
189 | notifyDataSetChanged(); |
MyAdapet 里面的 chargeProgress是在用来更新List里面的值。 |
Message里面arg1就是List中的第几个进度条,arg2就是这个进度条里面的当前应该有的进度。what暂时没什么意义,只是为了标识这类消息是用来更新进度条的。本例也只有这一类消息。 |
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" |
13 | < ProgressBar android:id = "@+id/progress" |
14 | android:layout_width = "wrap_content" |
15 | android:layout_height = "wrap_content" |
16 | style = "?android:attr/progressBarStyleHorizontal" |
18 | android:layout_weight = "1.0" |
19 | android:visibility = "visible" |
02 | android:orientation= "vertical" |
03 | android:layout_width= "fill_parent" |
04 | android:layout_height= "fill_parent" |
07 | android:layout_width= "fill_parent" |
08 | android:layout_height= "wrap_content" |
09 | android:text= "@string/hello" |
11 | <Button android:id= "@+id/btn_test" |
12 | android:layout_width= "fill_parent" |
13 | android:layout_height= "wrap_content" |
14 | android:text= "ListProgress" |
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" |
