2015-07-10 38 views
1

我的列表視圖活動:如何使用編輯字段更新sql表?

public class List extends ActionBarActivity{ 

private CustomCursorAdapter customAdapter; 
private PersonDatabaseHelper databaseHelper; 
private static final int ENTER_DATA_REQUEST_CODE = 1; 
private ListView listView; 

private static final String TAG = List.class.getSimpleName(); 

/** 
* Called when the activity is first created. 
*/ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.listview); 

    databaseHelper = new PersonDatabaseHelper(this); 

    listView = (ListView) findViewById(R.id.list_data); 
    listView.setOnItemClickListener(new OnItemClickListener() { 

     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      Log.d(TAG, "clicked on item: " + position); 

       Intent intent = new Intent(List.this, Edit.class); 

       intent.putExtra("id", position);        

       startActivity(intent); 

     } 
    }); 
    listView.setOnLongClickListener(new OnLongClickListener() { 


     @Override 
     public boolean onLongClick(View v) { 
      return false; 
      // TODO Auto-generated method stub 


     } 
    }); 
    // Database query can be a time consuming task .. 
    // so its safe to call database query in another thread 
    // Handler, will handle this stuff for you <img src="http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif?m=1129645325g" alt=":)" class="wp-smiley"> 

    new Handler().post(new Runnable() { 
     @Override 
     public void run() { 
      customAdapter = new CustomCursorAdapter(List.this, databaseHelper.getAllData()); 
      listView.setAdapter(customAdapter); 
     } 
    }); 
} 

    public void onClickEnterData(View btnAdd) { 

     startActivityForResult(new Intent(this, Permission.class), ENTER_DATA_REQUEST_CODE); 

} 

    public void onClickLogOut(View btnLogOut){ 
    Intent intent = new Intent(List.this, 
      MainActivity.class); 
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
    startActivity(intent); 
    } 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 

    super.onActivityResult(requestCode, resultCode, data); 

    if (resultCode == RESULT_OK) { 

     databaseHelper.insertData(data.getExtras().getString("tag_person_name"), data.getExtras().getString("tag_person_surname"),data.getExtras().getString("tag_person_enterdate"),data.getExtras().getString("tag_person_entertime"),data.getExtras().getString("tag_person_exitdate"),data.getExtras().getString("tag_person_exittime")); 

     customAdapter.changeCursor(databaseHelper.getAllData()); 
    } 
} 
    } 

這是我的SQL助手:

public class PersonDatabaseHelper { 

private static final String TAG = PersonDatabaseHelper.class.getSimpleName(); 

// database configuration 
// if you want the onUpgrade to run then change the database_version 
private static final int DATABASE_VERSION = 7; 
private static final String DATABASE_NAME = "database.db"; 

// table configuration 
private static final String TABLE_NAME = "person_table";   // Table name 
private static final String PERSON_TABLE_COLUMN_ID = "_id";  // a column named "_id" is required for cursor 
private static final String PERSON_TABLE_COLUMN_NAME = "person_name"; 
private static final String PERSON_TABLE_COLUMN_SURNAME = "person_surname"; 
private static final String PERSON_TABLE_COLUMN_ENTERDATE = "person_enterdate"; 
private static final String PERSON_TABLE_COLUMN_ENTERTIME = "person_entertime"; 
private static final String PERSON_TABLE_COLUMN_EXITDATE = "person_exitdate"; 
private static final String PERSON_TABLE_COLUMN_EXITTIME = "person_exittime"; 

private DatabaseOpenHelper openHelper; 
private SQLiteDatabase database; 

// this is a wrapper class. that means, from outside world, anyone will communicate with PersonDatabaseHelper, 
// but under the hood actually DatabaseOpenHelper class will perform database CRUD operations 
public PersonDatabaseHelper(Context aContext) { 

    openHelper = new DatabaseOpenHelper(aContext); 
    database = openHelper.getWritableDatabase(); 
} 

