变量传入 Android?
Variable Passing in Android?
我的 MainActivity.java
中有一个变量 currentDB
。根据用户选择不同的选项卡,我将此变量初始化为不同的值。对应的代码是:
@override
public void tab_selector(View v) {
switch (v.getId()) {
case R.id.veg_tab:
setContentView(R.layout.vegetable);
currentListView = (ListView) findViewById(R.id.veg_list);
currentDB = "veg";
break;
case R.id.meat_tab :
setContentView(R.layout.meat_drawer);
currentListView = (ListView) findViewById(R.id.meat_list);
currentDB = "meat";
break;
default:
break;
}
currentList = mydb.getAllItems(currentDB); // Definition below, works perfect
itemAdder2.updateData(currentList);
currentListView.setAdapter(itemAdder2);
}
我在 DBHelper.java
中有一个方法,理想情况下采用 table 名称和项目 ID 作为输入,并从指定的 table.
中删除相应的行
public Integer deleteItem (String dbName, int id)
{
SQLiteDatabase db = this.getWritableDatabase();
return db.delete(dbName,
"id = ? ",
new String[] { Integer.toString(id) });
}
这是从 table 获取所有数据的又一个函数,它工作得很好。
public ArrayList<String> getAllItems(String dbName)
{
ArrayList<String> array_list = new ArrayList<String>();
//hp = new HashMap();
SQLiteDatabase db = this.getReadableDatabase();
Cursor res = db.rawQuery( "select * from " + dbName, null );
res.moveToFirst();
while(res.isAfterLast() == false){
array_list.add(res.getString(res.getColumnIndex(COLUMN_NAME)));
res.moveToNext();
}
return array_list;
}
我创建了一个自定义的 ListViewAdapter
以显示存储在数据库中的数据。我通过 onClick()
功能提供了用于编辑和删除的相关按钮。现在,我的问题是确定在 ListViewAdapter
中引用哪个数据库。我无法将 currentDB
信息从 MainActivity.java
传递到 ListViewAdapter.java
。请帮忙。提前致谢。 ListViewAdapter.java
的代码片段如下:
public class ListViewAdapter extends BaseAdapter {
Context mContext;
LayoutInflater mInflater;
ArrayList mArray;
DBHelper mydb;
String dbName;
public ListViewAdapter(Context context, LayoutInflater inflater) {
mContext = context;
mInflater = inflater;
mArray = new ArrayList();
mydb = new DBHelper(mContext);
dbName = "veg"; // Didn't know what to do, tried to initialize manually, din't work :(
}
@Override
public int getCount() {
return mArray.size();
}
@Override
public Object getItem(int position) {
return mArray.get(position);
}
@Override
public long getItemId(int position) {
// your particular data set uses String IDs
// but you have to put something in this method
return position;
}
@Override
public View getView(final int position, View convertView, final ViewGroup parent) {
ViewHolder holder;
// check if the view already exists
// if so, no need to inflate and findViewById again!
if (convertView == null) {
// Inflate the custom row layout from your XML.
convertView = mInflater.inflate(R.layout.list_item, null);
// create a new "Holder" with subviews
holder = new ViewHolder();
holder.itemNameView = (TextView) convertView.findViewById(R.id.item_name);
holder.itemExpiryView = (TextView) convertView.findViewById(R.id.item_expiry);
// Taking care of the buttons
holder.editButton = (Button) convertView.findViewById(R.id.button_edit);
holder.deleteButton = (Button) convertView.findViewById(R.id.button_delete);
// hang onto this holder for future recycling
convertView.setTag(holder);
} else {
// skip all the expensive inflation/findViewById
// and just get the holder you already made
holder = (ViewHolder) convertView.getTag();
}
// Set listener on the buttons
holder.editButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(mContext, "Edit Button CLicked", Toast.LENGTH_SHORT).show();
}
});
holder.deleteButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
deleteItem(position); // Potential problem here??
Toast.makeText(mContext, "Item deleted", Toast.LENGTH_SHORT).show();
}
});
// More code after this
// Grab the title and author from the JSON
String name = "";
String expiry = "7 days";
// Write appropriate codes to obtain values for the string variables above
name = (String) getItem(position);
// Send these Strings to the TextViews for display
holder.itemNameView.setText(name);
holder.itemExpiryView.setText(expiry);
return convertView;
}
// this is used so you only ever have to do
// inflation and finding by ID once ever per View
private static class ViewHolder {
public TextView itemNameView;
public TextView itemExpiryView;
public Button editButton;
public Button deleteButton;
}
public void updateData(ArrayList arrayPassed) {
// update the adapter's data set
mArray = arrayPassed;
notifyDataSetChanged();
}
public void deleteItem(int pos){
mArray.remove(pos); // Ideally, shouldn't be there
mydb.deleteItem(dbName, pos); // Here I need to pass the appropriate dbName
// mArray = mydb.getAllItems(); // Ideally should be there
notifyDataSetChanged();
}
}
如果您需要额外的东西,请告诉我。欢迎任何改写或主题,标签更改。作为菜鸟,无法准确表达。感谢你的帮助。 :)
这可能是不好的做法,但是如何设置 currentDB 变量 public 和静态,这样您就可以从另一个 class!
访问它
我想你可以在这里使用 SharedPreferences
对我来说,这看起来就像您只是想将一个字符串变量从一个 Activity 发送到另一个 class。此外,发送的字符串不是敏感信息。现在,这非常简单,可以使用 LocalBroadCastManager 完成。使用已被很好地讨论 here .
在适配器中创建一个public方法来设置Db名称,
例如:在 ListViewAdapter class,
public void setDbName(String dbName){
this.dbName = dbName;
}
然后在 tab_selector(View v) 方法中将数据库名称设置为适配器
例如:
@override
public void tab_selector(View v) {
switch (v.getId()) {
case R.id.veg_tab:
setContentView(R.layout.vegetable);
currentListView = (ListView) findViewById(R.id.veg_list);
currentDB = "veg";
break;
case R.id.meat_tab :
setContentView(R.layout.meat_drawer);
currentListView = (ListView) findViewById(R.id.meat_list);
currentDB = "meat";
break;
default:
break;
}
currentList = mydb.getAllItems(currentDB);
itemAdder2.updateData(currentList);
currentListView.setAdapter(itemAdder2);
itemAdder2.setDbName(currentDB );
}
我的 MainActivity.java
中有一个变量 currentDB
。根据用户选择不同的选项卡,我将此变量初始化为不同的值。对应的代码是:
@override
public void tab_selector(View v) {
switch (v.getId()) {
case R.id.veg_tab:
setContentView(R.layout.vegetable);
currentListView = (ListView) findViewById(R.id.veg_list);
currentDB = "veg";
break;
case R.id.meat_tab :
setContentView(R.layout.meat_drawer);
currentListView = (ListView) findViewById(R.id.meat_list);
currentDB = "meat";
break;
default:
break;
}
currentList = mydb.getAllItems(currentDB); // Definition below, works perfect
itemAdder2.updateData(currentList);
currentListView.setAdapter(itemAdder2);
}
我在 DBHelper.java
中有一个方法,理想情况下采用 table 名称和项目 ID 作为输入,并从指定的 table.
public Integer deleteItem (String dbName, int id)
{
SQLiteDatabase db = this.getWritableDatabase();
return db.delete(dbName,
"id = ? ",
new String[] { Integer.toString(id) });
}
这是从 table 获取所有数据的又一个函数,它工作得很好。
public ArrayList<String> getAllItems(String dbName)
{
ArrayList<String> array_list = new ArrayList<String>();
//hp = new HashMap();
SQLiteDatabase db = this.getReadableDatabase();
Cursor res = db.rawQuery( "select * from " + dbName, null );
res.moveToFirst();
while(res.isAfterLast() == false){
array_list.add(res.getString(res.getColumnIndex(COLUMN_NAME)));
res.moveToNext();
}
return array_list;
}
我创建了一个自定义的 ListViewAdapter
以显示存储在数据库中的数据。我通过 onClick()
功能提供了用于编辑和删除的相关按钮。现在,我的问题是确定在 ListViewAdapter
中引用哪个数据库。我无法将 currentDB
信息从 MainActivity.java
传递到 ListViewAdapter.java
。请帮忙。提前致谢。 ListViewAdapter.java
的代码片段如下:
public class ListViewAdapter extends BaseAdapter {
Context mContext;
LayoutInflater mInflater;
ArrayList mArray;
DBHelper mydb;
String dbName;
public ListViewAdapter(Context context, LayoutInflater inflater) {
mContext = context;
mInflater = inflater;
mArray = new ArrayList();
mydb = new DBHelper(mContext);
dbName = "veg"; // Didn't know what to do, tried to initialize manually, din't work :(
}
@Override
public int getCount() {
return mArray.size();
}
@Override
public Object getItem(int position) {
return mArray.get(position);
}
@Override
public long getItemId(int position) {
// your particular data set uses String IDs
// but you have to put something in this method
return position;
}
@Override
public View getView(final int position, View convertView, final ViewGroup parent) {
ViewHolder holder;
// check if the view already exists
// if so, no need to inflate and findViewById again!
if (convertView == null) {
// Inflate the custom row layout from your XML.
convertView = mInflater.inflate(R.layout.list_item, null);
// create a new "Holder" with subviews
holder = new ViewHolder();
holder.itemNameView = (TextView) convertView.findViewById(R.id.item_name);
holder.itemExpiryView = (TextView) convertView.findViewById(R.id.item_expiry);
// Taking care of the buttons
holder.editButton = (Button) convertView.findViewById(R.id.button_edit);
holder.deleteButton = (Button) convertView.findViewById(R.id.button_delete);
// hang onto this holder for future recycling
convertView.setTag(holder);
} else {
// skip all the expensive inflation/findViewById
// and just get the holder you already made
holder = (ViewHolder) convertView.getTag();
}
// Set listener on the buttons
holder.editButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(mContext, "Edit Button CLicked", Toast.LENGTH_SHORT).show();
}
});
holder.deleteButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
deleteItem(position); // Potential problem here??
Toast.makeText(mContext, "Item deleted", Toast.LENGTH_SHORT).show();
}
});
// More code after this
// Grab the title and author from the JSON
String name = "";
String expiry = "7 days";
// Write appropriate codes to obtain values for the string variables above
name = (String) getItem(position);
// Send these Strings to the TextViews for display
holder.itemNameView.setText(name);
holder.itemExpiryView.setText(expiry);
return convertView;
}
// this is used so you only ever have to do
// inflation and finding by ID once ever per View
private static class ViewHolder {
public TextView itemNameView;
public TextView itemExpiryView;
public Button editButton;
public Button deleteButton;
}
public void updateData(ArrayList arrayPassed) {
// update the adapter's data set
mArray = arrayPassed;
notifyDataSetChanged();
}
public void deleteItem(int pos){
mArray.remove(pos); // Ideally, shouldn't be there
mydb.deleteItem(dbName, pos); // Here I need to pass the appropriate dbName
// mArray = mydb.getAllItems(); // Ideally should be there
notifyDataSetChanged();
}
}
如果您需要额外的东西,请告诉我。欢迎任何改写或主题,标签更改。作为菜鸟,无法准确表达。感谢你的帮助。 :)
这可能是不好的做法,但是如何设置 currentDB 变量 public 和静态,这样您就可以从另一个 class!
访问它我想你可以在这里使用 SharedPreferences
对我来说,这看起来就像您只是想将一个字符串变量从一个 Activity 发送到另一个 class。此外,发送的字符串不是敏感信息。现在,这非常简单,可以使用 LocalBroadCastManager 完成。使用已被很好地讨论 here .
在适配器中创建一个public方法来设置Db名称, 例如:在 ListViewAdapter class,
public void setDbName(String dbName){
this.dbName = dbName;
}
然后在 tab_selector(View v) 方法中将数据库名称设置为适配器
例如:
@override
public void tab_selector(View v) {
switch (v.getId()) {
case R.id.veg_tab:
setContentView(R.layout.vegetable);
currentListView = (ListView) findViewById(R.id.veg_list);
currentDB = "veg";
break;
case R.id.meat_tab :
setContentView(R.layout.meat_drawer);
currentListView = (ListView) findViewById(R.id.meat_list);
currentDB = "meat";
break;
default:
break;
}
currentList = mydb.getAllItems(currentDB);
itemAdder2.updateData(currentList);
currentListView.setAdapter(itemAdder2);
itemAdder2.setDbName(currentDB );
}