Uppdatera listview efter onListItemClick

Discussion in 'Frågor, support och diskussion' started by Patlan, Mar 12, 2012.

  1. Patlan

    Patlan Teen Droid Medlem

    Joined:
    Apr 17, 2010
    Messages:
    383
    Likes Received:
    7

    MINA ENHETER

    Håller på att bli galen. Hur uppdaterar man en listvy satt med SimpleCursorAdapter efter att man tagit bort en rad med onListItemClick()-metoden?

    Code:
    	
    	public void setListAdapt()
    	{
    	databas = new Databas(ViewDatabase.this);
    	databas.open();
    
    	c = databas.getAllDataCursor();
    	startManagingCursor(c);
    	adapter = new SimpleCursorAdapter(this, R.layout.viewdatabase, c, new String[] { Databas.KEY_FIRSTNAME, Databas.KEY_LASTNAME }, new int[] { R.id.textViewFirstName, R.id.textViewLastName });
    	setListAdapter(adapter);
    
    	Log.i(DEBUG, "sätter listadaptern");
    	
    	}
    
    	@Override
    	protected void onListItemClick(ListView l, View v, int position, long id) {
    		// TODO Auto-generated method stub
    		super.onListItemClick(l, v, position, id);
    		
    		databas.open();
    		long data = id;
    		Log.i(DEBUG, "Skriver ut: "+ position);
    		databas.removeItem(data);
    		Log.i(DEBUG, "slänger data");
    
    		//uppdatera listadaptern utan den borttagna raden????
    
    	}
    Måste starta om appen för att vyn nedan ska uppdateras:
    [​IMG]
     
    Last edited: Mar 12, 2012
  2. ozp

    ozp Teen Droid Medlem

    Joined:
    May 6, 2010
    Messages:
    250
    Likes Received:
    31

    MINA ENHETER

    Code:
    adapter.changeCursor(databas.getAllDataCursor())
     
    Patlan likes this.
  3. Patlan

    Patlan Teen Droid Medlem

    Joined:
    Apr 17, 2010
    Messages:
    383
    Likes Received:
    7

    MINA ENHETER

    Ah, tusen tack. Brukar använda objekt. och sen poppar eclipse upp alla metoder men inte i detta fall. Den ville casta SimpleCursorAdapter också. Varför vill den det?

    Code:
    ((SimpleCursorAdapter)adapter).changeCursor(databas.getAllDataCursor());
    
     
  4. tomas_b

    tomas_b Kid Droid Medlem

    Joined:
    Mar 23, 2010
    Messages:
    97
    Likes Received:
    4

    MINA ENHETER

  5. Patlan

    Patlan Teen Droid Medlem

    Joined:
    Apr 17, 2010
    Messages:
    383
    Likes Received:
    7

    MINA ENHETER

    Provade det också men det funkade inte. Raden ligger kvar. changeCursor() funkade dock.

    Code:
    //((SimpleCursorAdapter)adapter).changeCursor(databas.getAllDataCursor());
    ((BaseAdapter) adapter).notifyDataSetChanged();
     
  6. ozp

    ozp Teen Droid Medlem

    Joined:
    May 6, 2010
    Messages:
    250
    Likes Received:
    31

    MINA ENHETER

    notifyDataSetChanged fungerar inte på databas-cursors. Datan cachas i cursorn och läses inte ut från databasen igen. Men i andra adaptorer ska man använda notifyDataSetChanged.

    Att du måste casta din adapter beror antagligen på att du inte har deklarerat den som en SimpleCursorAdapter.
     
  7. tomas_b

    tomas_b Kid Droid Medlem

    Joined:
    Mar 23, 2010
    Messages:
    97
    Likes Received:
    4

    MINA ENHETER

    Ah, var ett tag sedan jag använde mig av en sådan, tog en chansning bara ;)
     
  8. Patlan

    Patlan Teen Droid Medlem

    Joined:
    Apr 17, 2010
    Messages:
    383
    Likes Received:
    7

    MINA ENHETER

    Ok, trodde att den deklarerades som sådan när man skapar den:

    Code:
    	 adapter =[B] new SimpleCursorAdapter[/B](this, R.layout.viewdatabase, c, new String[] { Databas.KEY_FIRSTNAME, Databas.KEY_LASTNAME }, new int[] { R.id.textViewFirstName, R.id.textViewLastName });
    
     
  9. Patlan

    Patlan Teen Droid Medlem

    Joined:
    Apr 17, 2010
    Messages:
    383
    Likes Received:
    7

    MINA ENHETER

    Chansa inte med mig, jag sliter ju mitt hår här :D

    (skoj, tacksam för ALL hjälp)
     
  10. tomas_b

    tomas_b Kid Droid Medlem

    Joined:
    Mar 23, 2010
    Messages:
    97
    Likes Received:
    4

    MINA ENHETER

    Det beror på vilken typ du har satt att adapter ska vara där du deklarerar den, ex:
    Code:
    private SimpleCursorAdapter adapter;
    
     
  11. Patlan

    Patlan Teen Droid Medlem

    Joined:
    Apr 17, 2010
    Messages:
    383
    Likes Received:
    7

    MINA ENHETER

    Jag deklarerade den som ListAdapter. Gick efter ett exempel i en lärobok. Spelar det någon roll om man anger den som private eller inte?

    Code:
    public class ViewDatabase extends ListActivity {
    
    	private static final String DEBUG = "Debug-tag";
    
    	Databas databas;
    	SQLiteDatabase ourDatabase;
    	ListAdapter adapter;
    	
    	@Override
    	public void onCreate(Bundle savedInstanceState) {
    		// TODO Auto-generated method stub
    		super.onCreate(savedInstanceState);
     
  12. tomas_b

    tomas_b Kid Droid Medlem

    Joined:
    Mar 23, 2010
    Messages:
    97
    Likes Received:
    4

    MINA ENHETER

    Nej, det påverkar åtkomsten av variabeln för andra klasser, men iomd att du sätter referensen som en ListAdapter så är det det den går på, dvs du har tillgång till allt som ListAdapter ger dig och uppåt i kedjan så att säga.

    Ett annat exempel skulle kunna vara:
    Code:
    Object obj = new String("En sträng");
    
    Allt du kommer åt där är metoder i Object och inte String eftersom den refererar till Object-klassen och inte String.

    I ditt fall så kommer changeCursor ifrån den abstrakta superklassen CursorAdapter. Så om du vill efterleva mantrat "programmera efter interfacet och inte klassen" (eller hur det nu är man säger ;) ) så sätt adapter som en CursorAdapter, eller bara direkt som en SimpleCursorAdapter, eller skit i't och gör som du gör nu :)