rogcg
rogcg

Reputation: 10471

How to make a view appear below

Hey I want to make a view appear below the last that has been created.

It is showing like this:

alt text

I want to make the next view show below the last one, so for each new view added, it shows below. Understand?

Here is my code. The xml file and the java file.

listitem.xml

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent" 
    android:layout_height="?android:attr/listPreferredItemHeight"
    android:id="@+id/linearId" 
    android:padding="6dip"
    >
    <ImageView 
        android:id="@+id/icon" 
        android:layout_width="wrap_content"
        android:layout_height="fill_parent" 
        android:layout_marginRight="6dip"
        android:src="@drawable/icon" 
        />
    <LinearLayout 
        android:orientation="vertical"
        android:layout_width="0dip" android:layout_weight="1"
        android:layout_height="fill_parent"
        >
        <TextView 
            android:id="@+id/txt1" 
            android:layout_width="fill_parent"
            android:layout_height="0dip" 
            android:layout_weight="1"
            android:textSize="20sp" 
            android:gravity="center_vertical"
            android:text="My Application" 
            />
        <TextView 
            android:id="@+id/txt2" 
            android:layout_width="fill_parent"
            android:layout_height="0dip" 
            android:layout_weight="1"
            android:singleLine="true" 
            android:ellipsize="marquee"
            android:text="Simple application that shows how to use RelativeLayout"
            android:textSize="10sp" 
            />
    </LinearLayout>
</LinearLayout>

RatedCalls.java

public class RatedCalls extends Activity {

private static final String LOG_TAG = "RatedCalls";
private TableLayout table;
private CallDataHelper cdh;
private TableRow row;
private TableRow row2;

public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.listitem);

    Log.i(LOG_TAG, "calling from onCreate()");

    cdh = new CallDataHelper(this);

    startService(new Intent(this, RatedCallsService.class));
    Log.i(LOG_TAG, "Service called.");
    Log.i(LOG_TAG, "before call fillList");

    List<String> ratedCalls = new ArrayList<String>();
    ratedCalls = this.cdh.selectTopCalls();

    LayoutInflater inflater = (LayoutInflater) this
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    LinearLayout ll = (LinearLayout) this.findViewById(R.id.linearId);

    for (int i = 0; i < 1; i++) {
        View item = inflater.inflate(R.layout.listitem, null);

        TextView x = (TextView) item.findViewById(R.id.txt1);
        x.setText(ratedCalls.get(0));

        TextView ht = (TextView) item.findViewById(R.id.txt2);
        ht.setText(ratedCalls.get(1));

        ll.addView(item, ViewGroup.LayoutParams.WRAP_CONTENT);


    }
}

Upvotes: 0

Views: 1019

Answers (4)

Labeeb Panampullan
Labeeb Panampullan

Reputation: 34823

To work so you need to create two different xml for each inflater

In your layout folder,new xml layout/main2.xml

<?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"    
        android:layout_height="fill_parent">    
             <ImageView
            android:id="@+id/icon"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginRight="6dip"
            android:src="@drawable/icon"
            />
            <TextView
                android:id="@+id/txt1"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:textSize="20sp"
                android:gravity="center_vertical"
                android:text="My Application"
                />
            <TextView
                android:id="@+id/txt2"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:singleLine="true"
                android:ellipsize="marquee"
                android:text="Simple application that shows how to use RelativeLayout"
                android:textSize="10sp"
                />    
        </LinearLayout>

Then your layout/main.xml

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:id="@+id/linearId"
    android:orientation="vertical"
    >
    <TextView android:id="@+id/rowCount"    android:layout_width="wrap_content"
    android:layout_height="wrap_content" ></TextView>
     <LinearLayout
         android:id="@+id/linearId2"
       android:layout_width="fill_parent"
    android:layout_height="?android:attr/listPreferredItemHeight"
    android:padding="6dip"> 
         </LinearLayout>
</LinearLayout>

Then you can set you activity like this

 private int ELEMENTINEACHROW=2 ;
    private int NOOFROW = 4;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        LayoutInflater inflater = (LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        LinearLayout ll = (LinearLayout) this.findViewById(R.id.linearId);
        for (int j = 0; j < NOOFROW; j++) {
            View itemMain = inflater.inflate(R.layout.main, null, false);
            TextView rowCount = (TextView) itemMain.findViewById(R.id.rowCount);
            rowCount.setText("Row:"+(j+1));
            LinearLayout ll2 = (LinearLayout) itemMain.findViewById(R.id.linearId2);
            for (int i = 0; i < ELEMENTINEACHROW; i++) {
                View item = inflater.inflate(R.layout.main2, null, false);

                TextView x = (TextView) item.findViewById(R.id.txt1);
                x.setText("test");

                TextView ht = (TextView) item.findViewById(R.id.txt2);
                ht.setText("good");

                ll2.addView(item, ViewGroup.LayoutParams.FILL_PARENT);
            }
            ll.addView(itemMain, ViewGroup.LayoutParams.FILL_PARENT);
        }
    }

Hope it give you the idea.

Upvotes: 0

Wesley Wiser
Wesley Wiser

Reputation: 9851

In your xml file, set the android:orientation attribute to vertical on your <LinearLayout/>:

<LinearLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="fill_parent" 
     android:layout_height="?android:attr/listPreferredItemHeight"
     android:id="@+id/linearId" 
     android:padding="6dip"
     android:orientation="vertical"/>

Check out the LinearLayout class documentation and the orientation documentation for more information.

Upvotes: 0

Rubycon
Rubycon

Reputation: 18346

mmm...I did not understand fully what is required, but may be you need to add android:orientation="vertical" to LinearLayout with id="linearId".

Upvotes: 0

Kevin Coppock
Kevin Coppock

Reputation: 134664

Your problem is that you should be using listitem.xml from a list adapter. What you're doing is, first setting your content view to an instance of listitem.xml, then trying to insert an instance of listitem INTO listitem's first LinearLayout. You should use listitem.xml as the view that you inflate in your custom adapter's getView() method. See the QuoteAdapter class from this question for an example, or just Google search "custom ArrayAdapter Android" for tons of results on this topic.

Upvotes: 1

Related Questions