    public void insertData (String aPersonName, String aPersonSurName, String aPersonEnterDate,String aPersonEnterTime, String aPersonExitDate,String aPersonExitTime) { 

    // we are using ContentValues to avoid sql format errors 

    ContentValues contentValues = new ContentValues(); 

    contentValues.put(PERSON_TABLE_COLUMN_NAME, aPersonName); 
    contentValues.put(PERSON_TABLE_COLUMN_SURNAME, aPersonSurName); 
    contentValues.put(PERSON_TABLE_COLUMN_ENTERDATE, aPersonEnterDate); 
    contentValues.put(PERSON_TABLE_COLUMN_ENTERTIME, aPersonEnterTime); 
    contentValues.put(PERSON_TABLE_COLUMN_EXITDATE, aPersonExitDate); 
    contentValues.put(PERSON_TABLE_COLUMN_EXITTIME, aPersonExitTime); 

    database.insert(TABLE_NAME, null, contentValues); 

} 

    public Cursor getAllData() { 

    String buildSQL = "SELECT * FROM " + TABLE_NAME; 

    Log.d(TAG, "getAllData SQL: " + buildSQL); 

    return database.rawQuery(buildSQL, null); 
} 


// this DatabaseOpenHelper class will actually be used to perform database related operation 

private class DatabaseOpenHelper extends SQLiteOpenHelper { 

    public DatabaseOpenHelper(Context aContext) { 
     super(aContext, DATABASE_NAME, null, DATABASE_VERSION); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase sqLiteDatabase) { 
     // Create your tables here 

     String buildSQL = "CREATE TABLE " + TABLE_NAME + "(" + PERSON_TABLE_COLUMN_ID + " INTEGER PRIMARY KEY, " + 
       PERSON_TABLE_COLUMN_NAME + " TEXT, " + PERSON_TABLE_COLUMN_SURNAME + " TEXT, " + PERSON_TABLE_COLUMN_ENTERDATE + " TEXT," + PERSON_TABLE_COLUMN_ENTERTIME + " TEXT," + PERSON_TABLE_COLUMN_EXITDATE + " TEXT," + PERSON_TABLE_COLUMN_EXITTIME + " TEXT)"; 

     Log.d(TAG, "onCreate SQL: " + buildSQL); 

     sqLiteDatabase.execSQL(buildSQL); 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVersion) { 
     // Database schema upgrade code goes here 

     String buildSQL = "DROP TABLE IF EXISTS " + TABLE_NAME; 

     Log.d(TAG, "onUpgrade SQL: " + buildSQL); 

     sqLiteDatabase.execSQL(buildSQL);  // drop previous table 

     onCreate(sqLiteDatabase);    // create the table from the beginning 
    } 
} 
} 

這是我的自定義適配器類

public class CustomCursorAdapter extends CursorAdapter { 

@SuppressWarnings("deprecation") 
public CustomCursorAdapter(Context context, Cursor c) { 
    super(context, c); 
} 

@Override 
public View newView(Context context, Cursor cursor, ViewGroup parent) { 
    // when the view will be created for first time, 
    // we need to tell the adapters, how each item will look 
    LayoutInflater inflater = LayoutInflater.from(parent.getContext()); 
    View retView = inflater.inflate(R.layout.single_row_item, parent, false); 

    return retView; 
} 

@Override 
public void bindView(View view, Context context, Cursor cursor) { 
    // here we are setting our data 
    // that means, take the data from the cursor and put it in views 

    TextView textViewPersonName = (TextView) view.findViewById(R.id.name); 
    textViewPersonName.setText(cursor.getString(cursor.getColumnIndex(cursor.getColumnName(1)))); 

    TextView textViewPersonsurName = (TextView) view.findViewById(R.id.surName); 
    textViewPersonsurName.setText(cursor.getString(cursor.getColumnIndex(cursor.getColumnName(2)))); 

    TextView textViewPersonEnterDate = (TextView) view.findViewById(R.id.date); 
    textViewPersonEnterDate.setText(cursor.getString(cursor.getColumnIndex(cursor.getColumnName(3)))); 

    TextView textViewPersonEnterTime = (TextView) view.findViewById(R.id.time); 
    textViewPersonEnterTime.setText(cursor.getString(cursor.getColumnIndex(cursor.getColumnName(4)))); 

    TextView textViewPersonExitDate = (TextView) view.findViewById(R.id.date2); 
    textViewPersonExitDate.setText(cursor.getString(cursor.getColumnIndex(cursor.getColumnName(5)))); 

    TextView textViewPersonExitTime = (TextView) view.findViewById(R.id.time2); 
    textViewPersonExitTime.setText(cursor.getString(cursor.getColumnIndex(cursor.getColumnName(6)))); 
} 
    } 

