Problem mit ListActivity refresh

P

ping87

Neues Mitglied
0
Hallo.
Habe folgendes Problem.
Ich konstruiere eine ListActivity in der halt Items angezeigt werden. Wenn der User auf ein Item klickt sollte dieses sich öffnen und details anzeigen.
Jede Reihe in der ListActivity besteht aus zwei nebeneinander stehenden textviews die immer sichtbar sind. Und darunter ein Tablelayout, welches dynamisch mit den detaildaten gefüllt wird. Zunächst ist dieses TableLayut auf unsichtbar gesetzt (setVisibility()). Soweit so gut.

Nun soll dieser TableLayout sichtbar werden wenn der user eben auf einen eintrag in der ListActivity klickt. Also mache ich in der onItemClicked() methode der ListActivity wieder ein setVisibility() diesmal auf true. Aber leider wird des TableLayout nicht angezeigt... :/ ich denke da muss ich irgendwie die ListView refreshen oder so... kann mir da jemand weiterhelfen??? hier mal der enstprechende code:
PHP:
package com.berndwarmuth.client.shopper.activities;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import android.app.Activity;
import android.app.ListActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TableLayout;
import android.widget.TableRow;
import android.widget.TextView;

import com.berndwarmuth.client.shopper.Item;
import com.berndwarmuth.client.shopper.Purchase;
import com.berndwarmuth.client.shopper.R;

public class ShowPurchasesActivity extends ListActivity {

	private ShowItemsArrayAdapter siaa;

	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		this.setContentView(R.layout.show_purchases);

		siaa = new ShowItemsArrayAdapter(this, new ArrayList<Purchase>());
		//...
                //...
		setListAdapter(siaa);

	}

	@Override
	protected void onListItemClick(ListView l, View v, int position, long id) {
		super.onListItemClick(l, v, position, id);


		TableLayout tl = (TableLayout) (siaa.getView(position, null, null))
				.findViewById(R.id.purchase_details);
		 tl.setVisibility(View.VISIBLE); //GEHT NIIIIIIT!


	}

	// CUSTOM ARRAY ADAPTER
	public class ShowItemsArrayAdapter extends ArrayAdapter<Purchase> {

		private Activity context;
		private List<Purchase> purchases;

		public ShowItemsArrayAdapter(Activity context, List<Purchase> purchases) {
			super(context, R.layout.my_items_item_row, purchases);

			this.context = context;
			this.purchases = purchases;
		}

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			LayoutInflater inflater = context.getLayoutInflater();
			View rowView = inflater.inflate(R.layout.show_purchases_row, null,
					true);

			// GETTING VIEWS
			TextView txtItemLabel = (TextView) rowView
					.findViewById(R.id.lbl_purchase_owner);
			TextView txtItemPrice = (TextView) rowView
					.findViewById(R.id.lbl_purchase_date);

			txtItemLabel.setText(purchases.get(position).getOwner());
			txtItemPrice.setText(purchases.get(position).getDate());

			// HIDE TABLELAYOUT (detailed informations of one purchase)
			TableLayout tl = (TableLayout) rowView
					.findViewById(R.id.purchase_details);

			// GETTING ITEMS
			ArrayList<Item> items = (ArrayList<Item>) purchases.get(position)
					.getItems();

			// ITERATE OVER ITEMS & CREATE TABLE ROWS
			for (Item i : items) {
				/* Create a new row to be added. */
				TableRow tr = new TableRow(ShowPurchasesActivity.this);
				TextView tv = new TextView(ShowPurchasesActivity.this);
				tv.setText(i.getLabel());
				tv.setPadding(10, 0, 0, 0);

				TextView tv2 = new TextView(ShowPurchasesActivity.this);
				tv2.setText(i.getPrice().toString());
				tv2.setGravity(Gravity.RIGHT);

				tr.addView(tv);
				tr.addView(tv2);

				/* Add row to TableLayout. */
				tl.addView(tr, new TableLayout.LayoutParams(
						LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
			}

			 tl.setVisibility(View.GONE);

			return rowView;
		}

		@Override
		public void add(Purchase object) {
			super.add(object);
		}

		@Override
		public Purchase getItem(int position) {
			return super.getItem(position);
		}

		public List<Purchase> getItems() {
			return this.purchases;
		}
	}
}

