2012-05-14 51 views
0

我有一個SQLite db,我希望在ListView中看到所有元素。但是我想讓每一行都可點擊。這個怎麼做?下面是代碼: 然後..另一個問題..我有一個活動,我可以通過選項菜單啓動,它添加或從數據庫中刪除數據..我想自動更新列表,當我回到這個活動。 。我如何更改代碼?使用onClick監聽器在每個項目上創建一個列表

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); 
    } 
} 

編輯

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(); 
     } 
       }); 

回答

4
listview.setOnItemClickListener(new OnItemClickListener() { 
    @Override 
    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { 
     //---> arg2 <-- will give you row number 
     // your code goes here 
    } 
}); 

,並改變數據

adapter.notifyDataSetChanged(); 
+0

我不明白.. – darkmax

+0

什麼ü不明白? – MAC

+0

我必須把那個代碼放在哪裏? – darkmax

相關問題