построить макет во время выполнения Android - PullRequest
2 голосов
/ 24 июня 2011

У меня сложный XML-макет, в котором есть представления списка. Строка в представлении списка содержит несколько текстовых полей, которые расположены равномерно.я использую textview, чтобы сохранить текст, а затем, наконец, добавить все элементы в строку ... он работает отлично.но теперь у меня есть случай, когда я не уверен, сколько текстовых полей я мог бы получить от веб-службы.поэтому мне нужно динамически создавать текстовое представление во время выполнения, заполнять их и затем вставлять в список. Есть ли способ объявить, добавить и заполнить новые поля текстового просмотра во время выполнения?или есть в любом случае реализовать интервал между двумя полями?

результат первого вызова

__________________________
|_____|_____|_____|______| 

результат второго вызова

________________________________
|_____|_____|_____|______|______|

Я пытался реализоватьРешение, которое было предоставлено ниже (Кенни), но по какой-то причине я не могу добавить представления в список ... ниже мой код

public class HeaderAdapter extends ArrayAdapter<Header> {
final Header[] listSymbols;
private TextView textView;
private LinearLayout row;

public HeaderAdapter(Context context, int symResourceID,
        Header[] objects) {
    super(context, symResourceID, objects);
    listSymbols = objects;

}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    LayoutInflater inflater = (LayoutInflater) getContext()
    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    View row = inflater.inflate(R.layout.header_view, parent, false);
    Header headerRec = listSymbols[position];
    for(int i = 0 ; i < listSymbols.length;i++){
        textView = new TextView(getContext());
        textView.setLayoutParams(new LayoutParams(
                ViewGroup.LayoutParams.WRAP_CONTENT,  //Width of the view
                ViewGroup.LayoutParams.WRAP_CONTENT));//Height of the view
        textView.setId(i);
            row.add??

        }
}

Основное действие, которое вызывает это

setContentView(R.layout.main);

    headerList.add(new Header("Symbol","Quantity","Price","Price Yesterday","52 Week High","52 Week Low","Change","Days Gain","Days Gain %","Returns"));

            Header[] tmpHeaderList = headerList.toArray(new Header[headerList.size()]);

            ArrayAdapter<Header> headerAdapter = new HeaderAdapter(this,R.layout.twoway_header_view,tmpHeaderList);
            headerListView.setAdapter(headerAdapter);

файл макета xml .. основной файл

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent" android:layout_height="fill_parent"
    android:orientation="vertical">

    <HorizontalScrollView android:layout_width="wrap_content"
        android:layout_height="wrap_content" android:scrollbars="none"
        android:id="@+id/headerHv">

        <ListView android:id="@+id/header_listView1"
            android:layout_width="fill_parent" android:layout_height="wrap_content"
            android:background="@color/white" android:cacheColorHint="#00000000"
            android:smoothScrollbar="true" android:scrollbars="none" />
    </HorizontalScrollView>
</LinearLayout>

файл, в котором определен шаблон для строки

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content" android:layout_height="wrap_content"
    android:orientation="horizontal"
    >
    <TextView android:id="@+id/headerList" android:layout_width="80dp"
        android:layout_height="wrap_content" android:textColor="#000000"
        android:typeface="sans" android:textStyle="normal"  />

</LinearLayout>

Ответы [ 2 ]

4 голосов
/ 24 июня 2011

Вот способ, которым я динамически генерирую пользовательские кнопки из списка, вы можете сделать то же самое с textViews:

//Setup Buttons
    layout = (LinearLayout)findViewById(R.id.layoutBars);
    int count = lBars.size();
    for(int i = 0; i< count;i++){
        final Bar b = lBars.get(i);
        BarButton button = new BarButton(DDTBars.this, R.drawable.barsmall , b.getName().toUpperCase());
        button.setLayoutParams(new LayoutParams(
                    ViewGroup.LayoutParams.FILL_PARENT,
                    ViewGroup.LayoutParams.WRAP_CONTENT));
        button.setId(i);
        button.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                //Run activity passing name of the bar to retrieve data
                Intent i = new Intent(DDTBars.this, DDTBar.class);
                i.putExtra("name", b.getName());
                startActivity(i);
            }
        });
        layout.addView(button);         
    }

Так что вы можете попробовать:

    //Setup TextViews
    layout = (LinearLayout)findViewById(R.id.mylayout);
    int count = myTextList.size();
    for(int i = 0; i< count;i++){
        TextView txtView = new TextView(this);
        txtView.setLayoutParams(new LayoutParams(
                ViewGroup.LayoutParams.WRAP_CONTENT,  //Width of the view
                ViewGroup.LayoutParams.WRAP_CONTENT));//Height of the view
        txtView.setId(i);
        layout.addView(txtView);            
    }
0 голосов
/ 24 июня 2011

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

...