Gå til innhold

[Løst] Hjelp med Custom ListView


Anbefalte innlegg

Hei,

 

Driver å utvikler en applikasjon der jeg trenger en aktivitet som tar inn objekter å legger det inn i et selvlagd ListView. Klarer ikke å se hva som har blitt gjort feil selv.

 

Filene ligger vedlagt;

 

Show - Objektene som skal vises i ListView

 

public class Show {


private String seats;
private String time;
private String place;
private Date date;
private String name;

public Show(Date date, String name, String seats, String time, String place){
	this.date = date;
	this.name = name;
	this.seats = seats;
	this.time = time;
	this.place = place;
}

 

 

ShowList - Selve aktiviten som vises i vinduet

 

public class ShowList extends Activity {
   /** Called when the activity is first created. */
private ListView myListView;
private ShowItemAdapter aa;

private ArrayList<Show> list;


   @Override
   public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);

       setContentView(R.layout.main);

       list = new ArrayList<Show>();
       int resID = R.layout.custom_row;
       aa = new ShowItemAdapter(this, resID, list);

       myListView = (ListView)findViewById(R.id.myListView);
       myListView.setAdapter(aa);
       populateList();



   }


private void populateList() {
	Date date;
	date = new Date("20/01");
	Show show1 = new Show(date , "ISTID 3", "271 stk", "19:00", "Edda Kino Edda 1, Haugesund");
	list.add(show1);

	aa.notifyDataSetChanged();

}

 

 

ShowItemAdapter - Adapteret til listen

 

public class ShowItemAdapter extends ArrayAdapter<Show>{

private int resource;

public ShowItemAdapter(Context context, int resource, List<Show> objects) {
	super(context, resource, objects);
	this.resource = resource;
}

public View getView(int position, View convertView, ViewGroup parent) {
	LinearLayout showView;

	Show show = getItem(position);
	String seats = show.getSeats();
	String time = show.getTime();
	String place = show.getPlace();
	Date date = show.getDate();
	String name = show.getName();
	SimpleDateFormat sdf = new SimpleDateFormat("dd/mm");
	String dateString = sdf.format(date);

	/**hore
	 */
	if(convertView == null){
		showView = new LinearLayout(getContext());
		String inflater = Context.LAYOUT_INFLATER_SERVICE;
		LayoutInflater vi = (LayoutInflater)getContext().getSystemService(inflater);
		vi.inflate(resource, showView, true);
	}else{
		showView = (LinearLayout) convertView;
	}

	TextView nameView = (TextView)showView.findViewById(R.id.customView_name);
	TextView dateView = (TextView)showView.findViewById(R.id.customView_date);
	TextView seatsView =(TextView)showView.findViewById(R.id.customView_seats);
	TextView timeView = (TextView)showView.findViewById(R.id.customView_time);
	TextView placeView = (TextView)showView.findViewById(R.id.customView_place);

	nameView.setText(name);
	dateView.setText(dateString);
	seatsView.setText(seats);
	timeView.setText(time);
	placeView.setText(place);

	return showView;
}

}

 

 

XML (Tviler veldig på at det er noe feil med XML):

 

main - layouten til selve hovedskjermen

 

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

   <TextView
   android:id="@+id/lolTextView"
   android:text="Hore"
   android:layout_width="fill_parent"
   android:layout_height="fill_parent"
   />

   <ListView  
   android:id="@+id/myListView"
   android:layout_width="fill_parent" 
   android:layout_height="wrap_content" 
 />
</LinearLayout>

 

 

custom_row - layouten til hvert element i listen

 

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

 <TableLayout
android:id="@+id/customView_mainRow"
android:layout_width="wrap_content"
 	android:layout_height="fill_parent"
 	android:padding="5px"
 	android:layout_weight="9"
 	android:layout_alignParentLeft="true">

<TableRow>
<RelativeLayout
android:id="@+id/customView_firstRow"
android:layout_width="fill_parent"
android:layout_height="fill_parent"

>