這是我的名單看起來像: enter image description here

然後我單擊列表項目我已經創建的類:

public class Edit extends ActionBarActivity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_edit); 

     Bundle extras = getIntent().getExtras(); 
    if(extras !=null) 
    { 
    int id = extras.getInt("id"); 

     Toast.makeText(getApplicationContext(), 
         "Position :"+id , Toast.LENGTH_LONG); 

    } 

    EditText name = (EditText) findViewById(R.id.name);  
    EditText surName = (EditText) findViewById(R.id.surName);  
    EditText date = (EditText) findViewById(R.id.date2);   
    EditText time = (EditText) findViewById(R.id.time2);   
    EditText eDate = (EditText) findViewById(R.id.date3);  
    EditText eTime = (EditText) findViewById(R.id.time3); 

} 

public void onCancel(View btnCancel){ 
Intent intent = new Intent (Edit.this,List.class); 
startActivity(intent); 
    } 
public void onSave(View btnSave){ 

    } 
@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.edit, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle action bar item clicks here. The action bar will 
    // automatically handle clicks on the Home/Up button, so long 
    // as you specify a parent activity in AndroidManifest.xml. 
    int id = item.getItemId(); 
    if (id == R.id.action_settings) { 
     return true; 
    } 
    return super.onOptionsItemSelected(item); 
} 
} 

單擊它看起來像後: enter image description here

所以,我管理,只需點擊它來獲得id列,但主要的問題是,我想打當我點擊列表項時,所有信息顯示在編輯文本字段中(現在它是空的,因爲我上傳了圖像),並且在點擊添加按鈕後,它更新列表中顯示的SQL表和信息。 List.java存儲我的列表和Edit.java,其中空的編輯字段apear在項目在列表視圖中點擊後。

編輯:CustomCursorAdapter

public class CustomCursorAdapter extends CursorAdapter { 

@SuppressWarnings("deprecation") 
public CustomCursorAdapter(Context context, Cursor c) { 
    super(context, c); 
} 

@Override 
public View newView(Context context, Cursor cursor, ViewGroup parent) { 
    // when the view will be created for first time, 
    // we need to tell the adapters, how each item will look 
    LayoutInflater inflater = LayoutInflater.from(parent.getContext()); 
    View retView = inflater.inflate(R.layout.single_row_item, parent, false); 

    return retView; 
} 


@Override 
public void bindView(View view, Context context, Cursor cursor) { 
    // here we are setting our data 
    // that means, take the data from the cursor and put it in views 

    TextView textViewPersonName = (TextView) view.findViewById(R.id.name); 
    textViewPersonName.setText(cursor.getString(cursor.getColumnIndex(cursor.getColumnName(1)))); 

    TextView textViewPersonsurName = (TextView) view.findViewById(R.id.surName); 
    textViewPersonsurName.setText(cursor.getString(cursor.getColumnIndex(cursor.getColumnName(2)))); 

    TextView textViewPersonEnterDate = (TextView) view.findViewById(R.id.date); 
    textViewPersonEnterDate.setText(cursor.getString(cursor.getColumnIndex(cursor.getColumnName(3)))); 

    TextView textViewPersonEnterTime = (TextView) view.findViewById(R.id.time); 
    textViewPersonEnterTime.setText(cursor.getString(cursor.getColumnIndex(cursor.getColumnName(4)))); 

    TextView textViewPersonExitDate = (TextView) view.findViewById(R.id.date2); 
    textViewPersonExitDate.setText(cursor.getString(cursor.getColumnIndex(cursor.getColumnName(5)))); 

    TextView textViewPersonExitTime = (TextView) view.findViewById(R.id.time2); 
    textViewPersonExitTime.setText(cursor.getString(cursor.getColumnIndex(cursor.getColumnName(6)))); 
} 

public Person get(int position) { 
    Cursor cursor = getCursor(); 
    Person person; 
    if(cursor.moveToPosition(position)) { 
     person = new Person(); 
     person.name = cursor.getString(cursor.getColumnIndex(PERSON_TABLE_COLUMN_NAME)); 
     person.surname = cursor.getString(cursor.getColumnIndex(PERSON_TABLE_COLUMN_SURNAME)); 
     person.enterDate = cursor.getString(cursor.getColumnIndex(PERSON_TABLE_COLUMN_ENTERDATE)); 
     person.enterTime = cursor.getString(cursor.getColumnIndex(PERSON_TABLE_COLUMN_ENTERTIME)); 
     person.exitDate = cursor.getString(cursor.getColumnIndex(PERSON_TABLE_COLUMN_EXITDATE)); 
     person.exitTime = cursor.getString(cursor.getColumnIndex(PERSON_TABLE_COLUMN_EXITTIME)); 
    } 
    return person; 
} 
    } 