und hier noch die beiden dazugehörigen XML files:

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

	<View android:layout_width="fill_parent" android:layout_height="2dip"
		android:background="#999999" />

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

		<TextView android:text="@+id/txt_item" android:layout_width="wrap_content"
			android:layout_height="wrap_content" android:id="@+id/lbl_purchase_owner"
			android:textSize="30px"></TextView>

		<TextView android:layout_alignParentRight="true"
			android:textSize="30px" android:layout_width="wrap_content"
			android:layout_height="wrap_content" android:id="@+id/lbl_purchase_date"
			android:layout_toLeftOf="@id/lbl_purchase_owner">
		</TextView>
	</RelativeLayout>

	<View android:layout_width="fill_parent" android:layout_height="2dip"
		android:background="#999999" />

	<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
		android:layout_width="fill_parent" android:layout_height="fill_parent"
		android:stretchColumns="1" android:id="@+id/purchase_details">


	</TableLayout>
</LinearLayout>
show_purchases.xml:
Code:
<?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" android:paddingLeft="8dp"
	android:paddingRight="8dp">
	<TextView android:layout_width="fill_parent"
		android:layout_height="wrap_content" android:text="Purchases"
		android:textSize="30px" 
		android:gravity="center_horizontal" android:layout_marginBottom="20dp"/>

	<ListView android:id="@id/android:list" android:layout_width="match_parent"
		android:layout_height="match_parent" android:layout_weight="1"
		android:drawSelectorOnTop="false" />

	<TextView android:id="@id/android:empty" android:layout_width="match_parent"
		android:layout_height="match_parent" android:text="No Purchases" 
		android:gravity="center_horizontal"/>
	
</LinearLayout>
 
Zuletzt bearbeitet:
setNotifyDataChanged() probiert?
 
Fr4gg0r schrieb:
setNotifyDataChanged() probiert?

Hallo Fr4gg0r,

ja, diese Methode habe ich schon probiert.
Es ändert sich leider nichts daran :/
Außerdem ändert sich ja so gesehen nichts an den Daten. Es soll nur dieses TableLayout welches eh schon vorhanden ist (nur eben ausgeblendet) wieder angezeigt werden für die jeweilige Reihe.

lg
 
Also ich habe eine ListView, wobei jede Zeile aus einer TextView und einer CheckBox besteht.
Wird die CheckBox gedrückt, ändert sich die Textfarbe. Dies tue ich mit der o.g. Methode.
Sollte eigentlich bei dir genauso funktionieren.

Also:
Dein Ansatz war falsch.
Du musst setVisibility in der getView Methode setzen, dann brauchst du noch eine Liste um die states zu speichern
also setVisibility(states.get(position));
Momentan änderst du die Visibility für irgendein Tablelayout, welches garnicht angezeigt wird. ;)
So als würdest du machen show(Objekta) und dann später Objekta a2 = new Objekta(); a2.setFarbe(rot); und dich dann wundern dass dein Bildschirm nicht rot wird. ;)

Übrigens ier ein Tipp für ListViews.
 
Zuletzt bearbeitet:
  • Danke
Reaktionen: ping87
Fr4gg0r schrieb:
Also ich habe eine ListView, wobei jede Zeile aus einer TextView und einer CheckBox besteht.
Wird die CheckBox gedrückt, ändert sich die Textfarbe. Dies tue ich mit der o.g. Methode.
Sollte eigentlich bei dir genauso funktionieren.

hmmm, ja das habe ich mir eben auch gedacht. Aber leider tut sich da nix.
habs grad noch mal mit der setNotifyDataChanged(true) methode im konstruktor von meinem ArrayAdapter probiert... --> nix.
Wenn ich auf eine Zeile in der ListActivity klicke tut sich einfach nichts... :/
Ich bin schon recht lange dabei und komm nicht drauf woran es liegt...

Fr4gg0r schrieb:
Also ich habe eine ListView, wobei jede Zeile aus einer TextView und einer CheckBox besteht.
Wird die CheckBox gedrückt, ändert sich die Textfarbe. Dies tue ich mit der o.g. Methode.
Sollte eigentlich bei dir genauso funktionieren.
Oh, herzlichen dank... das werde ich probieren.... melde mich dann wieder :)
Falls dir, oder sonst wen noch was auffällt, bitte melden :)
 
Zuletzt bearbeitet:
Obwohl... so ganz versteh ich nicht was du meinst.
In der getView() methode muss ich das TableLayout mal auf Invisible (GONE) setzen... das mach ich ja. Es soll ja nur sichtbar sein wenn eine zeile in der ListView angeklickt wird. Und das muss ich ja eben in der onItemListClicked() methode machen...
Hm also hab ich das problem, dass ich nicht das richtige TableLayout erwische? Wie komm ich von der onListItemClicked() method zu diesem TableLayout?
:winki:
 
so

