Java Android Listview autoscroll使项目不可见

Java Android Listview autoscroll使项目不可见,java,android,listview,Java,Android,Listview,我有进度项目的进度列表视图。每当项目完成时,我都勾选它 该进度项目分为几个阶段。每个阶段都可以包含步骤。完成所有步骤并用复选标记后,代码将整个阶段标记为完成 最后,我所做的只是呈现一个阶段的listview,并为每个阶段动态添加另一个listview。我最终得到了包含更多listview的listview 这个很好用,我没有任何问题 我的老板让我创建一个自动滚动程序,它将按照完成的步骤进行操作。我实现了这一点,并且很高兴看到它能够工作 问题:我很高兴它只在达到一半多一点的时候起作用。然后突然间,

我有进度项目的进度列表视图。每当项目完成时,我都勾选它

该进度项目分为几个阶段。每个阶段都可以包含步骤。完成所有步骤并用复选标记后,代码将整个阶段标记为完成

最后,我所做的只是呈现一个阶段的listview,并为每个阶段动态添加另一个listview。我最终得到了包含更多listview的listview

这个很好用,我没有任何问题

我的老板让我创建一个自动滚动程序,它将按照完成的步骤进行操作。我实现了这一点,并且很高兴看到它能够工作

问题:我很高兴它只在达到一半多一点的时候起作用。然后突然间,我的心碎了。当我触摸列表时,列表返回顶部,所有项目都可见

你知道什么会导致这种行为吗

这方面的代码相当大,因此我将只分享我认为需要的部分

//适配器

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;
    }
}
公共类ProcessFeedbackAdapter扩展了android.widget.BaseAdapter{
公共静态最终字符串标记=“ProcessFeedbackAdapter”;
公共语境;
公共进度概览数据进度概览数据;
公共列表视图列表视图;
public int FirstNotCompletedIndex=0;
公共void UpdateList(){
HotApplication.getHandler().post(新的Runnable()){
@凌驾
公开募捐{
notifyDataSetChanged();
}
});
}
公共ProcessFeedbackAdapter(上下文上下文、ProgressOverviewData ProgressOverviewData、ListView ListView){
this.appContext=Context;
this.ProgressOverviewData=ProgressOverviewData;
this.Listview=Listview;
}
@凌驾
public int getCount(){
返回ProgressOverviewData.Phases.size();
}
@凌驾
公共对象getItem(int i){
返回null;
}
@凌驾
公共长getItemId(int i){
返回0;
}
公共无效滚动到当前活动任务(int y){
int listviewBottom=Listview.getBottom();

如果(listviewBottom您的适配器代码在我的手机中不起作用。只显示部分子列表。此外,我认为您的要求更容易通过ExpandableListView实现。因此,我按照您的数据结构创建了以下使用ExpandableListView的演示代码。您可以启动一个新项目并尝试

MainActivity.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);
}
}
activity_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>

进度\u列表\u项目\u 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>


对于与您的数据结构相关的类,您可以从原始项目中复制。

哇,我不相信有人会帮助我。非常感谢您的努力。我将在星期一试一试
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;
}
}
<?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>
<?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>
<?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>