編輯XML:

<EditText 
    android:id="@+id/username" 
    android:hint="Name" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" > 

    </EditText> 
    <EditText 
    android:id="@+id/usersurname" 
    android:hint="Surname" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" > 
    </EditText> 



<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:orientation="horizontal" > 
    <EditText 
    android:id="@+id/date2" 
    android:hint="Enter date" 
    android:focusable="false" 
    android:layout_weight="1" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" > 
    </EditText> 
    <EditText 
    android:id="@+id/time2" 
    android:hint="Enter time" 
    android:focusable="false" 
    android:layout_weight="1" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" > 
    </EditText> 
    </LinearLayout> 
    <LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:orientation="horizontal" > 
<EditText 
    android:id="@+id/date3" 
    android:hint="Exit date" 
    android:focusable="false" 
    android:layout_weight="1" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" > 
    </EditText> 
    <EditText 
    android:id="@+id/time3" 
    android:hint="Exit time" 
    android:focusable="false" 
    android:layout_weight="1" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" > 
    </EditText> 
    </LinearLayout> 
    <LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:orientation="horizontal" > 

    <Button 
     android:id="@+id/Save" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:onClick="onClickSave" 
     android:text="Add" /> 

    <Button 
     android:id="@+id/Cancel" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:onClick="onCancel" 
     android:text="Cancel" /> 

</LinearLayout> 


    </LinearLayout> 

EDIT3:

public class Edit extends ActionBarActivity { 

EditText name; 
EditText surName; 
EditText date; 
EditText time; 
EditText eDate; 
EditText eTime; 
String data_name; 
String data_surname; 
String data_enterdate; 
String data_entertime; 
String data_exitdate; 
String data_exittime; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_edit); 


    Intent intent = getIntent(); 
    data_name = intent.getStringExtra("name"); 
    data_surname = intent.getStringExtra("surname"); 
    data_enterdate= intent.getStringExtra("enterdate"); 
    data_entertime = intent.getStringExtra("entertime"); 
    data_exitdate = intent.getStringExtra("exitdate"); 
    data_exittime = intent.getStringExtra("surname"); 


    name = (EditText) findViewById(R.id.name); 
    surName = (EditText) findViewById(R.id.surName); 
    date = (EditText) findViewById(R.id.date2); 
    time = (EditText) findViewById(R.id.time2); 
    eDate = (EditText) findViewById(R.id.date3); 
    eTime = (EditText) findViewById(R.id.time3); 


    setText(); 

} 

public void setText(){ 
name.setText(data_name,TextView.BufferType.EDITABLE); 
surName.setText(data_surname,TextView.BufferType.EDITABLE); 
date.setText(data_enterdate,TextView.BufferType.EDITABLE); 
time.setText(data_entertime,TextView.BufferType.EDITABLE); 
eDate.setText(data_exitdate,TextView.BufferType.EDITABLE); 
eTime.setText(data_exittime,TextView.BufferType.EDITABLE); 
} 
public void onCancel(View btnCancel){ 
Intent intent = new Intent (Edit.this,List.class); 
startActivity(intent); 
} 
public void onSave(View btnSave){ 

} 
@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.edit, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle action bar item clicks here. The action bar will 
    // automatically handle clicks on the Home/Up button, so long 
    // as you specify a parent activity in AndroidManifest.xml. 
    int id = item.getItemId(); 
    if (id == R.id.action_settings) { 
     return true; 
    } 
    return super.onOptionsItemSelected(item); 
} 
    } 
+0

我想你忘了說明問題了嗎?如果你能解釋你在做什麼和沒有發生什麼,那會很好。 – Karthik

+1

