kurtzbot
kurtzbot

Reputation: 512

Creating a list of TextView's in Android

I am trying to create a list of TextView's in my Android app of name's and organizations. However, the whole list is the same, for example:

Joe's work for Construction Co.
15hrs of 60hrs
Joe's work for Construction Co.
15hrs of 60hrs
Joe's work for Construction Co.
15hrs of 60hrs
...

is repeated five times in the list in the app. Here is the relevant code:

class IconicAdapter extends ArrayAdapter<Long> {
private ArrayList<Long> items;
private FakeIDO ido;

public IconicAdapter(Context context,int textViewResourceId, ArrayList<Long> ids, FakeIDO ido){
    super(WorkList.this, R.layout.feed_list, ids);
    this.items = ids;
    this.ido = ido;
}


public View getView(int position, View convertView, ViewGroup parent) {
    View v = convertView;
    if (v == null) {
        LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        v = vi.inflate(R.layout.row, null);
    }
    for(long id : items){ 
        TextView tt = (TextView) v.findViewById(R.id.toptext);
        TextView bt = (TextView) v.findViewById(R.id.bottomtext);
        if (tt != null) {
              tt.setText(ido.getName(id) + "'s work for " + ido.getOrganization(id));
        }
        if(bt != null){
              bt.setText( ido.totalWorked(id) + "hrs of " + ido.estimatedHours(id) + "hrs");
        }
    }
    return v;
}

Here is the xml view this class is working off of:

<?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="?android:attr/listPreferredItemHeight"
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/toptext"
        android:layout_width="fill_parent"
        android:layout_height="0dip"
        android:layout_weight="1"
        android:gravity="center_vertical"
    />
    <TextView
        android:layout_width="fill_parent"
        android:layout_height="0dip"
        android:layout_weight="1" 
        android:id="@+id/bottomtext"
        android:singleLine="true"
        android:ellipsize="marquee"
    />
</LinearLayout>

Now, I understand that the same instance is being returned when I call "TextView tt = (TextView) v.findViewById(R.id.toptext);", but I don't know what to change to get a new instance object each time. What am I missing?

Upvotes: 0

Views: 4434

Answers (2)

Mohsin Naeem
Mohsin Naeem

Reputation: 12642

use your getView like this

   public View getView(int position, View convertView, ViewGroup parent) {
    View v = convertView;
    if (v == null) {
        LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        v = vi.inflate(R.layout.row, null);
    }

        TextView tt = (TextView) v.findViewById(R.id.toptext);
        TextView bt = (TextView) v.findViewById(R.id.bottomtext);
        // get the 'id' for position.
        int id = items.get(position);
        if (tt != null) {
              tt.setText(ido.getName(id) + "'s work for " + ido.getOrganization(id));
        }
        if(bt != null){
              bt.setText( ido.totalWorked(id) + "hrs of " + ido.estimatedHours(id) + "hrs");
        }

    return v;
}

Upvotes: 1

boztalay
boztalay

Reputation: 562

I would try changing

TextView tt = (TextView) v.findViewById(R.id.toptext);

to

TextView tt = new TextView(this);
CharSequence text = ((TextView)v.findViewById(R.id.toptext)).getText();
tt.setText(text);

This will instantiate a new TextView with the same contents, which I think is what you're saying the underlying problem is.

Hope that helps!

Upvotes: 0

Related Questions