public class BubbleSortActivity extends SortActivity{ ConstraintLayout constraintLayout; final Handler handler = new Handler(); @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_sort); shuffleButton = findViewById(R.id.shuffle); sortButton = findViewById(R.id.start); constraintLayout = findViewById(R.id.mainLayout); ID = Arrays.asList(R.id.num1,R.id.num2,R.id.num3,R.id.num4,R.id.num5,R.id.num6,R.id.num7,R.id.num8,R.id.num9); DRAWABLE = Arrays.asList(R.drawable.icons8_1_24,R.drawable.icons8_2_24,R.drawable.icons8_3_24,R.drawable.icons8_4_24,R.drawable.icons8_5_24, R.drawable.icons8_6_24,R.drawable.icons8_7_24,R.drawable.icons8_8_24,R.drawable.icons8_9_24); RED_DRAWABLE = Arrays.asList(R.drawable.icons8_1_24_red,R.drawable.icons8_2_24_red,R.drawable.icons8_3_24_red,R.drawable.icons8_4_24_red,R.drawable.icons8_5_24_red, R.drawable.icons8_6_24_red,R.drawable.icons8_7_24_red,R.drawable.icons8_8_24_red,R.drawable.icons8_9_24_red); YELLOW_DRAWABLE = Arrays.asList(R.drawable.icons8_1_24_yellow,R.drawable.icons8_2_24_yellow,R.drawable.icons8_3_24_yellow,R.drawable.icons8_4_24_yellow,R.drawable.icons8_5_24_yellow, R.drawable.icons8_6_24_yellow,R.drawable.icons8_7_24_yellow,R.drawable.icons8_8_24_yellow,R.drawable.icons8_9_24_yellow); shuffleButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { shuffleList(); updateList(); } }); sortButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { swap(1,2); } }); } @Override void updateList() { ConstraintSet constraintSet = new ConstraintSet(); constraintSet.clone(constraintLayout); for (int i=0;i<list.length;i++){ constraintSet.connect(ID.get(list[i]),ConstraintSet.START,(i==0)?R.id.mainLayout:ID.get(list[i-1]),(i==0)?ConstraintSet.START:ConstraintSet.END); constraintSet.connect(ID.get(list[i]),ConstraintSet.END,(i==list.length-1)?R.id.mainLayout:ID.get(list[i+1]),(i==list.length-1)?ConstraintSet.END:ConstraintSet.START); } constraintSet.applyTo(constraintLayout); } @Override boolean check(final int index1,final int index2) { final ImageView view1 = findViewById(ID.get(list[index1])); final ImageView view2 = findViewById(ID.get(list[index2])); view1.setImageResource(YELLOW_DRAWABLE.get(list[index1])); view2.setImageResource(YELLOW_DRAWABLE.get(list[index2])); handler.postDelayed(new Runnable() { @Override public void run() { view1.setImageResource(DRAWABLE.get(list[index1])); view2.setImageResource(DRAWABLE.get(list[index2])); } },500); return (list[index1]>list[index2]); } @Override void swap(final int index1,final int index2) { final ImageView view1 = findViewById(ID.get(list[index1])); final ImageView view2 = findViewById(ID.get(list[index2])); view1.setImageResource(RED_DRAWABLE.get(list[index1])); view2.setImageResource(RED_DRAWABLE.get(list[index2])); int buff = list[index1]; list[index1] = list[index2]; list[index2] = buff; handler.postDelayed(new Runnable() { @Override public void run() { updateList(); } },3000); handler.postDelayed(new Runnable() { @Override public void run() { view1.setImageResource(DRAWABLE.get(list[index1])); view2.setImageResource(DRAWABLE.get(list[index2])); } },3000); } } public abstract class SortActivity extends AppCompatActivity { int[] list = {0,1,2,3,4,5,6,7,8}; Button shuffleButton; Button sortButton; List<Integer> ID; List<Integer> DRAWABLE; List<Integer> YELLOW_DRAWABLE; List<Integer> RED_DRAWABLE; void shuffleList() { // If running on Java 6 or older, use `new Random()` on RHS here Random rnd = ThreadLocalRandom.current(); for (int i = list.length - 1; i > 0; i--) { int index = rnd.nextInt(i + 1); // Simple swap int a = list[index]; list[index] = list[i]; list[i] = a; } } abstract void sort(); abstract boolean check(final int index1,final int index2); abstract void swap(final int index1,final int index2); abstract void updateList(); } <ImageView android:id="@+id/num9" style="@style/ArrayElement" android:layout_width="40dp" android:layout_height="40dp" android:src="@drawable/icons8_9_24" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.5" app:layout_constraintStart_toEndOf="@+id/num8" app:layout_constraintTop_toTopOf="parent" /> When you press the button for the first time, the color simply changes, the numbers in places do not change, they change only from the second time.