我在最後一張圖片後解釋了 – TheDude

+0

簡而言之,我想讓列表視圖項可編輯,稍後更新它:) – TheDude

回答

1

首先。你可以把所有的列與意圖,如你把id。例如,如果你想要把這個名字,則:

listView.setOnItemClickListener(new OnItemClickListener() { 
    @Override 
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
     Log.d(TAG, "clicked on item: " + position); 
     Intent intent = new Intent(List.this, Edit.class); 

     //change this to your actual code 
     String name = listView.getAdapter().getItem(position).getName(); 
     intent.putExtra("id", position); 
     intent.putExtra("name", name); 
     //put the rest of the data here 
     startActivity(intent); 
    } 
}); 

在你Edit活動,只要致電:

Intent intent = getIntent(); 
String data_name = intent.getStringExtra("name"); 
//get the rest of the data 

的文本,然後設定相應的EditText:

name.setText(data_name); 

如果你想更新SQL表,只需在你的DatabaseOpenHelper中創建一個方法來更新列。如果您不知道如何操作,只需在Android的SQLite更新聲明上執行Google搜索即可。

然後一個onClickListener添加到您的按鈕:

yourAddButton.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
      //get an instance of the DBHelper class and get 
       the text from the EditTexts to update the table 
     } 
}); 

編輯:

將此Person

public class Person { 
    String name; 
    String surname; 
    String enterDate; 
    String enterTime; 
    String exitDate; 
    String exitTime; 
} 

編輯3:

這應該是正確的方法處理CursorAdapter,對不起,因爲我哈以前不會使用它。

listView.setOnItemClickListener(new OnItemClickListener() { 
@Override 
public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
Log.d(TAG, "clicked on item: " + position); 
Intent intent = new Intent(List.this, Edit.class); 

Person p = new Person(); 
Cursor cursor = (Cursor) customAdapter.getItem(position); 
p.name = cursor.getString(cursor.getColumnIndex("person_name")); 
p.surname = cursor.getString(cursor.getColumnIndex("person_surname")); 
p.enterDate = cursor.getString(cursor.getColumnIndex("person_enterdate")); 
p.enterTime = cursor.getString(cursor.getColumnIndex("person_entertime")); 
p.exitDate = cursor.getString(cursor.getColumnIndex("person_exitdate")); 
p.exitTime = cursor.getString(cursor.getColumnIndex("person_exittime")); 

//get the rest of the attributes 
intent.putExtra("id", position); 
intent.putExtra("name", p.name); 
intent.putExtra("surname", p.surname); 
//put the rest of the data here 
startActivity(intent); 
} 
}); 

編輯4:

public class Edit extends ActionBarActivity { 

EditText name; 
EditText surName; 
EditText date; 
EditText time; 
EditText eDate; 
EditText eTime; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_edit); 


    Intent intent = getIntent(); 
    String data_name = intent.getStringExtra("name"); 
    String data_surname = intent.getStringExtra("surname"); 
    String data_enterdate= intent.getStringExtra("enterdate"); 
    String data_entertime = intent.getStringExtra("entertime"); 
    String data_exitdate = intent.getStringExtra("exitdate"); 
    String data_exittime = intent.getStringExtra("surname"); //typo here 


    name = (EditText) findViewById(R.id.username); //corrected 
    surName = (EditText) findViewById(R.id.usersurname); //corrected 
    date = (EditText) findViewById(R.id.date2); 
    time = (EditText) findViewById(R.id.time2); 
    eDate = (EditText) findViewById(R.id.date3); 
    eTime = (EditText) findViewById(R.id.time3); 

    name.setText(data_name); 
    surName.setText(data_surname); 
    date.setText(data_enterdate); 
    time.setText(data_entertime); 
    eDate.setText(data_exitdate); 
    eTime.setText(data_exittime); 
} 


public void onCancel(View btnCancel){ 
finish(); 
} 
public void onSave(View btnSave){ 

} 
@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.edit, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle action bar item clicks here. The action bar will 
    // automatically handle clicks on the Home/Up button, so long 
    // as you specify a parent activity in AndroidManifest.xml. 
    int id = item.getItemId(); 
    if (id == R.id.action_settings) { 
     return true; 
    } 
    return super.onOptionsItemSelected(item); 
} 
    }