Java 应用程序在主线程加载xml布局文件时做了太多工作
我正在制作一个9x9数独网格,其中81个单元格中的每个单元格本身就是一个3x3网格。 单个单元格的外观如下所示: 1 2 3 4 5 6 7 8 9 每个数字表示该单元格的铅笔批注。我有一个名为cell_layout.xml的文件,表示这个3x3排列 我已经能够生成网格,并且代码可以工作:Java 应用程序在主线程加载xml布局文件时做了太多工作,java,android,performance,android-layout,Java,Android,Performance,Android Layout,我正在制作一个9x9数独网格,其中81个单元格中的每个单元格本身就是一个3x3网格。 单个单元格的外观如下所示: 1 2 3 4 5 6 7 8 9 每个数字表示该单元格的铅笔批注。我有一个名为cell_layout.xml的文件,表示这个3x3排列 我已经能够生成网格,并且代码可以工作: @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedI
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.solver_principal);
TableLayout sudokuGrid = (TableLayout) findViewById(R.id.sudokuGrid);
sudokuGrid.setShrinkAllColumns(true);
sudokuGrid.setStretchAllColumns(true);
TableRow.LayoutParams paramsRow = new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT);
TableLayout.LayoutParams paramsLayout = new TableLayout.LayoutParams(TableLayout.LayoutParams.WRAP_CONTENT, TableLayout.LayoutParams.WRAP_CONTENT);
for(int i = 0; i < 9; ++i)
{
TableRow tableRow = new TableRow(SolverActivity.this);
tableRow.setDividerDrawable(getResources().getDrawable(R.drawable.column_divider));
tableRow.setShowDividers(LinearLayout.SHOW_DIVIDER_MIDDLE);
for(int j = 0; j < 9; ++j)
{
View cell = getLayoutInflater().inflate(R.layout.cell_layout, sudokuGrid, false);
cell.setLayoutParams(paramsRow);
tableRow.addView(cell);
}
tableRow.setLayoutParams(paramsLayout);
sudokuGrid.addView(tableRow);
}
}
@覆盖
创建时受保护的void(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.solver_principal);
TableLayout sudokuGrid=(TableLayout)findViewById(R.id.sudokuGrid);
sudokuGrid.setShrinkAllColumns(true);
sudokuGrid.setStretchAllColumns(true);
TableRow.LayoutParams paramsRow=新建TableRow.LayoutParams(TableRow.LayoutParams.WRAP_内容,TableRow.LayoutParams.WRAP_内容);
TableLayout.LayoutParams paramsLayout=新建TableLayout.LayoutParams(TableLayout.LayoutParams.WRAP_内容,TableLayout.LayoutParams.WRAP_内容);
对于(int i=0;i<9;++i)
{
TableRow TableRow=新TableRow(solveActivity.this);
tableRow.setDividerDrawable(getResources().getDrawable(R.drawable.column_divider));
tableRow.设置显示分隔符(线性布局。显示分隔符\u中间);
对于(int j=0;j<9;++j)
{
查看单元格=GetLayoutFlater()。充气(R.layout.cell_布局,sudokuGrid,false);
cell.setLayoutParams(paramsRow);
tableRow.addView(单元格);
}
tableRow.setLayoutParams(paramsLayout);
sudokuGrid.addView(tableRow);
}
}
上面的代码只是将想要的布局膨胀到TableLayout的81倍
有效,那么您的问题是什么?
创建该活动需要的时间太长。即使我只使用一行网格进行测试,该方法也需要花费太长的时间才能膨胀到所需布局的许多倍
我得到:
后台并发复制GC释放131244(9MB)AllocSpace对象,0(0B)LOS对象,24%空闲,74MB/98MB,暂停127us总计444.411ms
跳过153帧!应用程序可能在其主线程上做了太多工作
有人能为我的情况提出更好的方法吗?一个3x3的网格生成81次真的太多了吗
谢谢
编辑
所以我现在尝试手动写下xml文件。我认为不必对xml进行多次膨胀就能改善情况,但事实并非如此。
仅仅通过加载xml文件,我仍然存在同样的问题“主线程中的工作太多”
<TableLayout
android:id="@+id/sudokuGrid"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
android:layout_marginEnd="16dp"
android:divider="@drawable/row_divider"
android:showDividers="middle"
android:shrinkColumns="*"
android:stretchColumns="*"
app:layout_constraintDimensionRatio="1:1"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/solverTitle">
<TableRow
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:divider="@drawable/column_divider"
android:showDividers="middle">
<include
layout="@layout/cell_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<include
layout="@layout/cell_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<include
layout="@layout/cell_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<include
layout="@layout/cell_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<include
layout="@layout/cell_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<include
layout="@layout/cell_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<include
layout="@layout/cell_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<include
layout="@layout/cell_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<include
layout="@layout/cell_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</TableRow>
<TableRow
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:divider="@drawable/column_divider"
android:showDividers="middle">
<include
layout="@layout/cell_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<include
layout="@layout/cell_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<include
layout="@layout/cell_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<include
layout="@layout/cell_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<include
layout="@layout/cell_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<include
layout="@layout/cell_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<include
layout="@layout/cell_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<include
layout="@layout/cell_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<include
layout="@layout/cell_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</TableRow>
<TableRow
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:divider="@drawable/column_divider"
android:showDividers="middle">
<include
layout="@layout/cell_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<include
layout="@layout/cell_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<include
layout="@layout/cell_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<include
layout="@layout/cell_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<include
layout="@layout/cell_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<include
layout="@layout/cell_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<include
layout="@layout/cell_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<include
layout="@layout/cell_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<include
layout="@layout/cell_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</TableRow>
<TableRow
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:divider="@drawable/column_divider"
android:showDividers="middle">
<include
layout="@layout/cell_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<include
layout="@layout/cell_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<include
layout="@layout/cell_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<include
layout="@layout/cell_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<include
layout="@layout/cell_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<include
layout="@layout/cell_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<include
layout="@layout/cell_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<include
layout="@layout/cell_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<include
layout="@layout/cell_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</TableRow>
<TableRow
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:divider="@drawable/column_divider"
android:showDividers="middle">
<include
layout="@layout/cell_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<include
layout="@layout/cell_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<include
layout="@layout/cell_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<include
layout="@layout/cell_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<include
layout="@layout/cell_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<include
layout="@layout/cell_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<include
layout="@layout/cell_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<include
layout="@layout/cell_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<include
layout="@layout/cell_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</TableRow>
<TableRow
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:divider="@drawable/column_divider"
android:showDividers="middle">
<include
layout="@layout/cell_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<include
layout="@layout/cell_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<include
layout="@layout/cell_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<include
layout="@layout/cell_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<include
layout="@layout/cell_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<include
layout="@layout/cell_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<include
layout="@layout/cell_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<include
layout="@layout/cell_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<include
layout="@layout/cell_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</TableRow>
<TableRow
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:divider="@drawable/column_divider"
android:showDividers="middle">
<include
layout="@layout/cell_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<include
layout="@layout/cell_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<include
layout="@layout/cell_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<include
layout="@layout/cell_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<include
layout="@layout/cell_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<include
layout="@layout/cell_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<include
layout="@layout/cell_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<include
layout="@layout/cell_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<include
layout="@layout/cell_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</TableRow>
<TableRow
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:divider="@drawable/column_divider"
android:showDividers="middle">
<include
layout="@layout/cell_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<include
layout="@layout/cell_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<include
layout="@layout/cell_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<include
layout="@layout/cell_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<include
layout="@layout/cell_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<include
layout="@layout/cell_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<include
layout="@layout/cell_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<include
layout="@layout/cell_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<include
layout="@layout/cell_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</TableRow>
<TableRow
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:divider="@drawable/column_divider"
android:showDividers="middle">
<include
layout="@layout/cell_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<include
layout="@layout/cell_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<include
layout="@layout/cell_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<include
layout="@layout/cell_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<include
layout="@layout/cell_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<include
layout="@layout/cell_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<include
layout="@layout/cell_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<include
layout="@layout/cell_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<include
layout="@layout/cell_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</TableRow>
</TableLayout>
这是我的手机布局,以防有人想试试
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.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">
<TextView
android:id="@+id/cellValue"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintDimensionRatio="1:1"
android:gravity="center"
android:visibility="invisible"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/pencilOne"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintDimensionRatio="1:1"
android:text="1"
android:textSize="10sp"
android:gravity="center"
android:visibility="invisible"
app:layout_constraintBottom_toTopOf="@+id/pencilFour"
app:layout_constraintEnd_toStartOf="@+id/pencilTwo"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/pencilTwo"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintDimensionRatio="1:1"
android:text="2"
android:textSize="10sp"
android:gravity="center"
android:visibility="invisible"
app:layout_constraintBottom_toTopOf="@+id/pencilFive"
app:layout_constraintEnd_toStartOf="@+id/pencilThree"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/pencilOne"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/pencilThree"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintDimensionRatio="1:1"
android:text="3"
android:textSize="10sp"
android:gravity="center"
android:visibility="invisible"
app:layout_constraintBottom_toTopOf="@+id/pencilSix"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/pencilTwo"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/pencilFour"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintDimensionRatio="1:1"
android:text="4"
android:textSize="10sp"
android:gravity="center"
android:visibility="invisible"
app:layout_constraintBottom_toTopOf="@+id/pencilSeven"
app:layout_constraintEnd_toStartOf="@+id/pencilFive"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/pencilOne" />
<TextView
android:id="@+id/pencilSix"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintDimensionRatio="1:1"
android:text="6"
android:textSize="10sp"
android:gravity="center"
android:visibility="invisible"
app:layout_constraintBottom_toTopOf="@+id/pencilNine"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/pencilFive"
app:layout_constraintTop_toBottomOf="@+id/pencilThree" />
<TextView
android:id="@+id/pencilSeven"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintDimensionRatio="1:1"
android:text="7"
android:textSize="10sp"
android:gravity="center"
android:visibility="invisible"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/pencilEight"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/pencilFour" />
<TextView
android:id="@+id/pencilEight"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintDimensionRatio="1:1"
android:text="8"
android:textSize="10sp"
android:gravity="center"
android:visibility="invisible"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/pencilNine"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/pencilSeven"
app:layout_constraintTop_toBottomOf="@+id/pencilFive" />
<TextView
android:id="@+id/pencilNine"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintDimensionRatio="1:1"
android:text="9"
android:textSize="10sp"
android:gravity="center"
android:visibility="invisible"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/pencilEight"
app:layout_constraintTop_toBottomOf="@+id/pencilSix" />
<TextView
android:id="@+id/pencilFive"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintDimensionRatio="1:1"
android:text="5"
android:textSize="10sp"
android:gravity="center"
android:visibility="invisible"
app:layout_constraintBottom_toTopOf="@+id/pencilEight"
app:layout_constraintEnd_toStartOf="@+id/pencilSix"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/pencilFour"
app:layout_constraintTop_toBottomOf="@+id/pencilTwo" />
</android.support.constraint.ConstraintLayout>
有关应用程序在主线程中做了太多工作的更多信息,请参阅本文 您应该将
RecyclerView
与
遵循以下步骤
首先在Build.Gradle
文件中添加以下依赖项
,以使用RecyclerView
注意:如果您已经添加了com.google.android.material:material
现在在活动文件布局中添加RecyclerView
像这样创建一个MyAdapter
类
导入android.content.Context;
导入android.graphics.Color;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.ImageView;
导入android.widget.TextView;
导入androidx.annotation.NonNull;
导入androidx.recyclerview.widget.recyclerview;
公共类MyAdapter扩展了RecyclerView.Adapter{
私人语境;
公共MyAdapter(上下文){
this.context=上下文;
}
@非空
@凌驾
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup父级,int-viewType){
视图=LayoutFlater.from(上下文)。充气(R.layout.row\u list\u项,父项,false);
返回新的MyViewHolder(视图);
}
@凌驾
public void onBindViewHolder(@NonNull MyViewHolder,int位置){
holder.tvText.setText(String.valueOf(position+1));
如果(位置%2==0){
支架。imgBanner。收根底色(颜色。红色);
}否则{
支架。imgBanner。收根底色(颜色。绿色);
}
}
@凌驾
public int getItemCount(){
返回81;
}
公共类MyViewHolder扩展了RecyclerView.ViewHolder{
ImageView imgBanner;
文本查看电视文本;
公共MyView
implementation 'com.google.android.material:material:1.0.0-beta01'
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:gravity="center"
android:orientation="vertical"
tools:context=".JavaActivity">
<androidx.recyclerview.widget.RecyclerView
android:layout_width="match_parent"
android:id="@+id/myRecyclerView"
android:layout_height="wrap_content" />
</LinearLayout>
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
public class JavaActivity extends AppCompatActivity {
RecyclerView myRecyclerView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_java);
myRecyclerView = findViewById(R.id.myRecyclerView);
GridLayoutManager gridLayoutManager = new GridLayoutManager(JavaActivity.this, 3);
myRecyclerView.setLayoutManager(gridLayoutManager);
myRecyclerView.setAdapter(new MyAdapter(this));
}
}
import android.content.Context;
import android.graphics.Color;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
private Context context;
public MyAdapter(Context context) {
this.context = context;
}
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(context).inflate(R.layout.row_list_item, parent, false);
return new MyViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
holder.tvText.setText(String.valueOf(position + 1));
if (position % 2 == 0) {
holder.imgBanner.setBackgroundColor(Color.RED);
} else {
holder.imgBanner.setBackgroundColor(Color.GREEN);
}
}
@Override
public int getItemCount() {
return 81;
}
public class MyViewHolder extends RecyclerView.ViewHolder {
ImageView imgBanner;
TextView tvText;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
imgBanner = itemView.findViewById(R.id.imgBanner);
tvText = itemView.findViewById(R.id.tvText);
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:orientation="vertical">
<ImageView
android:id="@+id/imgBanner"
android:layout_width="100dp"
android:layout_height="100dp"
android:contentDescription="@string/app_name"
android:src="@drawable/ic_launcher_background" />
<TextView
android:id="@+id/tvText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:textColor="@android:color/white"
android:textSize="15sp"
android:textStyle="bold" />
</RelativeLayout>
static class Foo {
int splat;
}
Foo[] array = ...
public void zero() {
int sum = 0;
for (int i = 0; i < array.length; ++i) {
sum += array[i].splat;
}
}
public void one() {
int sum = 0;
Foo[] localArray = array;
int len = localArray.length;
for (int i = 0; i < len; ++i) {
sum += localArray[i].splat;
}
}
public void two() {
int sum = 0;
for (Foo a : array) {
sum += a.splat;
}
}
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
final AsyncLayoutInflater.OnInflateFinishedListener callback = new AsyncLayoutInflater.OnInflateFinishedListener()
{
@Override
public void onInflateFinished(View view, int resid, ViewGroup parent)
{
TableLayout sudokuGrid = (TableLayout) findViewById(R.id.sudokuGrid);
sudokuGrid.setShrinkAllColumns(true);
sudokuGrid.setStretchAllColumns(true);
TableRow.LayoutParams paramsRow = new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT);
TableLayout.LayoutParams paramsLayout = new TableLayout.LayoutParams(TableLayout.LayoutParams.WRAP_CONTENT, TableLayout.LayoutParams.WRAP_CONTENT);
for(int i = 0; i < 9; ++i)
{
TableRow tableRow = new TableRow(SolverActivity.this);
tableRow.setDividerDrawable(getResources().getDrawable(R.drawable.column_divider));
tableRow.setShowDividers(LinearLayout.SHOW_DIVIDER_MIDDLE);
for(int j = 0; j < 9; ++j)
{
View cell = getLayoutInflater().inflate(R.layout.cell_layout, sudokuGrid, false);
cell.setLayoutParams(paramsRow);
tableRow.addView(cell);
}
tableRow.setLayoutParams(paramsLayout);
sudokuGrid.addView(tableRow);
}
};
if (savedInstanceState == null) {
AsyncLayoutInflater inflater = new AsyncLayoutInflater(this);
inflater.inflate(R.layout.solver_principal, null, callback);
} else {
View view = getLayoutInflater().inflate(R.layout.solver_principal, null);
Callback.onInflateFinished(view, R.layout.solver_principal, null)
}
}
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int
viewType) {
new Thread(new Runnable() {
public void run(){
View view =
LayoutInflater.from(context).inflate(R.layout.row_list_item,
parent, false);
return new MyViewHolder(view);
}
}).start();
}
public class SolverActivity extends AppCompatActivity {
int textViewWidth;
int textViewHeight;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.solver_principal);
final FrameLayout sudokuGrid = findViewById(R.id.sudokuGrid);
// post to get the size of the sudoku grid post-layout.
sudokuGrid.post(() ->
new Thread(() -> {
textViewWidth = sudokuGrid.getWidth() / 27;
textViewHeight = sudokuGrid.getHeight() / 27;
createGrid(sudokuGrid);
}).start());
}
@WorkerThread
private void createGrid(FrameLayout sudokuGrid) {
int blockWidth = textViewWidth * 3;
int blockHeight = textViewHeight * 3;
// row, col refers to the row and column of the 3x3 blocks of TextViews.
for (int row = 0; row < 9; row++) {
for (int col = 0; col < 9; col++) {
int blockX = col * blockWidth;
int blockY = row * blockHeight;
// The block view covers the whole 3x3 TextView block.
final TextView blockView = createTextView(blockX, blockY, null);
runOnUiThread(() -> {
blockView.setBackgroundResource(R.drawable.outline);
sudokuGrid.addView(blockView, new FrameLayout.LayoutParams(blockWidth, blockHeight));
});
// Fill in the 3x3 block.
for (int tvCell = 0; tvCell < 9; tvCell++) {
int transX = blockX + (tvCell % 3) * textViewWidth;
int transY = blockY + (tvCell / 3) * textViewHeight;
String text = String.valueOf(tvCell + 1);
final TextView tv = createTextView(transX, transY, text);
runOnUiThread(() ->
sudokuGrid.addView(tv, new FrameLayout.LayoutParams(textViewWidth, textViewHeight)));
}
}
}
}
private TextView createTextView(int transX, int transY, @Nullable String text) {
final TextView tv = new TextView(SolverActivity.this);
if (text != null) {
tv.setText(text);
}
tv.setTranslationX(transX);
tv.setTranslationY(transY);
tv.setTextSize(TypedValue.COMPLEX_UNIT_SP, 10);
// tv.setVisibility(View.INVISIBLE);
tv.setGravity(Gravity.CENTER);
return tv;
}
}
<FrameLayout
android:id="@+id/sudokuGrid"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<stroke android:width="1dp" android:color="#FFCCCCCC"/>
<padding android:left="1dp" android:top="1dp"
android:right="1dp" android:bottom="1dp" />
</shape>