[英]Android Listview autoscroll makes items invisible
我有進度項目的進度列表視圖。 每當項目完成時,我都會選中它。
此 Progress 項目分為階段。 每個階段都可以包含步驟。 完成所有步驟並用復選標記標記后,代碼將整個階段標記為完成。
最后,我所做的只是呈現階段的列表視圖,對於每個階段,我都會在其中動態添加另一個列表視圖。 我最終得到了包含更多列表視圖的列表視圖。
這工作正常,我沒有任何問題。
我的老板讓我創建自動滾動器,它將按照已完成的步驟進行。 這是我實施的,很高興看到它有效。
問題:我很高興它只在達到一半多一點的時候起作用。 然后突然物品消失了。 當我觸摸列表時,列表返回頂部並且所有項目都可見。
知道什么可能導致這種行為嗎?
這個代碼非常大,所以我只會分享我認為需要的部分。
//適配器
public class ProcessFeedbackAdapter extends android.widget.BaseAdapter {
public static final String TAG = "ProcessFeedbackAdapter";
public Context appContext;
public ProgressOverviewData ProgressOverviewData;
public ListView Listview;
public int FirstNotCompletedIndex=0;
public void UpdateList(){
HotApplication.getHandler().post(new Runnable(){
@Override
public void run() {
notifyDataSetChanged();
}
});
}
public ProcessFeedbackAdapter(Context Context,ProgressOverviewData ProgressOverviewData,ListView listview){
this.appContext=Context;
this.ProgressOverviewData=ProgressOverviewData;
this.Listview=listview;
}
@Override
public int getCount() {
return ProgressOverviewData.Phases.size();
}
@Override
public Object getItem(int i) {
return null;
}
@Override
public long getItemId(int i) {
return 0;
}
public void ScrollToCurrentlyActiveTask(int y){
int listviewBottom = Listview.getBottom();
if(listviewBottom <y*50){
Listview.scrollTo(0, listviewBottom);
}
else {
Listview.scrollTo(0,y*50);
}
Listview.computeScroll();
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
try {
Phase curItem = ProgressOverviewData.Phases.get(i);
LayoutInflater inflater = (LayoutInflater) appContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = inflater.inflate(R.layout.progress_list_item, null);
ListView ChildList=view.findViewById(R.id.childrenList);
ViewGroup.LayoutParams params = ChildList.getLayoutParams();
int ListHeight=curItem.PhaseSteps.size()*50;
params.height=ListHeight;
ChildList.setLayoutParams(params);
TextView ProgressMessage = (TextView) view.findViewById(R.id.ProgressMessage);
ImageView Check = (ImageView) view.findViewById(R.id.CheckMark);
ImageView ErrorMark = (ImageView) view.findViewById(R.id.ErrorMark);
ProcessFeedbackChildrenAdapter ChilAdapter=new ProcessFeedbackChildrenAdapter(appContext,curItem.PhaseSteps);
ChildList.setAdapter(ChilAdapter);
int CheckVisibility = 0;
int ErrorVisibility=0;
if(curItem.Status.equals(AppEnums.StepResult.NotCompleted)){
CheckVisibility=View.INVISIBLE;
ErrorVisibility=View.INVISIBLE;
}
else if(curItem.Status.equals(AppEnums.StepResult.Completed)){
CheckVisibility=View.VISIBLE;
ErrorVisibility=View.INVISIBLE;
}
else if(curItem.Status.equals(AppEnums.StepResult.Failed)){
ErrorVisibility=View.VISIBLE;
CheckVisibility=View.INVISIBLE;
}
Check.setVisibility(CheckVisibility);
ErrorMark.setVisibility(ErrorVisibility);
ProgressMessage.setText(curItem.PhaseName);
return view;
} catch (Exception e) {
System.out.println("Something went wrong.");
}
return view;
}
}
class ProcessFeedbackChildrenAdapter extends android.widget.BaseAdapter {
public static final String TAG = "ProcessFeedbackChildrenAdapter";
public Context appContext;
public ArrayList<Step> Steps= new ArrayList<Step>();
public void UpdateList(){
HotApplication.getHandler().post(new Runnable(){
@Override
public void run() {
notifyDataSetChanged();
}
});
}
public ProcessFeedbackChildrenAdapter(Context Context,ArrayList<Step> Steps){
this.appContext=Context;
this.Steps=Steps;
}
@Override
public int getCount() {
return Steps.size();
}
@Override
public Object getItem(int i) {
return null;
}
@Override
public long getItemId(int i) {
return 0;
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
try {
LayoutInflater inflater = (LayoutInflater) appContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = inflater.inflate(R.layout.progress_list_item_children, null);
TextView ProgressMessage = (TextView) view.findViewById(R.id.ProgressMessage);
ImageView Check = (ImageView) view.findViewById(R.id.CheckMark);
ImageView ErrorMark = (ImageView) view.findViewById(R.id.ErrorMark);
Step curItem = Steps.get(i);
int CheckVisibility = 0;
int ErrorVisibility=0;
if(curItem.Status== AppEnums.StepResult.NotCompleted){
CheckVisibility=View.INVISIBLE;
ErrorVisibility=View.INVISIBLE;
}else {
if(curItem.Status== AppEnums.StepResult.Completed){
CheckVisibility=View.VISIBLE;
ErrorVisibility=View.INVISIBLE;
}
else if(curItem.Status==AppEnums.StepResult.Failed){
ErrorVisibility=View.VISIBLE;
CheckVisibility=View.INVISIBLE;
}
}
ProgressMessage.setText(curItem.StepName);
Check.setVisibility(CheckVisibility);
ErrorMark.setVisibility(ErrorVisibility);
return view;
} catch (Exception e) {
System.out.println("Something went wrong.");
}
return view;
}
}
// 主列表視圖
<ListView
android:id="@+id/ProgressStepsContainer"
android:layout_width="0dp"
android:layout_height="267dp"
android:fastScrollEnabled="false"
android:scrollbarThumbVertical="@drawable/scrollbar_vertical_thumb"
android:verticalScrollbarPosition="left"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/ProgressErrorContainer"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/ProgressMessage">
</ListView>
// 階段列表項
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="0dp">
<ImageView
android:id="@+id/CheckMark"
android:layout_width="50dp"
android:layout_height="50dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/ic_overview_check" />
<ImageView
android:id="@+id/ErrorMark"
android:layout_width="50dp"
android:layout_height="50dp"
android:visibility="visible"
app:layout_constraintStart_toStartOf="@+id/CheckMark"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/ic_overview_error" />
<TextView
android:id="@+id/ProgressMessage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:text="TextView"
android:textAlignment="center"
android:textColor="@color/colorWhitish"
android:textSize="18sp"
app:layout_constraintBottom_toBottomOf="@+id/CheckMark"
app:layout_constraintStart_toEndOf="@+id/CheckMark"
app:layout_constraintTop_toTopOf="parent" />
<ListView
android:id="@+id/childrenList"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
app:layout_constraintStart_toEndOf="@+id/CheckMark"
app:layout_constraintTop_toBottomOf="@+id/ProgressMessage" />
</androidx.constraintlayout.widget.ConstraintLayout>
// 步驟(內部)列表項
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="wrap_content"
android:layout_height="50dp">
<ImageView
android:id="@+id/CheckMark"
android:layout_width="50dp"
android:layout_height="50dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/ic_overview_check" />
<ImageView
android:id="@+id/ErrorMark"
android:layout_width="50dp"
android:layout_height="50dp"
android:visibility="visible"
app:layout_constraintStart_toStartOf="@+id/CheckMark"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/ic_overview_error" />
<TextView
android:id="@+id/ProgressMessage"
android:layout_width="wrap_content"
android:layout_height="50dp"
android:gravity="center"
android:text="TextView"
android:textAlignment="center"
android:textColor="@color/colorWhitish"
android:textSize="18sp"
app:layout_constraintBottom_toBottomOf="@+id/CheckMark"
app:layout_constraintStart_toEndOf="@+id/CheckMark"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
您的適配器代碼在我的手機中不起作用。 僅顯示子列表的一部分。 另外,我認為您的要求通過 ExpandableListView 更容易實現。 因此,我遵循了您的數據結構並創建了以下使用 ExpandableListView 的演示代碼。 您可以開始一個新項目並嘗試一下。
主活動.java:
public class MainActivity extends AppCompatActivity {
ProgressOverviewData sampleData;
ProcessFeedbackAdapter1 adapter;
ExpandableListView listView;
TextView textView;
int completedPhase = 0;
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
sampleData = new ProgressOverviewData("Project", new ArrayList<Phase>());
textView = findViewById(R.id.ProgressMessage);
textView.setText(sampleData.projectName);
listView = findViewById(R.id.ProgressStepsContainer);
adapter = new ProcessFeedbackAdapter1(this, sampleData);
listView.setAdapter(adapter);
// Disable ExpandableListView from group collapse by override OnGroupClickListener.
listView.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() {
@Override
public boolean onGroupClick(ExpandableListView expandableListView, View view, int i, long l) {
return true;
}
});
for (int i = 0; i < sampleData.Phases.size(); i++) listView.expandGroup(i);
Button btAddPhase = findViewById(R.id.bt_add_phase);
btAddPhase.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Phase newPhase = genNewPhase();
sampleData.Phases.add(newPhase);
adapter.notifyDataSetChanged();
listView.expandGroup(sampleData.Phases.size() - 1);
textView.setText(sampleData.projectName + " [" + completedPhase + "/" + sampleData.Phases.size() + "]");
}
});
Button btCompletedStep = findViewById(R.id.bt_completed_step);
btCompletedStep.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
boolean stepCompleted = false;
Step step;
String msg = "";
int viewPosition = 0;
for (int i = 0; i < adapter.getGroupCount(); i++) {
viewPosition++;
for (int j = 0; j < adapter.getChildrenCount(i); j++) {
viewPosition++;
if (adapter.getChild(i, j).Status == AppEnums.StepResult.NotCompleted) {
step = adapter.getChild(i, j);
step.Status = AppEnums.StepResult.Completed;
msg = step.StepName + " Completed!";
if (j == adapter.getGroup(i).PhaseSteps.size() - 1) {
adapter.getGroup(i).Status = AppEnums.StepResult.Completed;
completedPhase++;
textView.setText(sampleData.projectName + " [" + completedPhase + "/" + sampleData.Phases.size() + "]");
msg += "\n" + adapter.getGroup(i).PhaseName + " Completed!!!!!";
}
stepCompleted = true;
break;
}
}
if (stepCompleted) break;
}
if (stepCompleted) {
Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(getApplicationContext(), "All Completed", Toast.LENGTH_LONG).show();
}
listView.smoothScrollToPositionFromTop(viewPosition - 1, 0);
adapter.notifyDataSetChanged();
}
});
}
private Phase genNewPhase() {
int phaseId = sampleData.Phases.size() + 1;
Random random = new Random();
int numberOfSteps = random.nextInt(5) + 1;
ArrayList<Step> steps = new ArrayList<>();
for (int j = 0; j < numberOfSteps; j++) {
Step step = new Step("Step " + (phaseId) + "-" + (j + 1));
steps.add(step);
}
return new Phase("Phase " + (phaseId) + " [" + steps.size() + "]", steps);
}
}
ProcessFeedbackAdapter1.java:
public class ProcessFeedbackAdapter1 extends BaseExpandableListAdapter {
public static final String TAG = "ProcessFeedbackAdapter";
public Context appContext;
public ProgressOverviewData ProgressOverviewData;
public ProcessFeedbackAdapter1(Context Context, ProgressOverviewData ProgressOverviewData) {
this.appContext = Context;
this.ProgressOverviewData = ProgressOverviewData;
}
@Override
public int getGroupCount() {
return ProgressOverviewData.Phases.size();
}
@Override
public int getChildrenCount(int i) {
return ProgressOverviewData.Phases.get(i).PhaseSteps.size();
}
@Override
public Phase getGroup(int i) {
return ProgressOverviewData.Phases.get(i);
}
@Override
public Step getChild(int i, int i1) {
return ProgressOverviewData.Phases.get(i).PhaseSteps.get(i1);
}
@Override
public long getGroupId(int i) {
return 0;
}
@Override
public long getChildId(int i, int i1) {
return 0;
}
@Override
public boolean hasStableIds() {
return false;
}
@Override
public View getGroupView(int i, boolean b, View view, ViewGroup viewGroup) {
try {
Phase curItem = getGroup(i);
LayoutInflater inflater = (LayoutInflater) appContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = inflater.inflate(R.layout.progress_list_item, null);
TextView ProgressMessage = view.findViewById(R.id.ProgressMessage);
ImageView Check = view.findViewById(R.id.CheckMark);
ImageView ErrorMark = view.findViewById(R.id.ErrorMark);
int CheckVisibility = 0;
int ErrorVisibility = 0;
if (curItem.Status.equals(AppEnums.StepResult.NotCompleted)) {
CheckVisibility = View.INVISIBLE;
ErrorVisibility = View.INVISIBLE;
} else if (curItem.Status.equals(AppEnums.StepResult.Completed)) {
CheckVisibility = View.VISIBLE;
ErrorVisibility = View.INVISIBLE;
} else if (curItem.Status.equals(AppEnums.StepResult.Failed)) {
ErrorVisibility = View.VISIBLE;
CheckVisibility = View.INVISIBLE;
}
Check.setVisibility(CheckVisibility);
ErrorMark.setVisibility(ErrorVisibility);
ProgressMessage.setText(curItem.PhaseName);
} catch (Exception e) {
System.out.println("Something went wrong.");
}
return view;
}
@Override
public View getChildView(int i, int i1, boolean b, View view, ViewGroup viewGroup) {
try {
LayoutInflater inflater = (LayoutInflater) appContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = inflater.inflate(R.layout.progress_list_item_children, null);
TextView ProgressMessage = view.findViewById(R.id.ProgressMessage);
ImageView Check = view.findViewById(R.id.CheckMark);
ImageView ErrorMark = view.findViewById(R.id.ErrorMark);
Step curItem = getChild(i, i1);
int CheckVisibility = 0;
int ErrorVisibility = 0;
if (curItem.Status == AppEnums.StepResult.NotCompleted) {
CheckVisibility = View.INVISIBLE;
ErrorVisibility = View.INVISIBLE;
} else {
if (curItem.Status == AppEnums.StepResult.Completed) {
CheckVisibility = View.VISIBLE;
ErrorVisibility = View.INVISIBLE;
} else if (curItem.Status == AppEnums.StepResult.Failed) {
ErrorVisibility = View.VISIBLE;
CheckVisibility = View.INVISIBLE;
}
}
ProgressMessage.setText(curItem.StepName);
Check.setVisibility(CheckVisibility);
ErrorMark.setVisibility(ErrorVisibility);
} catch (Exception e) {
System.out.println("Something went wrong.");
}
return view;
}
@Override
public boolean isChildSelectable(int i, int i1) {
return false;
}
}
活動_main.xml:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#000000"
tools:context=".MainActivity">
<TextView
android:id="@+id/ProgressMessage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Progress Messages:"
android:textColor="#F8F8F8"
android:textSize="20sp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/bt_add_phase"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingStart="20dp"
android:text="Add Phase"
app:layout_constraintRight_toLeftOf="@id/bt_completed_step"
app:layout_constraintTop_toTopOf="parent"
tools:ignore="RtlSymmetry" />
<Button
android:id="@+id/bt_completed_step"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingStart="20dp"
android:text="Completed Step"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:ignore="RtlSymmetry" />
<ImageView
android:id="@+id/ProgressErrorContainer"
android:layout_width="50dp"
android:layout_height="50dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@+id/ProgressMessage" />
<ExpandableListView
android:id="@+id/ProgressStepsContainer"
android:layout_width="0dp"
android:layout_height="267dp"
android:background="#000033"
android:fastScrollEnabled="false"
android:verticalScrollbarPosition="left"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/ProgressErrorContainer"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/ProgressMessage" />
</androidx.constraintlayout.widget.ConstraintLayout>
progress_list_item.xml:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="0dp">
<ImageView
android:id="@+id/CheckMark"
android:layout_width="50dp"
android:layout_height="50dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@android:drawable/checkbox_on_background" />
<ImageView
android:id="@+id/ErrorMark"
android:layout_width="50dp"
android:layout_height="50dp"
android:visibility="visible"
app:layout_constraintStart_toStartOf="@+id/CheckMark"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@android:drawable/ic_delete" />
<TextView
android:id="@+id/ProgressMessage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:textAlignment="center"
android:textColor="#F8F8F8"
android:textSize="18sp"
app:layout_constraintBottom_toBottomOf="@+id/CheckMark"
app:layout_constraintStart_toEndOf="@+id/CheckMark"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
progress_list_item_children.xml:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:paddingStart="50dp"
android:layout_width="wrap_content"
android:layout_height="50dp">
<ImageView
android:id="@+id/CheckMark"
android:layout_width="50dp"
android:layout_height="50dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@android:drawable/checkbox_on_background" />
<ImageView
android:id="@+id/ErrorMark"
android:layout_width="50dp"
android:layout_height="50dp"
android:visibility="visible"
app:layout_constraintStart_toStartOf="@+id/CheckMark"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@android:drawable/ic_delete" />
<TextView
android:id="@+id/ProgressMessage"
android:layout_width="wrap_content"
android:layout_height="50dp"
android:gravity="center"
android:textAlignment="center"
android:textColor="#F8F8F8"
android:textSize="18sp"
app:layout_constraintBottom_toBottomOf="@+id/CheckMark"
app:layout_constraintStart_toEndOf="@+id/CheckMark"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
對於與您的數據結構相關的類,您可以從您的原始項目中復制。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.