我声明了一个空的 LinearLayout,在我的 onCreate 方法中我调用了一个函数,该函数有一个重复五次的循环来膨胀另一个布局并将其添加到我的 LinearLayout。
private void setupList() {
LayoutInflater layoutInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
LinearLayout itemList = (LinearLayout) findViewById( R.id.itemList );
itemList.removeAllViews();
for ( Category category :: categories ) {
View rowView = layoutInflater.inflate(R.layout.category_row, null);
initializeRow( rowView, category.percentComplete );
itemList.addView( rowView );
}
}
然后在我的 initializeRow 方法中,我初始化了一个 TextView 和 ProgressBar,它们位于我刚刚膨胀的视图中。
private void initializeRow( final View view, final int percentComplete ) {
TextView topicView = ((TextView) view.findViewById(R.id.topic));
topicView.setText( category.title );
ProgressBar progressBar = (ProgressBar) view.findViewById( R.id.progressBar );
progressBar.setMax( 100 );
progressBar.setProgress( percentComplete );
TextView textView = (TextView) view.findViewById( R.id.progressText );
textView.setText( percentComplete "% Complete" );
}
第一次创建此活动时,进度条和文本视图会以正确的值显示。但是,如果我旋转我的设备,TextViews 会以正确的值显示,但所有 ProgressBars 都会显示与最后一个 ProgressBar 对应的进度。为什么这在最初调用 onCreate 时有效,但在设备旋转后调用 onCreate 方法时无效?
我意识到所有的 ProgressBars 都有相同的 id。但是在我的代码中,我通过使用我膨胀的视图的 findViewById 来获取对特定 ProgressBar 的引用。我可以通过调用给每个 ProgressBar 一个唯一的 id 来完成这项工作
progressBar.setId( progressBarIds[ position ] );
在我的 initializeRow 方法中。我很好奇这种行为是由 ProgressBar 中的某些错误引起的,或者是否有一些我不理解的关于 layoutInflaters 或 ProgressBars 的规则。