Erstellen Sie für jedes Element eine Liste mit dem onClick-Listener
Ich habe einSQLite
db und ich wollen in einer ListView alle Elemente sehen. Aber ich möchte jede Zeile anklickbar machen. Wie macht man das? Hier ist der Code: Dann ... eine andere Frage ... Ich habe eine Aktivität, die ich über das Optionsmenü starten kann und die Daten zur Datenbank hinzufügt oder daraus entfernt. Ich möchte die Liste automatisch aktualisieren, wenn ich zu dieser Aktivität zurückkomme. Wie kann ich den Code ändern?
<code>public class WorkflowChoice extends Activity { private static final int INIT_JADE_PROFILE = 0; private static final int MANAGE_DATABASE = 1; private static final int MODIFY_FILES = 2; private static final int CHANGE_THEME = 3; private static final int SHOW_OUTPUT_WORKFLOW = 4; private LinearLayout properties_container; private MyDatabase db; TextView wfsTv; ListView wfsLv; private Cursor c; public MyDatabase getDb() { return db; } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.choice); properties_container = (LinearLayout ) findViewById(R.id.properties_container); String host = (String) InitJadeProperties.retrieve(this, getString(R.string.main_container_host), getString(R.string.default_host)); String port = (String) InitJadeProperties.retrieve(this, getString(R.string.main_container_port), getString(R.string.default_port)); wfsTv=(TextView)findViewById(R.id.wfsTv); ListView wfsLv = (ListView)findViewById(R.id.wfsLv); db=new MyDatabase(getApplicationContext()); db.open(); //apriamo il db if(db.fetchWfs().getCount()==0) { //inserimento dati, solo se il db è vuoto db.insertWf("WF1", "class1"); db.insertWf("WF2", "class2"); db.insertWf("WF3", "class3"); db.insertWf("WF4", "class4"); db.insertWf("WF5", "class5"); } c=db.fetchWfs(); // query startManagingCursor(c); SimpleCursorAdapter adapter=new SimpleCursorAdapter( //semplice adapter per i cursor this, R.layout.wfs, //il layout di ogni riga/prodotto c,new String[] { MyDatabase.WfMetaData.ID,MyDatabase.WfMetaData.WF_NAME_KEY,MyDatabase.WfMetaData.WF_CLASS_KEY } ,//questi colonne new int[]{R.id.IDTv,R.id.nameTv,R.id.classTv } ); //in queste views wfsLv.setAdapter(adapter); //la listview ha questo adapter //qui vediamo invece come reperire i dati e usarli, in questo caso li stampiamo in una textview int nameCol=c.getColumnIndex(MyDatabase.WfMetaData.WF_NAME_KEY); //indici delle colonne int classCol=c.getColumnIndex(MyDatabase.WfMetaData.WF_CLASS_KEY); if(c.moveToFirst()) { //se va alla prima entry, il cursore non è vuoto do { wfsTv.append("Wf Name:"+c.getString(nameCol)+", Class:"+c.getString(classCol)+"\n"); //estrazione dei dati dalla entry del cursor } while (c.moveToNext()); //iteriamo al prossimo elemento } db.close(); getWindow().setFormat(PixelFormat.RGBA_8888); //visto che usiamo i gradient, usiamo questo trick (vedi snippet forum) getWindow().addFlags(WindowManager.LayoutParams.FLAG_DITHER); //wfsLv.setBackgroundDrawable(new GradientDrawable(GradientDrawable.Orientation.BOTTOM_TOP, new int[] { Color.RED,Color.parseColor("#f2bf26") } )); //wfsTv.setBackgroundDrawable(new GradientDrawable(GradientDrawable.Orientation.TOP_BOTTOM, new int[] { Color.RED,Color.parseColor("#f2bf26") } )); //definizione ed uso di gradient in modo programmatico //animazioni in modo programmatico (vedi snippet forum) Animation a1 = new TranslateAnimation(Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_PARENT, 1.0f, Animation.RELATIVE_TO_SELF, 0.0f); a1.setDuration(1000); a1.setInterpolator(AnimationUtils.loadInterpolator(this, android.R.anim.decelerate_interpolator)); wfsLv.startAnimation(a1); //entra da sotto Animation a2 = new TranslateAnimation(Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_PARENT, -1.0f, Animation.RELATIVE_TO_SELF, 0.0f); a2.setDuration(1000); a2.setInterpolator(AnimationUtils.loadInterpolator(this, android.R.anim.decelerate_interpolator)); wfsTv.startAnimation(a2); //entra da sopra wfsLv.setClickable(true); //e affidiamo la gestione del tap/click ad un apposito listener, che ci permetterà di agire sull’elemento cliccato e ricaricare la nostra lista wfsLv.setOnItemClickListener (new AdapterView.OnItemClickListener() { public void onItemClick(AdapterView< ?> parent, View v, int position, long id) { TextView txtId = (TextView) v.findViewById(R.id.wfsTv); c.requery(); } } ); /*wfsTv.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { CharSequence text = "Workflow scelto!"; int duration = Toast.LENGTH_SHORT; Toast toast = Toast.makeText(getApplicationContext(), text, duration); toast.show(); } } ); */ TextView masterTv = (TextView)findViewById(R.id.masterTv); masterTv.setText("Master"); masterTv.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { startSubActivity(); } } ); } private void startSubActivity() { Intent intent = new Intent(this, ConfigChoice.class); startActivity(intent); } } </code>
BEARBEITEN
<code>protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.choice); properties_container = (LinearLayout ) findViewById(R.id.properties_container); String host = (String) InitJadeProperties.retrieve(this, getString(R.string.main_container_host), getString(R.string.default_host)); String port = (String) InitJadeProperties.retrieve(this, getString(R.string.main_container_port), getString(R.string.default_port)); wfsTv=(TextView)findViewById(R.id.wfsTv); ListView wfsLv = (ListView)findViewById(R.id.wfsLv); db=new MyDatabase(getApplicationContext()); db.open(); //apriamo il db if(db.fetchWfs().getCount()==0){//inserimento dati, solo se il db è vuoto db.insertWf("WF1", "class1"); db.insertWf("WF2", "class2"); db.insertWf("WF3", "class3"); db.insertWf("WF4", "class4"); db.insertWf("WF5", "class5"); } c=db.fetchWfs(); // query startManagingCursor(c); SimpleCursorAdapter adapter=new SimpleCursorAdapter( //semplice adapter per i cursor this, R.layout.wfs, //il layout di ogni riga/prodotto c, new String[]{MyDatabase.WfMetaData.ID,MyDatabase.WfMetaData.WF_NAME_KEY,MyDatabase.WfMetaData.WF_CLASS_KEY},//questi colonne new int[]{R.id.IDTv,R.id.nameTv,R.id.classTv});//in queste views wfsLv.setAdapter(adapter); //la listview ha questo adapter adapter.notifyDataSetChanged(); //qui vediamo invece come reperire i dati e usarli, in questo caso li stampiamo in una textview int nameCol=c.getColumnIndex(MyDatabase.WfMetaData.WF_NAME_KEY); //indici delle colonne int classCol=c.getColumnIndex(MyDatabase.WfMetaData.WF_CLASS_KEY); if(c.moveToFirst()){ //se va alla prima entry, il cursore non è vuoto do { wfsTv.append("Wf Name:"+c.getString(nameCol)+", Class:"+c.getString(classCol)+"\n"); //estrazione dei dati dalla entry del cursor } while (c.moveToNext());//iteriamo al prossimo elemento } db.close(); getWindow().setFormat(PixelFormat.RGBA_8888); //visto che usiamo i gradient, usiamo questo trick (vedi snippet forum) getWindow().addFlags(WindowManager.LayoutParams.FLAG_DITHER); //wfsLv.setBackgroundDrawable(new GradientDrawable(GradientDrawable.Orientation.BOTTOM_TOP, new int[]{Color.RED,Color.parseColor("#f2bf26")})); //wfsTv.setBackgroundDrawable(new GradientDrawable(GradientDrawable.Orientation.TOP_BOTTOM, new int[]{Color.RED,Color.parseColor("#f2bf26")})); //definizione ed uso di gradient in modo programmatico //animazioni in modo programmatico (vedi snippet forum) Animation a1 = new TranslateAnimation(Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_PARENT, 1.0f, Animation.RELATIVE_TO_SELF, 0.0f); a1.setDuration(1000); a1.setInterpolator(AnimationUtils.loadInterpolator(this, android.R.anim.decelerate_interpolator)); wfsLv.startAnimation(a1); //entra da sotto Animation a2 = new TranslateAnimation(Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_PARENT, -1.0f, Animation.RELATIVE_TO_SELF, 0.0f); a2.setDuration(1000); a2.setInterpolator(AnimationUtils.loadInterpolator(this, android.R.anim.decelerate_interpolator)); wfsTv.startAnimation(a2); //entra da sopra wfsLv.setClickable(true); //e affidiamo la gestione del tap/click ad un apposito listener, che ci permetterà di agire sull’elemento cliccato e ricaricare la nostra lista wfsLv.setOnItemClickListener (new AdapterView.OnItemClickListener() { public void onItemClick(AdapterView<?> parent, View v, int position, long id) { //TextView txtId = (TextView)v.findViewById(R.id.wfsTv); CharSequence text = "Workflow scelto!"; int duration = Toast.LENGTH_SHORT; Toast toast = Toast.makeText(getApplicationContext(), text, duration); toast.show(); c.requery(); } }); </code>