setText() 和 setProgress() 未在 ViewPager 中更新
setText() and setProgress() not updating in ViewPager
我的应用程序
使用 ViewPager
和 Fragements
。每个 Fragment
显示一个 ListView
,一个 CheckBoxes
,一个 ProgressBar
和一个 TextView
。如果 6 个 CheckBoxes
中有 3 个正在接受检查,则 ProgressBar
和 TextView
应该更新为 3%。
问题
TextView 和 ProgressBar 没有正确显示更新。我记录了计算的进度值以及 tv.getText()
和 pb.getProgress()
的值。有两个问题:
1.)进度值与tv.getText()
和pb.getProgress()
的值
不相等。 tv.getText()
和 pb.getProgress()
返回的值是
总是 3% 太高或太低。
(是的,我传递给 setProgress() 和 setText() 的值是正确的)
11-30 14:44:57.099 14230-14230/com.example..myapplication
D/CheckBox: setProgressBar()
progress should be = 3%
progressBar is = 0%
progressText is = 0%
11-30 14:45:02.275 14230-14230/com.example..myapplication
D/CheckBox: setProgressBar()
progress should be = 7%
progressBar is = 3%
progressText is = 3%
2.) TextView
和 ProgressBar
视图始终显示 0%。
我花了好几个小时试图解决这个问题,但我什至在 Whosebug 上找不到解决方案。出了什么问题?
片段class
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable
ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment, container, false);
progressBar = view.findViewById(R.id.progressBar);
progressText = view.findViewById(R.id.progressText);
lv = view.findViewById(R.id.list_view_nahrungsmittel);
dateTV = view.findViewById(R.id.changeDate);
leftBTN = view.findViewById(R.id.changeDateBTNLeft);
rightBTN = view.findViewById(R.id.changeDateBTNRight);
backToTodayBTN = view.findViewById(R.id.backToTodayBTN);
mDB = new DBHelper(getContext()); //hier oder main?
items = MainActivity.getList();
setBTN();
setBackToTodayButton();
setNumCheckedCB();
setDateTV();
setProgressBarFirstTime();
setListAdapter();
setListViewListener();
setButtons();
return view;
}
public void setProgressBar(int i) {
Log.d("CheckBox", "setProgressBar()");
progress = (int)(((float)i * 100f) / (float) MainActivity.getNumCB());
Log.d("CheckBox", "progress should be = " + progress + "%" );
Log.d("CheckBox", "progressBar is = " + progressBar.getProgress() + "%" );
Log.d("CheckBox", "progressText is = " + progressText.getText() );
progressBar.setProgress(progress);
progressText.setText(progress + "%");
}
列表适配器
为ListView中的每个CheckBox设置Listener,调用setProgressBar()方法。
//Click on CB
final DataHolder finalHolder1 = holder;
holder.cb1.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if(buttonView.isPressed()) {
buttonView.setChecked(isChecked);
//Update Progress
int i = 0;
boolean[] stateCheckBox = mDB.getCheckBoxState(date, item.getTitle());
if(isChecked){
if(finalHolder1.cb1.getVisibility() == View.VISIBLE && finalHolder1.cb2.getVisibility() == View.VISIBLE && finalHolder1.cb3.getVisibility() == View.VISIBLE ){
if(stateCheckBox[1] == false && stateCheckBox[2] ==false) { i = 3; }
else if (stateCheckBox[1] == false && stateCheckBox[2] ==true) { i = 2; }
else if (stateCheckBox[1] == true && stateCheckBox[2] ==true) { i = 1; }
}
else if (finalHolder1.cb1.getVisibility() == View.VISIBLE && finalHolder1.cb2.getVisibility() == View.VISIBLE) {
if (stateCheckBox[1] == false) { i = 2; }
else if (stateCheckBox[1] == true) { i = 1; }
}
else { i = 1; }
}
else { i = 1; }
updateNumCheckedCheckBoxes(date, isChecked, i);
//Update CB state
//Case1: Three CB in row, Left gets checked -> set all other right CB´s checked
if (isChecked) {
finalHolder1.cb2.setChecked(isChecked);
finalHolder1.cb3.setChecked(isChecked);
mDB.updateCheckBoxState(date, item.getTitle(), isChecked, isChecked, isChecked);
} else {
if (finalHolder1.cb2.getVisibility() == View.GONE) {
//Case2: Only one Cb in row, uncheck
mDB.updateCheckBoxState(date, item.getTitle(), isChecked, isChecked, isChecked);
} else if (finalHolder1.cb3.getVisibility() == View.GONE) {
//Case3: Two Cb in row, left gets unchecked
mDB.updateCheckBoxState(date, item.getTitle(), isChecked, !isChecked, !isChecked);
} else {
//Case4: Three CB, left gets unchecked
mDB.updateCheckBoxState(date, item.getTitle(), isChecked, !isChecked, !isChecked);
}
}
}
}
});
holder.cb2.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if(buttonView.isPressed()) {
buttonView.setChecked(isChecked);
//Update Progress
int i = 0;
boolean[] stateCheckBox = mDB.getCheckBoxState(date, item.getTitle());
if(isChecked){
if(finalHolder1.cb1.getVisibility() == View.VISIBLE && finalHolder1.cb2.getVisibility() == View.VISIBLE && finalHolder1.cb3.getVisibility() == View.VISIBLE ){
if(stateCheckBox[2] ==false) { i = 2;}
else if (stateCheckBox[2] ==true) { i = 1;}
}
else if (finalHolder1.cb1.getVisibility() == View.VISIBLE && finalHolder1.cb2.getVisibility() == View.VISIBLE) { i = 1; }
}
else {
if(finalHolder1.cb1.getVisibility() == View.VISIBLE && finalHolder1.cb2.getVisibility() == View.VISIBLE && finalHolder1.cb3.getVisibility() == View.VISIBLE ){
if(stateCheckBox[0] ==false) { i = 1; }
else if (stateCheckBox[2] ==true) { i = 2; }
}
else if (finalHolder1.cb1.getVisibility() == View.VISIBLE && finalHolder1.cb2.getVisibility() == View.VISIBLE) {
if(stateCheckBox[0] == true) { i = 2; }
else if (stateCheckBox[0] == false) { i = 1;}
}
}
updateNumCheckedCheckBoxes(date, isChecked, i);
//Update CB state
//Case5: Second from the left CB gets checked -> set right CB checked
if (isChecked) {
finalHolder1.cb3.setChecked(isChecked);
mDB.updateCheckBoxState(date, item.getTitle(), !isChecked, isChecked, isChecked);
}
//Case6: Second from the left CB gets unchecked -> set left CB unchecked
else {
finalHolder1.cb1.setChecked(isChecked);
mDB.updateCheckBoxState(date, item.getTitle(), isChecked, isChecked, !isChecked);
}
}
}
});
holder.cb3.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if(buttonView.isPressed()) {
buttonView.setChecked(isChecked);
//Update Progress
int i = 0;
boolean[] stateCheckBox = mDB.getCheckBoxState(date, item.getTitle());
if(isChecked){ i = 1; }
else {
if(finalHolder1.cb1.getVisibility() == View.VISIBLE && finalHolder1.cb2.getVisibility() == View.VISIBLE && finalHolder1.cb3.getVisibility() == View.VISIBLE ){
if(stateCheckBox[0] == false && stateCheckBox[1] == false) { i = 1; }
else if (stateCheckBox[0] == false && stateCheckBox[1] ==true) { i = 2; }
else if (stateCheckBox[0] == true && stateCheckBox[1] == true) { i = 3; }
}
}
updateNumCheckedCheckBoxes(date, isChecked, i);
//Update CB state
//Case5: Right CB gets unchecked -> set all other left CB´s unchecked
if (!isChecked) {
finalHolder1.cb2.setChecked(isChecked);
finalHolder1.cb1.setChecked(isChecked);
mDB.updateCheckBoxState(date, item.getTitle(), isChecked, isChecked, isChecked);
}
else {
//Case 6: 3CBs, only right CB gets checked
mDB.updateCheckBoxState(date, item.getTitle(), !isChecked, !isChecked, isChecked);
}
}
}
});
//Click on Image Button
holder.imageButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v){
Intent intent = new Intent(context , Statistic2Activity.class);
context.startActivity(intent);
}
});
}
private void updateNumCheckedCheckBoxes (String date, boolean isChecked, int i){
mDB.updateNumCheckedCheckBoxes(date, isChecked, i);
updateProgressBar(date);
}
在 setProgressBar() 方法中添加这个解决了我的问题:
progressBar = view.findViewById(R.id.progressBar);
progressText = view.findViewById(R.id.progressText);
我的应用程序
使用 ViewPager
和 Fragements
。每个 Fragment
显示一个 ListView
,一个 CheckBoxes
,一个 ProgressBar
和一个 TextView
。如果 6 个 CheckBoxes
中有 3 个正在接受检查,则 ProgressBar
和 TextView
应该更新为 3%。
问题
TextView 和 ProgressBar 没有正确显示更新。我记录了计算的进度值以及 tv.getText()
和 pb.getProgress()
的值。有两个问题:
1.)进度值与tv.getText()
和pb.getProgress()
的值
不相等。 tv.getText()
和 pb.getProgress()
返回的值是
总是 3% 太高或太低。
(是的,我传递给 setProgress() 和 setText() 的值是正确的)
11-30 14:44:57.099 14230-14230/com.example..myapplication
D/CheckBox: setProgressBar()
progress should be = 3%
progressBar is = 0%
progressText is = 0%
11-30 14:45:02.275 14230-14230/com.example..myapplication
D/CheckBox: setProgressBar()
progress should be = 7%
progressBar is = 3%
progressText is = 3%
2.) TextView
和 ProgressBar
视图始终显示 0%。
我花了好几个小时试图解决这个问题,但我什至在 Whosebug 上找不到解决方案。出了什么问题?
片段class
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable
ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment, container, false);
progressBar = view.findViewById(R.id.progressBar);
progressText = view.findViewById(R.id.progressText);
lv = view.findViewById(R.id.list_view_nahrungsmittel);
dateTV = view.findViewById(R.id.changeDate);
leftBTN = view.findViewById(R.id.changeDateBTNLeft);
rightBTN = view.findViewById(R.id.changeDateBTNRight);
backToTodayBTN = view.findViewById(R.id.backToTodayBTN);
mDB = new DBHelper(getContext()); //hier oder main?
items = MainActivity.getList();
setBTN();
setBackToTodayButton();
setNumCheckedCB();
setDateTV();
setProgressBarFirstTime();
setListAdapter();
setListViewListener();
setButtons();
return view;
}
public void setProgressBar(int i) {
Log.d("CheckBox", "setProgressBar()");
progress = (int)(((float)i * 100f) / (float) MainActivity.getNumCB());
Log.d("CheckBox", "progress should be = " + progress + "%" );
Log.d("CheckBox", "progressBar is = " + progressBar.getProgress() + "%" );
Log.d("CheckBox", "progressText is = " + progressText.getText() );
progressBar.setProgress(progress);
progressText.setText(progress + "%");
}
列表适配器
为ListView中的每个CheckBox设置Listener,调用setProgressBar()方法。
//Click on CB
final DataHolder finalHolder1 = holder;
holder.cb1.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if(buttonView.isPressed()) {
buttonView.setChecked(isChecked);
//Update Progress
int i = 0;
boolean[] stateCheckBox = mDB.getCheckBoxState(date, item.getTitle());
if(isChecked){
if(finalHolder1.cb1.getVisibility() == View.VISIBLE && finalHolder1.cb2.getVisibility() == View.VISIBLE && finalHolder1.cb3.getVisibility() == View.VISIBLE ){
if(stateCheckBox[1] == false && stateCheckBox[2] ==false) { i = 3; }
else if (stateCheckBox[1] == false && stateCheckBox[2] ==true) { i = 2; }
else if (stateCheckBox[1] == true && stateCheckBox[2] ==true) { i = 1; }
}
else if (finalHolder1.cb1.getVisibility() == View.VISIBLE && finalHolder1.cb2.getVisibility() == View.VISIBLE) {
if (stateCheckBox[1] == false) { i = 2; }
else if (stateCheckBox[1] == true) { i = 1; }
}
else { i = 1; }
}
else { i = 1; }
updateNumCheckedCheckBoxes(date, isChecked, i);
//Update CB state
//Case1: Three CB in row, Left gets checked -> set all other right CB´s checked
if (isChecked) {
finalHolder1.cb2.setChecked(isChecked);
finalHolder1.cb3.setChecked(isChecked);
mDB.updateCheckBoxState(date, item.getTitle(), isChecked, isChecked, isChecked);
} else {
if (finalHolder1.cb2.getVisibility() == View.GONE) {
//Case2: Only one Cb in row, uncheck
mDB.updateCheckBoxState(date, item.getTitle(), isChecked, isChecked, isChecked);
} else if (finalHolder1.cb3.getVisibility() == View.GONE) {
//Case3: Two Cb in row, left gets unchecked
mDB.updateCheckBoxState(date, item.getTitle(), isChecked, !isChecked, !isChecked);
} else {
//Case4: Three CB, left gets unchecked
mDB.updateCheckBoxState(date, item.getTitle(), isChecked, !isChecked, !isChecked);
}
}
}
}
});
holder.cb2.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if(buttonView.isPressed()) {
buttonView.setChecked(isChecked);
//Update Progress
int i = 0;
boolean[] stateCheckBox = mDB.getCheckBoxState(date, item.getTitle());
if(isChecked){
if(finalHolder1.cb1.getVisibility() == View.VISIBLE && finalHolder1.cb2.getVisibility() == View.VISIBLE && finalHolder1.cb3.getVisibility() == View.VISIBLE ){
if(stateCheckBox[2] ==false) { i = 2;}
else if (stateCheckBox[2] ==true) { i = 1;}
}
else if (finalHolder1.cb1.getVisibility() == View.VISIBLE && finalHolder1.cb2.getVisibility() == View.VISIBLE) { i = 1; }
}
else {
if(finalHolder1.cb1.getVisibility() == View.VISIBLE && finalHolder1.cb2.getVisibility() == View.VISIBLE && finalHolder1.cb3.getVisibility() == View.VISIBLE ){
if(stateCheckBox[0] ==false) { i = 1; }
else if (stateCheckBox[2] ==true) { i = 2; }
}
else if (finalHolder1.cb1.getVisibility() == View.VISIBLE && finalHolder1.cb2.getVisibility() == View.VISIBLE) {
if(stateCheckBox[0] == true) { i = 2; }
else if (stateCheckBox[0] == false) { i = 1;}
}
}
updateNumCheckedCheckBoxes(date, isChecked, i);
//Update CB state
//Case5: Second from the left CB gets checked -> set right CB checked
if (isChecked) {
finalHolder1.cb3.setChecked(isChecked);
mDB.updateCheckBoxState(date, item.getTitle(), !isChecked, isChecked, isChecked);
}
//Case6: Second from the left CB gets unchecked -> set left CB unchecked
else {
finalHolder1.cb1.setChecked(isChecked);
mDB.updateCheckBoxState(date, item.getTitle(), isChecked, isChecked, !isChecked);
}
}
}
});
holder.cb3.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if(buttonView.isPressed()) {
buttonView.setChecked(isChecked);
//Update Progress
int i = 0;
boolean[] stateCheckBox = mDB.getCheckBoxState(date, item.getTitle());
if(isChecked){ i = 1; }
else {
if(finalHolder1.cb1.getVisibility() == View.VISIBLE && finalHolder1.cb2.getVisibility() == View.VISIBLE && finalHolder1.cb3.getVisibility() == View.VISIBLE ){
if(stateCheckBox[0] == false && stateCheckBox[1] == false) { i = 1; }
else if (stateCheckBox[0] == false && stateCheckBox[1] ==true) { i = 2; }
else if (stateCheckBox[0] == true && stateCheckBox[1] == true) { i = 3; }
}
}
updateNumCheckedCheckBoxes(date, isChecked, i);
//Update CB state
//Case5: Right CB gets unchecked -> set all other left CB´s unchecked
if (!isChecked) {
finalHolder1.cb2.setChecked(isChecked);
finalHolder1.cb1.setChecked(isChecked);
mDB.updateCheckBoxState(date, item.getTitle(), isChecked, isChecked, isChecked);
}
else {
//Case 6: 3CBs, only right CB gets checked
mDB.updateCheckBoxState(date, item.getTitle(), !isChecked, !isChecked, isChecked);
}
}
}
});
//Click on Image Button
holder.imageButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v){
Intent intent = new Intent(context , Statistic2Activity.class);
context.startActivity(intent);
}
});
}
private void updateNumCheckedCheckBoxes (String date, boolean isChecked, int i){
mDB.updateNumCheckedCheckBoxes(date, isChecked, i);
updateProgressBar(date);
}
在 setProgressBar() 方法中添加这个解决了我的问题:
progressBar = view.findViewById(R.id.progressBar);
progressText = view.findViewById(R.id.progressText);