0

I am working on Android project. I follow tutorial from http://www.vogella.com/articles/AndroidSQLite/article.html but I stuck on something. Tutorial shows how to use Class with 1 String object. I am working with 2 String objects. So I changed few things (add new String to my class, change layout.simple_list_item_1 to android.R.layout.simple_list_item_2 etc.) And now the question is - how to make something to get Stoliki class objects (override toString() gives me only 1 item, so It's useless).

Class Stoliki

public class Stoliki {
      private long id;
      private String numer;
      private String opis;

      public long getId() {
        return id;
      }

      public void setId(long id) {
        this.id = id;
      }

      public String getNumer() {
        return numer;
      }

      public void setNumer(String numer) {
        this.numer = numer;
      }

      public String getOpis() {
            return opis;
        }

      public void setOpis(String opis) {
            this.opis = opis;
        }

    } 

Activity

import android.app.ListActivity;
import android.os.Bundle;
import java.util.List;
import java.util.Random;
import android.view.View;
import android.widget.ArrayAdapter;

public class FirstGridPage extends ListActivity {
      private StolikiDataSource datasource;

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_view_list_stoliki);

    datasource = new StolikiDataSource(this);
    datasource.open();

    List<Stoliki> values = datasource.getAllStoliki();

    // Use the SimpleCursorAdapter to show the
    // elements in a ListView
    ArrayAdapter<Stoliki> adapter = new ArrayAdapter<Stoliki>(this,
        android.R.layout.simple_list_item_1, values);
    setListAdapter(adapter);
  }

  // Will be called via the onClick attribute
  // of the buttons in main.xml
  public void onClick(View view) {
    @SuppressWarnings("unchecked")
    ArrayAdapter<Stoliki> adapter = (ArrayAdapter<Stoliki>) getListAdapter();
    Stoliki stolik = null;
    switch (view.getId()) {
    case R.id.add:
      String[] stoliki_numer = new String[] { "1", "2", "3" };
      String[] stoliki_opis = new String[] { "Czerwony", "Niebieski", "Zielony" };
      int nextInt = new Random().nextInt(3);
      // Save the new comment to the database
      stolik = datasource.createStolik(stoliki_numer[nextInt], stoliki_opis[nextInt]);
      adapter.add(stolik);
      break;
    case R.id.delete:
      if (getListAdapter().getCount() > 0) {
          stolik = (Stoliki) getListAdapter().getItem(0);
        datasource.deleteStolik(stolik);
        adapter.remove(stolik);
      }
      break;
    }
    adapter.notifyDataSetChanged();
  }

  @Override
  protected void onResume() {
    datasource.open();
    super.onResume();
  }

  @Override
  protected void onPause() {
    datasource.close();
    super.onPause();
  }

} 
3
  • 1
    use a custom list adapter Commented Apr 10, 2013 at 9:04
  • Just a hint: use English variable names, always. It is really ugly "setOpis" and even if it is just training app, use English names to train and get used to it. Commented Apr 10, 2013 at 9:31
  • Yes. It's ugly but only for us (Polish people). Anyway I am still learning Java and it's more clear for me to read code. Commented Apr 10, 2013 at 10:57

1 Answer 1

1

http://www.youtube.com/watch?v=wDBM6wVEO70. Listview talk by Romain guy( android developer at google).

Main.xml

<ListView android:id="@+id/list"
android:layout_width="fill_parent"
android:layout_height="0dip"
android:focusableInTouchMode="false"
 android:listSelector="@android:color/transparent"
 android:layout_weight="2"
 android:headerDividersEnabled="false"
 android:footerDividersEnabled="false"
 android:dividerHeight="8dp" 
 android:divider="#000000"   
 android:cacheColorHint="#000000" 
 android:drawSelectorOnTop="false">
 </ListView>
 </LinearLayout>   

Customw row. row.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"
   android:orientation="horizontal"
   android:background="#ffffff"
  >

 <TextView
    android:id="@+id/textView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="TextView" 
    android:background="@drawable/itembkg"
    />

 <TextView
    android:id="@+id/textView2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginLeft="20dp"
    android:text="TextView" />

 </LinearLayout>

public class CustomListView extends Activity {
/** Called when the activity is first created. */

 ListView lv1;
 Customlistadapter cus;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
   // Button b= (Button) findViewById(R.id.remove);
    lv1 = (ListView) findViewById(R.id.list);
    cus= new Customlistadapter(this);
    lv1.setAdapter(cus);

}        
   }

