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&lt;
            ?&gt;
            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>

Antworten auf die Frage(1)

Ihre Antwort auf die Frage