2012-05-10 35 views
0

我有一個SQLite db,我想在ListView中看到所有元素。但是我想讓每一行都可點擊。這個怎麼做?下面是代碼: 然後..另一個問題..我有一個活動,我可以通過選項菜單啓動,它添加或從數據庫中刪除數據..我想自動更新列表,當我回到這個活動。 。我如何更改代碼?如何在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); 
} 

回答

0

你的1點的問題,我有

list.setOnItemClickListener(new OnItemClickListener() { 

       @Override 
       public void onItemClick(AdapterView<?> parent, View view, int position,long id) { 

// here you will get **position** of the item in the list which you can use gor updation/deletion 

       } 


      }); 

和第二個問題

寫你的第二question-

寫你的ListView intialization代碼的onResume()方法,因此將會得到所謂的每一次當你回來這個活動..

+0

我試圖修改onResume(),但沒有任何好結果.. :-( – darkmax

+0

你能幫我嗎? – darkmax

+0

@darkmax - 是的請 – NullPointerException

1

試試這個代碼:

wfsLv.setOnItemClickListener(new OnItemClickListener() { 
    @Override 
    public void onItemClick(AdapterView<?> arg0, View arg1,int arg2, long arg3) { 

    } 
}); 
+0

如果你看到我用這個..但我怎麼能啓動與該對象的類別的名稱舉杯cliked? – darkmax

0

您正在使用xml文件作爲您的listview的一行。在XML文件中只設置最外層的佈局

android:clickable="true" 

和所有孩子的意見,

android:clickable="false" 

試試這個希望它會工作。

那麼你可以聽它在setonitemclicklistener