<TextView
	android:id="@+id/customView_date"
	android:layout_width="wrap_content"
	android:layout_height="wrap_content"
	android:layout_weight="1"
	android:padding="2px"
	android:layout_alignParentLeft="true"
	/>

<TextView
	android:id="@+id/customView_name"
	android:layout_width="wrap_content"
	android:layout_height="wrap_content"
	android:layout_weight="6"
	android:padding="2px"
	android:layout_toRightOf="@+id/customView_date"
	/>


</RelativeLayout>
</TableRow>

<TableRow>
<RelativeLayout
android:id="@+id/customView_secondRow"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>

<TextView
	android:id="@+id/customView_time"
	android:layout_width="wrap_content"
	android:layout_height="wrap_content"
	android:layout_weight="1"
	android:padding="2px"
	android:layout_alignParentLeft="true"
	/>

<TextView
	android:id="@+id/customView_place"
	android:layout_width="wrap_content"
	android:layout_height="wrap_content"
	android:layout_weight="6"
	android:padding="2px"
	android:layout_toRightOf="@+id/customView_time"
	/>

</RelativeLayout>
</TableRow>

</TableLayout>

<TextView
	android:id="@+id/customView_seats"
	android:layout_width="wrap_content"
	android:layout_height="wrap_content"
	android:padding="5px"
	android:layout_weight="1"
	android:layout_alignParentRight="true"
	android:layout_centerInParent="true"
	/>

</RelativeLayout>

 

Setter veldig pris på hjelp, vært fast på dette problemet i hele dag.

Lenke til kommentar
Videoannonse
Annonse

Hei,

 

jeg tipper problemet ditt ligger på følgende linje i ShowList:

date = new Date("20/01");

 

Såvidt meg bekjent kan du ikke sende en string bestående av bare dag og måned som parameter når du oppretter Date-objektet. Hvis du absolutt må bruke en string, er du nødt til å ha med årstall;

date = new Date("20/01/11");

(kan dog være at du må skrive "01/20/11" - amerikansk datoformat)

 

Forøvrig verdt å notere seg at denne konstruktøren er deprecated.

Lenke til kommentar

Hei,

 

jeg tipper problemet ditt ligger på følgende linje i ShowList:

date = new Date("20/01");

 

Såvidt meg bekjent kan du ikke sende en string bestående av bare dag og måned som parameter når du oppretter Date-objektet. Hvis du absolutt må bruke en string, er du nødt til å ha med årstall;

date = new Date("20/01/11");

(kan dog være at du må skrive "01/20/11" - amerikansk datoformat)

 

Forøvrig verdt å notere seg at denne konstruktøren er deprecated.

 

Er nok ikke der problemet ligger, prøvd med en tom liste også.

Lenke til kommentar

Ved å fikse parameteren til Date-objektet sluttet programmet å krasje, men jeg ser at ListViewen fortsatt var tomt selv etter kall på populateList().

 

En måte å fikse det på er å gjøre om Activityen til en ListActivity på følgende måte:

 

public class ShowList extends ListActivity {
private ShowItemAdapter aa;
private ArrayList<Show> list;

@Override
public void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);

	setContentView(R.layout.main);

	list = new ArrayList<Show>();
	aa = new ShowItemAdapter(this, R.layout.custom_row, list);
	setListAdapter(aa);
	populateList();
}

private class ShowItemAdapter extends ArrayAdapter<Show> {
	public ShowItemAdapter(Context context, int textViewResourceId, ArrayList<Show> items) {
		super(context, textViewResourceId, items);
	}

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

		Show show = getItem(position);
		if (show != null) {
			TextView nameView = (TextView)showView.findViewById(R.id.customView_name);
			TextView dateView = (TextView)showView.findViewById(R.id.customView_date);
			TextView seatsView =(TextView)showView.findViewById(R.id.customView_seats);
			TextView timeView = (TextView)showView.findViewById(R.id.customView_time);
			TextView placeView = (TextView)showView.findViewById(R.id.customView_place);

			SimpleDateFormat sdf = new SimpleDateFormat("d/M");

			nameView.setText(show.getName());
			dateView.setText(sdf.format(show.getDate()));
			seatsView.setText(show.getSeats());
			timeView.setText(show.getTime());
			placeView.setText(show.getPlace());
		}
		return showView;
	}
}

