网上搜了一下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;
}
}
}