【发布时间】:2020-10-15 11:23:30
【问题描述】:
我有进度项目的进度列表视图。每当项目完成时,我都会勾选它。
此进度项目分为阶段。每个阶段都可以包含步骤。完成所有步骤并用复选标记标记后,代码将整个阶段标记为完成。
最后,我所做的只是渲染阶段的列表视图,并且对于每个阶段,我会在其中动态添加另一个列表视图。我最终得到了包含更多列表视图的列表视图。
这很好用,我没有任何问题。
我的老板让我创建自动滚动器,它会按照已完成的步骤进行。这是我实现的,很高兴看到它有效。
问题:我很高兴它只在达到一半多一点的时候才起作用。然后突然物品消失了。当我触摸列表时,列表会返回顶部并且所有项目都可见。
知道什么会导致这种行为吗?
这方面的代码很大,所以我只分享我认为需要的部分。
//适配器
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>
【问题讨论】: