Listor i listor

Diskussion i 'Frågor, support och diskussion' startad av sika, 30 mar 2011.

  1. sika

    sika Baby Droid Medlem

    Blev medlem:
    25 feb 2011
    Inlägg:
    17
    Mottagna gillanden:
    0

    MINA ENHETER

    Hej!

    Jag har en hierarkisk databas, och vill visa dess innehåll med hjälp av listor. Med andra ord: In lista visas --> något trycks i denna listan-->en ny lista visas med innehåll specificerat från en databas. Från den nya listan vill jag också kunna "hämta" information, t ex att jag har checkat i en checkbox (detta kommer senare, men kan vara värt att nämna ifall det har betydelse för skapandet nu).

    Jag vet inte om jag är inne på rätt grej här, för även om jag lyckas visa en ny lista vid onItemClick så vet jag inte hur "sparandet" av föregående lista hanteras om jag t ex tryck "back".

    Jag har följande kod:
    HTML:
    import android.app.ListActivity;
    import android.database.Cursor;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.View;
    import android.widget.AdapterView;
    import android.widget.AdapterView.OnItemClickListener;
    import android.widget.ListView;
    import android.widget.SimpleCursorAdapter;
    import android.widget.ListAdapter;
    
    public class Products extends ListActivity
    {
    	DbHelper dbHelper;
    	OnItemClickListener listener;
    	private ListView lv;
    	private ListAdapter la;
    	
    	public void onCreate (Bundle savedInstanceState)
    	{
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.products_list_item);
    		dbHelper = new DbHelper(this);
    		dbHelper.open();
    		
    		fillData();
    		ListView lv = getListView();
    		lv.setTextFilterEnabled(true);
    
    		lv.setOnItemClickListener(new OnItemClickListener()
    		{
    			public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long rowId) 
    			{
    				Log.d("Clicked", Integer.toString((int)rowId));
    				//Vad sätta här?			}
    		});
    		
    	}
    	public void fillData()
    	{
    		Cursor c = dbHelper.fetchCategories("Category");
    		startManagingCursor(c);
    		
    		String[] from = new String[] { DbHelper.CATEGORY_NAME };
    		int [] to = new int[] {R.id.products_row_layout};
    		
    		SimpleCursorAdapter products_list = new SimpleCursorAdapter(this, R.layout.products_row, c, from, to);
    		setListAdapter(products_list);	
    	}
    	
    	@Override
    	protected void onDestroy()
    	{
    		Log.d("Products", "onDestroyTagProd");
    		super.onDestroy();
    		dbHelper.close();
    	}
    }
    Hur går jag vidare, eller bör jag undersöka annat?
     
  2. Zooklubba

    Zooklubba Android Medlem

    Blev medlem:
    10 jul 2010
    Inlägg:
    6 448
    Mottagna gillanden:
    2 199

    MINA ENHETER

    Vet inte exakt vad det är för information mer än att du vill ha en checkbox.

    Ett sätt är nog att göra något med http://developer.android.com/reference/android/widget/ExpandableListAdapter.html
    Så får du ett resultat som ser ut ungefär såhär:
    [​IMG]
    Du kan givetvis modifiera den och få en annan layout. Passar det din användning så verkar det smartast att köra så.

    Ett annat sätt är att kalla fillData och säga till listan att du uppdaterat informationen.
    dbHelper.fetchCategories("Klickat på katergori 1"); beroende på hur du hämtar den informationen, eller finns den redan i cursorn?

    Ett tredje sätt är att starta en ny aktivitet och skicka med vilken kategori som ska visas med ett Intent som du tar hand om i onCreate.

    Fantasin sätter gränserna ;)
     
    Last edited: 3 apr 2011
  3. sika

    sika Baby Droid Medlem

    Blev medlem:
    25 feb 2011
    Inlägg:
    17
    Mottagna gillanden:
    0

    MINA ENHETER

    Zooklubba, tack för ditt svar!

    Jag har främst tänkt på ditt andra förslag: "kalla fillData och säga till listan att du uppdaterat informationen. " Jag är dock osäker på hur jag bör implementera detta - dels handlar det om (1) jag bör hålla allt i en fillData eller om jag bör ha fler fillData funktioner för när jag klickar, (2) hur jag spolar listan och/eller curson (?) till fördel för en ny, samt (3) hur jag hanterar BACK-knappen så att jag "kommer tillbaka" till samma ställe då jag tycker på detta.

    Jag funderar på att starta nya aktiviteter istället om jag inte löser detta snabbt, har klurat för länge med det.

    Skulle uppskatta lite hints på min kod.

    HTML:
    package com.mappbridge.rentaram_app_1;
    
    import android.app.ListActivity;
    import android.database.Cursor;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.View;
    import android.widget.AdapterView;
    import android.widget.AdapterView.OnItemClickListener;
    import android.widget.ListView;
    import android.widget.SimpleCursorAdapter;
    import android.widget.ListAdapter;
    
    public class Products extends ListActivity
    {
    	DbHelper dbHelper;
    	OnItemClickListener listener;
    	private ListView lv;
    	private Cursor cursorC=null;
    	SimpleCursorAdapter products_list;
    	private int intRowId;
    	
    	String currentID = "0"; //NEW
    	
    	public void onCreate (Bundle savedInstanceState)
    	{
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.products_list_item);
    		dbHelper = new DbHelper(this);
    		dbHelper.open();
    
    		fillData();
    		
    		ListView lv = getListView();
    		lv.setTextFilterEnabled(true);
    
    		lv.setOnItemClickListener(new OnItemClickListener()
    		{
    			public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long rowId) 
    			{
    				Log.d("Clicked", Integer.toString((int)rowId));
    				fillData2(Integer.toString((int)rowId));
    				//intRowId = (int) rowId;
    				
    				//fillData();
    							
    			}
    		});
    		
    		//1, 29
    		//TextView textview = new TextView(this);
    		//textview.setText("This is the Products tab");
    		//setContentView(textview);
    	}
    	public void fillData()
    	{
    		cursorC = dbHelper.fetchCategories("Category");
    		startManagingCursor(cursorC);
    	
    		String[] from = new String[] { DbHelper.CATEGORY_NAME };
    		int [] to = new int[] {R.id.products_row_layout};
    		
    		products_list = new SimpleCursorAdapter(this, R.layout.products_row, cursorC, from, to);
    		setListAdapter(products_list);	
    	}
    	
    	public void fillData2(String parentId)
    	{
    		cursorC = dbHelper.fetchProducts("Category", parentId);
    		startManagingCursor(cursorC);
    		
    		String[] from = new String[] { DbHelper.CATEGORY_NAME };
    		int [] to = new int[] {R.id.products_row_layout};
    		
    		products_list = new SimpleCursorAdapter(this, R.layout.products_row, cursorC, from, to);
    		/*
    		//NEW
    		c.moveToFirst();
    		while(c.move(1))
    		{
    			Log.d("Info", c.getString(0));
    		}
    		//NEW
    		*/
    		//setListAdapter(products_list);
    		products_list.notifyDataSetInvalidated();
    	}
    	
    	
    	
    	@Override
    	protected void onDestroy()
    	{
    		Log.d("Products", "onDestroyTagProd");
    		super.onDestroy();
    		dbHelper.close();
    	}
    }