PHP:
public class myAdapter{
public final ArrayList<Boolean> states = new ArrayList<Boolean>();
public myAdapter(){
for(int i = 0; i<rowCount; i++){
states.add(false);
}
public View getView(...){
tableRow.setVisibility(states.get(position));
}
}

public void onCreate(){
myAdapter.setOnItemClickListener(){
states.set(position, !states.get(position));
}
}
 
hm ich wüsste nicht wofür ich diese state-liste brauche.
Wenn ich wie oben in meinem code in der getView() methode des Adapters setVisibility(GONE) aufrufe wird eh für jede zeile das TableLayout nicht angezeigt. Das einzige was ich tun muss is eben in der onclick() methode der ListActivity an das jeweilige TableLayout ranzukommen und eben die Sichtbarkeit wieder auf true stellen.....

hmm sorry aber ich steh da grad bissl am schlauch.. :huh: könntest deine überlegungen (deinen code) mal mit meinen bisherigen code mergen?

lg
 
PHP:
package com.berndwarmuth.client.shopper.activities;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import android.app.Activity;
import android.app.ListActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TableLayout;
import android.widget.TableRow;
import android.widget.TextView;

import com.berndwarmuth.client.shopper.Item;
import com.berndwarmuth.client.shopper.Purchase;
import com.berndwarmuth.client.shopper.R;

public class ShowPurchasesActivity extends ListActivity {

	private ShowItemsArrayAdapter siaa;
        public final ArrayList<Boolean> states = new ArrayList<Boolean>();


	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		this.setContentView(R.layout.show_purchases);

		siaa = new ShowItemsArrayAdapter(this, new ArrayList<Purchase>());
		//...
                //...
		setListAdapter(siaa);

	}

	@Override
	protected void onListItemClick(ListView l, View v, int position, long id) {
        states.set(position, !states.get(position));
        ShowItemsArrayAdapter.notifyDataSetChanged();
	}

	// CUSTOM ARRAY ADAPTER
	public class ShowItemsArrayAdapter extends ArrayAdapter<Purchase> {

		private Activity context;
		private List<Purchase> purchases;

		public ShowItemsArrayAdapter(Activity context, List<Purchase> purchases) {
			super(context, R.layout.my_items_item_row, purchases);

			this.context = context;
			this.purchases = purchases;
                        int count = Purchase.size();
                        for(int i = 0; i<count; i++){
                            states.add(false);
                        }
		}

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			LayoutInflater inflater = context.getLayoutInflater();
			View rowView = inflater.inflate(R.layout.show_purchases_row, null,
					true);

			// GETTING VIEWS
			TextView txtItemLabel = (TextView) rowView
					.findViewById(R.id.lbl_purchase_owner);
			TextView txtItemPrice = (TextView) rowView
					.findViewById(R.id.lbl_purchase_date);

			txtItemLabel.setText(purchases.get(position).getOwner());
			txtItemPrice.setText(purchases.get(position).getDate());

			// HIDE TABLELAYOUT (detailed informations of one purchase)
			TableLayout tl = (TableLayout) rowView
					.findViewById(R.id.purchase_details);

			// GETTING ITEMS
			ArrayList<Item> items = (ArrayList<Item>) purchases.get(position)
					.getItems();

			// ITERATE OVER ITEMS & CREATE TABLE ROWS
			for (Item i : items) {
				/* Create a new row to be added. */
				TableRow tr = new TableRow(ShowPurchasesActivity.this);
				TextView tv = new TextView(ShowPurchasesActivity.this);
				tv.setText(i.getLabel());
				tv.setPadding(10, 0, 0, 0);

				TextView tv2 = new TextView(ShowPurchasesActivity.this);
				tv2.setText(i.getPrice().toString());
				tv2.setGravity(Gravity.RIGHT);

				tr.addView(tv);
				tr.addView(tv2);

				/* Add row to TableLayout. */
				tl.addView(tr, new TableLayout.LayoutParams(
						LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
			}

			 tl.setVisibility(states.get(position));

			return rowView;
		}

		@Override
		public void add(Purchase object) {
			super.add(object);
		}

		@Override
		public Purchase getItem(int position) {
			return super.getItem(position);
		}

		public List<Purchase> getItems() {
			return this.purchases;
		}
	}
}

Das funktioniert ;)
 
  • Danke
Reaktionen: ping87
Vielen herzlichen DANK, Fr4gg0r! :)
 

Ähnliche Themen

S
Antworten
4
Aufrufe
995
Sempervivum
S
B
Antworten
4
Aufrufe
494
bb321
B
R
Antworten
3
Aufrufe
1.630
Ritartet
R
Zurück
Oben Unten