1. Nimm jetzt an unserem Uhans - 3. ADVENT - Gewinnspiel teil - Alle Informationen findest Du hier!

Problem mit ListActivity refresh

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von ping87, 27.09.2010.

  1. ping87, 27.09.2010 #1
    ping87

    ping87 Threadstarter Neuer Benutzer

    Beiträge:
    20
    Erhaltene Danke:
    0
    Registriert seit:
    27.09.2010
    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 lView vint positionlong id) {
            
    super.onListItemClick(lvpositionid);


            
    TableLayout tl = (TableLayout) (siaa.getView(positionnullnull))
                    .
    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<
    Purchasepurchases;

            public 
    ShowItemsArrayAdapter(Activity context, List<Purchasepurchases) {
                
    super(contextR.layout.my_items_item_rowpurchases);

                
    this.context context;
                
    this.purchases purchases;
            }

            @
    Override
            
    public View getView(int positionView convertViewViewGroup parent) {
                
    LayoutInflater inflater context.getLayoutInflater();
                
    View rowView inflater.inflate(R.layout.show_purchases_rownull,
                        
    true);

                
    // GETTING VIEWS
                
    TextView txtItemLabel = (TextViewrowView
                        
    .findViewById(R.id.lbl_purchase_owner);
                
    TextView txtItemPrice = (TextViewrowView
                        
    .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 = (TableLayoutrowView
                        
    .findViewById(R.id.purchase_details);

                
    // GETTING ITEMS
                
    ArrayList<Itemitems = (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(10000);

                    
    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_PARENTLayoutParams.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<
    PurchasegetItems() {
                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: 27.09.2010
  2. Fr4gg0r, 27.09.2010 #2
    Fr4gg0r

    Fr4gg0r App-Anbieter (Werbung)

    Beiträge:
    2,506
    Erhaltene Danke:
    447
    Registriert seit:
    21.12.2009
    setNotifyDataChanged() probiert?
     
  3. ping87, 27.09.2010 #3
    ping87

    ping87 Threadstarter Neuer Benutzer

    Beiträge:
    20
    Erhaltene Danke:
    0
    Registriert seit:
    27.09.2010
    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
     
  4. Fr4gg0r, 28.09.2010 #4
    Fr4gg0r

    Fr4gg0r App-Anbieter (Werbung)

    Beiträge:
    2,506
    Erhaltene Danke:
    447
    Registriert seit:
    21.12.2009
    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: 28.09.2010
    ping87 bedankt sich.
  5. ping87, 28.09.2010 #5
    ping87

    ping87 Threadstarter Neuer Benutzer

    Beiträge:
    20
    Erhaltene Danke:
    0
    Registriert seit:
    27.09.2010
    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...

    Oh, herzlichen dank... das werde ich probieren.... melde mich dann wieder :)
    Falls dir, oder sonst wen noch was auffällt, bitte melden :)
     
    Zuletzt bearbeitet: 28.09.2010
  6. ping87, 28.09.2010 #6
    ping87

    ping87 Threadstarter Neuer Benutzer

    Beiträge:
    20
    Erhaltene Danke:
    0
    Registriert seit:
    27.09.2010
    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:
     
  7. Fr4gg0r, 28.09.2010 #7
    Fr4gg0r

    Fr4gg0r App-Anbieter (Werbung)

    Beiträge:
    2,506
    Erhaltene Danke:
    447
    Registriert seit:
    21.12.2009
    so

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

    public 
    void onCreate(){
    myAdapter.setOnItemClickListener(){
    states.set(position, !states.get(position));
    }
    }
     
  8. ping87, 28.09.2010 #8
    ping87

    ping87 Threadstarter Neuer Benutzer

    Beiträge:
    20
    Erhaltene Danke:
    0
    Registriert seit:
    27.09.2010
    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
     
  9. Fr4gg0r, 28.09.2010 #9
    Fr4gg0r

    Fr4gg0r App-Anbieter (Werbung)

    Beiträge:
    2,506
    Erhaltene Danke:
    447
    Registriert seit:
    21.12.2009
    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<Booleanstates = 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 lView vint positionlong id) {
            
    states.set(position, !states.get(position));
            
    ShowItemsArrayAdapter.notifyDataSetChanged();
        }

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

            private 
    Activity context;
            private List<
    Purchasepurchases;

            public 
    ShowItemsArrayAdapter(Activity context, List<Purchasepurchases) {
                
    super(contextR.layout.my_items_item_rowpurchases);

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

            @
    Override
            
    public View getView(int positionView convertViewViewGroup parent) {
                
    LayoutInflater inflater context.getLayoutInflater();
                
    View rowView inflater.inflate(R.layout.show_purchases_rownull,
                        
    true);

                
    // GETTING VIEWS
                
    TextView txtItemLabel = (TextViewrowView
                        
    .findViewById(R.id.lbl_purchase_owner);
                
    TextView txtItemPrice = (TextViewrowView
                        
    .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 = (TableLayoutrowView
                        
    .findViewById(R.id.purchase_details);

                
    // GETTING ITEMS
                
    ArrayList<Itemitems = (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(10000);

                    
    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_PARENTLayoutParams.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<
    PurchasegetItems() {
                return 
    this.purchases;
            }
        }
    }

    Das funktioniert ;)
     
    ping87 bedankt sich.
  10. ping87, 28.09.2010 #10
    ping87

    ping87 Threadstarter Neuer Benutzer

    Beiträge:
    20
    Erhaltene Danke:
    0
    Registriert seit:
    27.09.2010
    Vielen herzlichen DANK, Fr4gg0r! :)
     

Diese Seite empfehlen