Java 如何从android中的CustomAdapter获取arraylist引用?
我制作了一个GridView,使用CustomAdapter以编程方式组织TextView和编辑视图,如表。在getView()override方法中,我创建视图,将其添加到arrayList中,并让抽象完成它的工作。当我试图访问adapter类之外的视图(在本例中为OnCreate活动)时,问题就出现了。我试图通过getItems()方法获取数组,该方法返回视图的arrayList。但它返回的是空数组(我使用打印0的日志进行检查)。我想知道为什么会这样?也许getView()方法只有在我尝试在onCreate中获取数组之后才会运行,但不知何故,onCreate在适配器完全准备就绪之前就完成了? 如果是这样的话,我应该在哪里/什么时候获得视图? 下面是我的活动和适配器类:Java 如何从android中的CustomAdapter获取arraylist引用?,java,android,Java,Android,我制作了一个GridView,使用CustomAdapter以编程方式组织TextView和编辑视图,如表。在getView()override方法中,我创建视图,将其添加到arrayList中,并让抽象完成它的工作。当我试图访问adapter类之外的视图(在本例中为OnCreate活动)时,问题就出现了。我试图通过getItems()方法获取数组,该方法返回视图的arrayList。但它返回的是空数组(我使用打印0的日志进行检查)。我想知道为什么会这样?也许getView()方法只有在我尝试在
public class MatrizMultiplicationActivity extends AppCompatActivity {
MatrizGridAdapter gridAdapter;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_matriz_mult);
GridView gridView = (GridView) findViewById(R.id.grid_view);
gridView.setNumColumns(5);
gridAdapter = new MatrizGridAdapter(this,5,5);
gridView.setAdapter(gridAdapter);
ArrayList<EditText> matrix = gridAdapter.getItems();
Log.d("mSize", String.valueOf(matrix.size()));
}
public class MatrizGridAdapter extends BaseAdapter {
Context ctx;
int rows;
int coluns;
int size;
ArrayList<EditText> views;
public MatrizGridAdapter(Context ctx, int rows, int coluns)
{
this.ctx = ctx;
this.rows= rows;
this.coluns = coluns;
this.size = rows*coluns;
this.views = new ArrayList<EditText>();
}
// .. some methods
public ArrayList<EditText> getItems()
{
return views;
}
@Override
public int getCount() {
return size;
}
@Override
public EditText getItem(int position) {
if((views.size()<position))
{
return views.get(position);
}
return null;
}
@SuppressLint("ResourceAsColor")
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if(convertView==null)
{
CardView cardview = new CardView(ctx);
//code for setting CardView attributes
//...
//..
//layout logic, doesn't really matter
if(position==0)
{
TextView textView = new TextView(ctx);
//code for setting textView attributes
cardview.addView(textView);
cardview.setBackgroundColor(R.color.cinzarrom);
}
//layout logic, doesn't really matter
//it is the first row, so put the numbers of coluns above
else if(position<coluns)
{
//code for setting textView attributes
//...
//..
cardview.addView(textView);
cardview.setBackgroundColor(R.color.cinzarrom);
setMarginLeft(textView, MyMath.convertDpToPixels(20,ctx));
}
//it is the first colun in any row, so put the number of rows on the left
else if(position%coluns==0)
{
//code for setting textView attributes
cardview.addView(textView);
cardview.setBackgroundColor(R.color.cinzarrom);
setMarginLeft(textView, MyMath.convertDpToPixels(20,ctx));
}
//ARE THE VIEWS BEING ADDED BEFORE THE CALL TO ARRAY.SIZE?()
else {
EditText editText = new EditText(ctx);
//add it to the array who stores the text views
views.add(editText);
//code for setting textView attributes
cardview.setBackgroundColor(Color.BLUE);
cardview.addView(editText);
}
return cardview;
}
return convertView;
}
}
公共类MatrizMultiplicationActivity扩展了AppCompatActivity{
MatrizGridAdapter;
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u matriz\u mult);
GridView GridView=(GridView)findViewById(R.id.grid\u视图);
gridView.setNumColumns(5);
gridAdapter=新的MatrizGridAdapter(这个,5,5);
setAdapter(gridAdapter);
ArrayList矩阵=gridAdapter.getItems();
Log.d(“mSize”,String.valueOf(matrix.size());
}
公共类MatrizGridAdapter扩展了BaseAdapter{
上下文ctx;
int行;
int coluns;
整数大小;
阵列主义观点;
公共MatrizGridAdapter(上下文ctx、int行、int列)
{
this.ctx=ctx;
这个。行=行;
this.coluns=coluns;
this.size=行*列;
this.views=new ArrayList();
}
//…一些方法
公共阵列列表getItems()
{
回访意见;
}
@凌驾
public int getCount(){
返回大小;
}
@凌驾
公共EditText getItem(int位置){
如果((views.size)()适配器使用一个视图池,一些在屏幕上,一些在屏幕下。这由适配器控制。为什么要使用此getItems方法?它是一个拥有大多数EditText视图的适配器。我希望访问它们,以便在用户插入时可以获取它们的文本,但您不知道哪个EditText是从lis中插入的t?你将无法获得屏幕上滚动的视图。为什么你要使用GridView,听起来你可以使用滚动视图中包装的ListView。你希望使用多少EditText?我希望使用很多视图,事实上,它将由用户指定。我的目的是使MatrixMultiplication有效视图均匀地放置在屏幕上,所以我想通过一些数学运算我可以找到它们。但是我不太了解适配器是如何工作的,这是我第一次使用自定义的。但是就你所说的,我觉得我对它没有太多的控制权。我选择网格只是因为需要将视图放置在行/列格式中,所以我选择了网格我没有想到其他人,因为我还不太了解他们