Custom list adapter. Inflate custom layout for each row.

 public class Customlistadapter extends ArrayAdapter {

private LayoutInflater mInflater;
    Context c;

public Customlistadapter(CustomListView customListView) {
    super(customListView, 0);
    // TODO Auto-generated constructor stub
    this.mInflater = LayoutInflater.from(customListView);  
    c=customListView;
}
public int getCount() {
    return 20; // number of listview rows.
}

public Object getItem(int arg0) {
    return arg0;
}

public long getItemId(int arg0) {
return arg0;
}

public View getView(final int arg0, View arg1, ViewGroup arg2) {
    final ViewHolder vh;
    vh= new ViewHolder();

    if(arg1==null )
     {
        arg1=mInflater.inflate(R.layout.row, arg2,false);
        vh.tv1= (TextView)arg1.findViewById(R.id.textView1);
        vh.tv2= (TextView)arg1.findViewById(R.id.textView2);
     }
    else
    {
     arg1.setTag(vh);
    }
        vh.tv1.setText("hello");    
        vh.tv2.setText("hello");

    return arg1;
}

  static class ViewHolder //use a viewholder for smooth scrolling and performance.
  {
TextView tv1,tv2;

 }
 }

Edit:

Your activity will have a listview. This is set in oncreate setContentView(R.layout.activity_main);. The main layout will have a listview. You set the adapter of listview as listview.setAdapter(youradapter);

Then listview will have custom layout ie row.xml inflated for each row item. You custom adapter for listview is where the row.xml is inflated. You defined your class CustomAdapter which extends ArrayAdapter. You override a set of methods.

   getCount() ---  size of listview.
   getItem(int position) -- returns the position 
   getView(int position, View convertView, ViewGroup parent) 
   // position is the position in the listview.
   //convertview - view that is tobe inflated
   // you will return the view that is infated. 

You will have to use a viewholder for smooth scrolling and performance. Imagine 1000 rows is lstview with images it may cause memory exceptions. One way to get rid of this is to recycle views. The visible views(rows) are not recycled. The video in the link at the top has a detail explanation on the topic

activity_main.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"
 android:orientation="vertical" 
 android:background="#0095FF">

 <ListView android:id="@+id/list"
  android:layout_width="fill_parent"
  android:layout_height="0dip"
  android:focusableInTouchMode="false"
  android:listSelector="@android:color/transparent"
  android:layout_weight="2"
  android:headerDividersEnabled="false"
  android:footerDividersEnabled="false"
  android:dividerHeight="8dp" 
  android:divider="#000000" 
  android:cacheColorHint="#000000"
  android:drawSelectorOnTop="false">
  </ListView>
 </LinearLayout>

row.xml (layout inflated for each listview row)

 <?xml version="1.0" encoding="utf-8"?>
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:orientation="horizontal" >

 <TextView
    android:id="@+id/textView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:text="Header" />

 <TextView
    android:id="@+id/textView2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginLeft="80dp"
    android:layout_gravity="center"
    android:text="TextView" />

</LinearLayout>

MainActivity

   public class MainActivity extends Activity {


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ListView ll = (ListView) findViewById(R.id.list);
    CustomAdapter cus = new CustomAdapter();
    ll.setAdapter(cus);

}

class CustomAdapter extends BaseAdapter
{
    LayoutInflater mInflater;


    public CustomAdapter()
    {
        mInflater = (LayoutInflater) MainActivity.this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }
    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return 30;
    }

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return position;
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
        final ViewHolder vh;
        vh= new ViewHolder();

        if(convertView==null )
         {
            convertView=mInflater.inflate(R.layout.row, parent,false);

            vh.tv2= (TextView)convertView.findViewById(R.id.textView2);
            vh.tv1= (TextView)convertView.findViewById(R.id.textView2);


         }
        else
        {
         convertView.setTag(vh);
        }
            vh.tv1.setText("my text");
            vh.tv2.setText("Postion = "+position);  
        return convertView;
    }

 class ViewHolder
 {
    TextView tv1,tv2;
 }  
 }
}

enter image description here

Sign up to request clarification or add additional context in comments.

2 Comments

@boski it works. Hard way i don't get it. you want me to post a snap shot of the same??
@boski check the edit may be that will help you. It works but you have to do it right. as you can see the snap shot two textviews in a single row.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.