2011-05-07 10 views
25

Lo leí en algún lugar aquí y lo perdí por completo, pero podría necesitar ayuda.Agregue textViews dinámicamente a linearLayout

Mi aplicación está extrayendo los nombres de columna de sqlite en una matriz. Quiero crear una vista de texto y editar texto para cada una (a través del tamaño de la matriz), y recuerdo haber leído en alguna parte que puedes tratar los nombres de variables de textView como una matriz, pero no sé dónde está ahora.

Entonces, ¿cómo crearía dinámicamente un textView y editText para la cantidad de listados que hay en una matriz?

era algo así como

TextView tv[] = new TextView()... 

for(...){ 
tv[i]... 
} 

¿Es esto así?

¡Agradezco su ayuda!

+0

Me gustaría pensar que usted quiere una vista de lista o algo similar en lugar de presionar en textviews ... – jkhouw1

+0

Estaba leyendo eso también, pero leí que había algún problema ems donde la gente no puede acceder a editText desde listView. Y si logré agregar EditText a la lista, ¿cómo atrapo dinámicamente los datos? –

+0

Existen problemas con 'EditText's en' ListView's. El primero es un tema de enfoque que puede ser resuelto (ver http://stackoverflow.com/questions/2679948/focusable-edittext-inside-listview) pero si está usando 'EditText's en realidad como elementos de la lista en lugar de pie de página/encabezados luego está el problema del reciclaje de vistas, lo que significa que debe guardar el texto de 'EditText' antes de que salga de la pantalla y se recicle. –

Respuesta

56

algo como lo siguiente debe ser lo que necesita:

final int N = 10; // total number of textviews to add 

final TextView[] myTextViews = new TextView[N]; // create an empty array; 

for (int i = 0; i < N; i++) { 
    // create a new textview 
    final TextView rowTextView = new TextView(this); 

    // set some properties of rowTextView or something 
    rowTextView.setText("This is row #" + i); 

    // add the textview to the linearlayout 
    myLinearLayout.addView(rowTextView); 

    // save a reference to the textview for later 
    myTextViews[i] = rowTextView; 
} 
+0

¡Genial! Lo probaré, ¿podría esto también ser usado para editText? –

+0

Sí, el mismo patrón funcionará para 'EditText's, ¡cualquier tipo de vista, de hecho! –

+0

Joseph, ¡eres increíble! –

3

Creo que esto será útil:

int j = 0; 

context.getSystemService(Context.WINDOW_SERVICE); 
WindowManager manager = (WindowManager) context 
         .getSystemService(Context.WINDOW_SERVICE); 
Display display = manager.getDefaultDisplay(); 

for (int i = 0; i < tabsize; i++) { 
    Tab tab = tabSet.get(i); 
    if (i == selectedTabId) 
     tab.setSelected(true); 
    View view = tab.getView(); 

    TableRow.LayoutParams pCol = new TableRow.LayoutParams(); 
    pCol.width = display.getWidth()/tabSet.size(); 

    rowBottom.addView(view, pCol); 
} 
7
LinearLayout ll = (LinearLayout) findViewById(R.id.linearlayout2); 

for (int i = 0; i < 5; i++) 
{ 
    TextView tv = new TextView(this); 
    tv.setText("Dynamic TextView" + i); 
    tv.setId(i + 5); 
    ll.addView(tv); 
} 

u can do like this also.. 
+2

¿cómo se puede vincular 'OnClickListeners' a los elementos creados? –

3

Usando ArrayList pueden ayudarle a añadir cualquier número de TextViews dinámicamente. Es posible que desee eliminar un TextView específico del diseño lineal principal. Esta es una forma eficiente de memoria. Lo siguiente es un fragmento.

ArrayList<TextView> mTextViewList = new ArrayList<>(); //empty list of TextViews 

if(condition){ 
    /* can repeat several times*/ 

    //Create a temporary instance which will be added to the list 
    final TextView mTextView = new TextView(this); 

    //Add the instance to the ArrayList 
    mTextViewList.add(mTextView); 

    //Add view to the Parent layout in which you want to add your views 
    mLinearLayout.addView(mTextView); 
} 

//Change the text of 6th(index:5) TextView which was added 
mTextViewList.get(5).setText("My Text"); 

//Remove 2nd(index:1) TextView from the parent LinearLayout 
mLinearLayout.removeView(mTextViewList.get(1)); 
0

lo que permite decir que haya creado un LinearLayout dentro de un archivo .xml como esto:

<LinearLayout 
    android:orientation="vertical" 
    android:id="@+id/linear" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content"> 
</LinearLayout> 

ahora el código para agregar 5 textviews dinámicamente

LinearLayout linearLayout= (LinearLayout)findViewById(R.id.linear);  //find the linear layout 
    linearLayout.removeAllViews();        //add this too 
    for(int i=0; i<5;i++){   //looping to create 5 textviews 

     TextView textView= new TextView(this);    //dynamically create textview 
     textView.setLayoutParams(new LinearLayout.LayoutParams(   //select linearlayoutparam- set the width & height 
       ViewGroup.LayoutParams.MATCH_PARENT, 48)); 
     textView.setGravity(Gravity.CENTER_VERTICAL);      //set the gravity too 
     textView.setText("Textview: "+i);         //adding text 
     linearLayout.addView(textView);          //inflating :) 
    } 
0

Para mí esto es una solución.

// establecer las variables de

TextView t; 
ArrayList<TextView> textViewArrayList; 
LayoutInflater layoutInflater; 
LinearLayout ll_itensobrigatorios 

// indicar en su onCreate

layoutInflater = getLayoutInflater(); 
createViewItem(new String[]{"Fabio", "Santos", "Programador", "Natal"}); 

// Esta visión de crear en el diseño

private void createViewItem(String[] nomes) { 
      textViewArrayList = new ArrayList<>(); 

      for(int i = 0; i < nomes.length; i++) { 
       View vll = layoutInflater.inflate(R.layout.nomes_tec_item, ll_itensobrigatorios, false); 
       t = (TextView) vll.findViewById(R.id.txt_tec_item); 
       textViewArrayList.add(t); 
       ll_itensobrigatorios.addView(vll); 
      } 

      for(int i = 0; i < textViewArrayList.size(); i++) { 
       textViewArrayList.get(i).setText((i + 1) + " - " + nomes[i]); 
      } 
} 
Cuestiones relacionadas