private void populateList() {
	Date date;
	date = new Date();
	Show show1 = new Show(date , "ISTID 3", "271 stk", "19:00", "Edda Kino Edda 1, Haugesund");
	list.add(show1);
	aa.notifyDataSetChanged();
}
}

 

Jeg flyttet ShowItemAdapter inn i ShowList for å slippe å bytte fane så ofte, men det er ingen sak å flytte ut igjen dersom du skulle foretrekke det ;)

 

main.xml kan da gjøres om til følgende:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<ListView android:id="@android:id/list"
	android:layout_width="fill_parent" 
	android:layout_height="wrap_content" />
<TextView android:id="@android:id/empty"
	android:layout_width="wrap_content"
	android:layout_height="wrap_content"
	android:text="Tom liste" />
</LinearLayout>

 

custom_row.xml og Show.java er uforandret.

 

Dette ble kjapt satt sammen, og det finnes sikkert mer elegante måter å gjøre det på, men det funker ihvertfall :)

Lenke til kommentar

Ved å fikse parameteren til Date-objektet sluttet programmet å krasje, men jeg ser at ListViewen fortsatt var tomt selv etter kall på populateList().

 

En måte å fikse det på er å gjøre om Activityen til en ListActivity på følgende måte:

 

public class ShowList extends ListActivity {
private ShowItemAdapter aa;
private ArrayList<Show> list;

@Override
public void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);

	setContentView(R.layout.main);

	list = new ArrayList<Show>();
	aa = new ShowItemAdapter(this, R.layout.custom_row, list);
	setListAdapter(aa);
	populateList();
}

private class ShowItemAdapter extends ArrayAdapter<Show> {
	public ShowItemAdapter(Context context, int textViewResourceId, ArrayList<Show> items) {
		super(context, textViewResourceId, items);
	}

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

		Show show = getItem(position);
		if (show != null) {
			TextView nameView = (TextView)showView.findViewById(R.id.customView_name);
			TextView dateView = (TextView)showView.findViewById(R.id.customView_date);
			TextView seatsView =(TextView)showView.findViewById(R.id.customView_seats);
			TextView timeView = (TextView)showView.findViewById(R.id.customView_time);
			TextView placeView = (TextView)showView.findViewById(R.id.customView_place);

			SimpleDateFormat sdf = new SimpleDateFormat("d/M");

			nameView.setText(show.getName());
			dateView.setText(sdf.format(show.getDate()));
			seatsView.setText(show.getSeats());
			timeView.setText(show.getTime());
			placeView.setText(show.getPlace());
		}
		return showView;
	}
}

private void populateList() {
	Date date;
	date = new Date();
	Show show1 = new Show(date , "ISTID 3", "271 stk", "19:00", "Edda Kino Edda 1, Haugesund");
	list.add(show1);
	aa.notifyDataSetChanged();
}
}

 

Jeg flyttet ShowItemAdapter inn i ShowList for å slippe å bytte fane så ofte, men det er ingen sak å flytte ut igjen dersom du skulle foretrekke det ;)

 

main.xml kan da gjøres om til følgende:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<ListView android:id="@android:id/list"
	android:layout_width="fill_parent" 
	android:layout_height="wrap_content" />
<TextView android:id="@android:id/empty"
	android:layout_width="wrap_content"
	android:layout_height="wrap_content"
	android:text="Tom liste" />
</LinearLayout>

 

custom_row.xml og Show.java er uforandret.

 

Dette ble kjapt satt sammen, og det finnes sikkert mer elegante måter å gjøre det på, men det funker ihvertfall :)

 

 

Endringen av Activity til ListActivity funket utmerket. Hjertelig takk for hjelpen! :thumbup:

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...