Android ListView 中更新 ProgressBar 进度完整demo

来源:互联网 发布:七星彩庄家辅助软件 编辑:程序博客网 时间:2024/05/29 08:17
网上搜了一下ListView的Item中嵌套ProgressBar,很多都不对,有些滑动进度会错乱,导包没复制,自己导下包,简单起见,所有类都写在ProgressActivity 中了,有什么不对的请联系。activity_progress  布局
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical">    <ListView        android:id="@+id/list"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:cacheColorHint="@android:color/transparent"        android:divider="@android:color/darker_gray"        android:dividerHeight="1dp"        android:listSelector="@android:color/transparent" /></LinearLayout>


progress_item 布局  
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:paddingTop="10dp"    android:paddingBottom="10dp"    android:minHeight="?android:attr/listPreferredItemHeight"    android:orientation="vertical" >    <TextView        android:id="@+id/item_name"        android:layout_width="match_parent"        android:layout_height="wrap_content" />    <ProgressBar        android:id="@+id/item_progress"        style="?android:attr/progressBarStyleHorizontal"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:visibility="invisible" />    <TextView        android:id="@+id/item_progress_desc"        android:layout_width="match_parent"        android:layout_height="wrap_content" /></LinearLayout>

public class ProgressActivity extends Activity {    private List<Data> mTasks = new ArrayList<>();    private ListView mListView;    @Override    protected void onCreate(@Nullable Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_progress);        for (int i = 0; i < 50; i++) {            mTasks.add(new Data());        }        mListView = (ListView) findViewById(R.id.list);        mListView.setAdapter(new MyAdapter());        mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {            @Override            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {                download(position);            }        });    }    private void download(final int positionInAdapter) {        mTasks.get(positionInAdapter).setDownload(true);        if (positionInAdapter >= mListView.getFirstVisiblePosition() &&                positionInAdapter <= mListView.getLastVisiblePosition()) {            int positionInListView = positionInAdapter - mListView.getFirstVisiblePosition();            ProgressBar item = (ProgressBar) mListView.getChildAt(positionInListView)                    .findViewById(R.id.item_progress);            item.setVisibility(View.VISIBLE);        }        new Thread(new Runnable() {            @Override            public void run() {                for (int i = 1; i < 101; i++) {                    final int progress = i;                    runOnUiThread(new Runnable() {                        @Override                        public void run() {                            publishProgress(positionInAdapter, progress);                        }                    });                    SystemClock.sleep(500);                }            }        }).start();    }    public void publishProgress(final int positionInAdapter, final int progress) {        mTasks.get(positionInAdapter).setProgress(progress);        if (positionInAdapter >= mListView.getFirstVisiblePosition() &&                positionInAdapter <= mListView.getLastVisiblePosition()) {            int positionInListView = positionInAdapter - mListView.getFirstVisiblePosition();            ProgressBar item = (ProgressBar) mListView.getChildAt(positionInListView)                    .findViewById(R.id.item_progress);            item.setProgress(progress);        }    }    class MyAdapter extends BaseAdapter {        @Override        public int getCount() {            return mTasks.size();        }        @Override        public Object getItem(int position) {            return mTasks.get(position);        }        @Override        public long getItemId(int position) {            return position;        }        @Override        public View getView(int position, View convertView, ViewGroup parent) {            ViewHolder viewHolder;            if (convertView == null) {                viewHolder = new ViewHolder();                convertView = View.inflate(ProgressActivity.this, R.layout.progress_item, null);                viewHolder.textView = (TextView) convertView.findViewById(R.id.item_name);                viewHolder.progressBar = (ProgressBar) convertView.findViewById(R.id.item_progress);                convertView.setTag(viewHolder);            } else {                viewHolder = (ViewHolder) convertView.getTag();            }            viewHolder.textView.setText(mTasks.get(position).getName());            if (mTasks.get(position).isDownload()) {                viewHolder.progressBar.setVisibility(View.VISIBLE);                viewHolder.progressBar.setProgress(mTasks.get(position).getProgress());            } else {                viewHolder.progressBar.setVisibility(View.INVISIBLE);            }            return convertView;        }        class ViewHolder {            TextView textView;            ProgressBar progressBar;        }    }    class Data {        private String name;        private boolean isDownload;        private int progress;        public String getName() {            return name;        }        public void setName(String name) {            this.name = name;        }        public boolean isDownload() {            return isDownload;        }        public void setDownload(boolean download) {            isDownload = download;        }        public int getProgress() {            return progress;        }        public void setProgress(int progress) {            this.progress = progress;        }    }}
原创粉丝点击