2014-09-03 2 views
0

У меня есть макет, который называется activity_main.xml, который является моим родительским макетом, и затем я вставляю дочерний макет (activity_main_card.xml) в цикл for.Динамические переменные в цикле for?

У меня также есть массив, и то, что я делаю, использует длину массива для определения количества дочерних элементов, которые он должен создать. Все мои данные, которые будут использоваться в дочернем элементе, хранятся в массиве, поэтому идея состоит в том, чтобы перебирать массив, создавать дочерний элемент для каждого цикла и заполнять данные.

Вместо этого то, что в настоящее время происходит, состоит в том, что оно генерирует дочерние элементы 3 (длины массива), но только заполняет первое из них самым последним контентом в массиве. Это связано с тем, что он сохраняет переменные одинаковыми.

Что мне нужно сделать, так или иначе установить динамические переменные, которые меняются по мере повторения цикла.

Код для моего метода заключается в следующем:

for (int i = 0; i < cardArray.length; i++) { 
     LinearLayout item = (LinearLayout)findViewById(R.id.card_holder); 
     View child = getLayoutInflater().inflate(R.layout.activity_main_card, item, false); 
     item.addView(child); 

     //Set objects from array to variables 
     String cardTitle = cardArray[i][0]; 
     String cardContent = cardArray[i][1]; 
     String cardImage = cardArray[i][2]; 

     //Set XML elements to variables 
     TextView title = (TextView) findViewById(R.id.card_title); 
     TextView content = (TextView) findViewById(R.id.card_content); 
     ImageView image = (ImageView) findViewById(R.id.card_image); 

     //Load variable content into card layout 
     title.setText(cardTitle); 
     content.setText(cardContent); 
     image.setImageDrawable(getResources().getDrawable(getResources().getIdentifier("drawable/" + cardImage, "drawable", getPackageName()))); 
     } 

То, что я думал, что я мог сделать, чтобы установить точку, как:

TextView title[i] = (TextView) findViewById(R.id.card_title); 

однако это не работает. Кто-нибудь знает, как я могу это добиться?

+0

Не можете ли вы добавить эти дочерние представления в родительский вид с помощью ListView и Adapter? –

ответ

1

Вам нужно получить ссылку на текущий View, который вы только что создали, а затем заполнить элементы TextView на этом представлении. Это достижимо, делая это:

TextView title = (TextView) child.findViewById(R.id.card_title); 
TextView content = (TextView) child.findViewById(R.id.card_content); 
ImageView image = (ImageView) child.findViewById(R.id.card_image); 

Вы могли бы быть лучше подход к этой проблеме по-разному, однако, Джонатан предлагает ListView и адаптер может лучше подходит для этой ситуации.

+0

Спасибо. Это работало как «быстрое исправление», однако вместо этого я рассмотрю ListViews и Adapters. Я предполагаю, что я могу назначить любое представление в ListView, поскольку я использую новый CardView от L – K20GH

+0

. Вам понадобится адаптер для «ListView», который возвращает ваш «CardView» в методе 'getView()' http: // developer.android.com/reference/android/widget/Adapter.html#getView – Karl

+0

Какая польза от использования представления List над этим методом? – K20GH

0

Вы не используете View создан, вы используете корневой макет деятельности в каждом цикле, потому что вы применяете findViewById в родительском зрения:

Изменение:

TextView title = (TextView) findViewById(R.id.card_title); 

К;

TextView title = (TextView) child.findViewById(R.id.card_title); 
Смежные вопросы