我有一个SQLite数据库,我想在ListView中查看所有元素。但我想使每一行都可单击。这该怎么做?这是代码:然后..另一个问题..我有一个活动,可以通过选项菜单启动,它可以从数据库中添加或删除数据。.当我回到此活动时,我想自动更新列表。如何更改代码?
SQLite
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(); } });
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();