我需要您的帮助。 我想用另一个类的数据填充微调器。 当我单击按钮btn_add时,它将数据添加到我的数据库中。同时,我将“字符串质量”存储到sharedPreferences中。我要填写的列表在MainActivity类中,而按钮在AddActivity类中。
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
::::
public class AddActivity extends AppCompatActivity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.add_activity);
btn_add.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try{
sqLiteHelper = new SQLiteHelper(AddActivity.this, "Plant.sqlite", null, 1);
sqLiteHelper.insertData(
edt_quality.getText().toString().trim(),
edt_name.getText().toString().trim()
);
//////////////////SharedPreferences
SharedPreferences pref = getApplicationContext().getSharedPreferences("TheQualities", 0);
SharedPreferences.Editor editor = pref.edit();
editor.putString("quality", edt_quality.getText().toString().trim());
editor.apply();
//reset
resetFields(),
}
catch (Exception e) {
e.printStackTrace();
}
}
});
}
}
在下面的课程中,我想填写我的列表。 1.问题:将数据发送到数据库后,必须在质量显示在列表中之前重新启动程序。我想在将数据发送到数据库的同时更新列表。 2.问题:以前的质量总是被新质量代替,我想填写清单并保持清单中的最老的品质。
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
::::
public class MainActivity extends Activity {
Spinner spinner;
public static SQLiteHelper sqLiteHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
sqLiteHelper = new SQLiteHelper(this, "item.sqlite", null, 1);
// Get reference of widgets from XML layout
spinner = (Spinner) findViewById(R.id.spinnerX);
// Initializing an ArrayAdapter
final ArrayAdapter<String> spinnerArrayAdapter = new ArrayAdapter<String>(
this, android.R.layout.simple_spinner_item, fillList()) {
}; spinnerArrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(spinnerArrayAdapter);
}
};
//RETRIEVING PREFERENCES
public String getQuality() {
SharedPreferences prefs = getSharedPreferences("TheQualities", 0);
return prefs.getString("quality", "choice");
}
public List<String> fillList() {
List<String> list = new ArrayList<>();
if(!list.contains(getQuality())) {
list.add(getQuality());
}
return list;
}
}
NB:运行该应用程序时没有错误。 请问有人知道我该怎么做吗?
答案 0 :(得分:0)
如果您的流程是从MainActivity转到AddActivity,添加质量然后返回,则Spinner不会神奇地刷新。
如果是这种情况,则需要刷新Spinner的源,然后告诉适配器数据已更改。您可以使用适配器的 notifyDatasetChanged 方法来完成后者。
对于变化的列表(旋转列表,列表视图),使用列表非常有限。 ArrayList更具适应性。
假设以上内容,那么以下是基于您的代码的有效示例。
public class AddActivity extends AppCompatActivity {
EditText edt_quality;
Button btn_add, btn_done;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.add_activity);
edt_quality = this.findViewById(R.id.edt_quality);
btn_add = this.findViewById(R.id.add_button);
btn_done = this.findViewById(R.id.done_button);
btn_add.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
/*
}
sqLiteHelper = new SQLiteHelper(AddActivity.this, "Plant.sqlite", null, 1);
sqLiteHelper.insertData(
edt_quality.getText().toString().trim(),
edt_name.getText().toString().trim()
);
*/
//////////////////SharedPreferences
SharedPreferences pref = getApplicationContext().getSharedPreferences("TheQualities", 0);
SharedPreferences.Editor editor = pref.edit();
editor.putString("quality", edt_quality.getText().toString().trim());
editor.apply();
//reset
//resetFields()
} catch (Exception e) {
e.printStackTrace();
}
}
});
btn_done.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
finish();
}
});
}
}
public class MainActivity extends Activity {
// Define class variables/objects
Spinner spinner;
Button btn_add;
ArrayAdapter<String> mSpinnerArrayAdapter;
ArrayList<String> mFillList; //<<<<<<<<<< changed from List<String>
//public static SQLiteHelper sqLiteHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/**
* Added button to initiate AddActivity
*/
btn_add = this.findViewById(R.id.add_button);
btn_add.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent i = new Intent(MainActivity.this,AddActivity.class);
startActivity(i);
}
});
//sqLiteHelper = new SQLiteHelper(this, "item.sqlite", null, 1);
// Get reference of widgets from XML layout
spinner = (Spinner) findViewById(R.id.spinnerX);
fillList(); //<<<<<<<<<< Fill the list for the spinner (will initially be empty)
// Initializing an ArrayAdapter
mSpinnerArrayAdapter = new ArrayAdapter<String>(
this, android.R.layout.simple_spinner_item, mFillList) {
};
mSpinnerArrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(mSpinnerArrayAdapter);
}
/**
* ADDED as this is called when activity is resumed, so rebuild the Spinner's list
*/
@Override
protected void onResume() {
super.onResume();
fillList();
}
public String getQuality() {
SharedPreferences prefs = getSharedPreferences("TheQualities", 0);
return prefs.getString("quality", "choice");
}
/**
* Changed to do a little more depending upon status of the list and adapter
*/
public void fillList() {
// Initialise arraylist if not already initalised
if (mFillList == null) {
mFillList = new ArrayList<>();
}
// clear all elements from the arraylist
mFillList.clear();
// add the element (only ever 1)
if(!mFillList.contains(getQuality())) {
mFillList.add(getQuality());
}
// If the Adapter has been initialised then notify that the data has changed
if (mSpinnerArrayAdapter != null) {
mSpinnerArrayAdapter.notifyDataSetChanged();
}
}
}
,您会看到非常好现在可以在微调器中选择。
请注意,因为目前只有一种选择,最好从数据库中获取列表。
答案 1 :(得分:0)
根据建议,这是一个快速汇总的示例,仅使用表格。这还将根据所选类别选择项目。
请注意,为了演示起见,添加了1个初始类别(“我的第一类别”)和一个使用“我的第一类别”的项目。该项目被命名为“我的第一项”。
列出后,该项目的类别也会显示。
它不便于添加项目。但是,它确实有助于添加类别(请注意,从微调器中选择一个添加项,将不会在列表中显示任何内容,但是重新选择“我的第一类”将列出该项目)。
SQLiteHelper.java
public class SQLiteHelper extends SQLiteOpenHelper {
public static final String DBNAME = "mydatabase";
public static final int DBVERSION = 1;
public static final String TABLE_ITEM = "item";
public static final String TABLE_CATEGORY = "category";
public static final String COLUMN_ITEM_ID = BaseColumns._ID;
public static final String COLUMN_ITEM_NAME = "itemname";
public static final String COLUMN_ITEM_CATEGORYREF = "category_reference";
public static final String COLUMN_CATEGORY_ID = BaseColumns._ID;
public static final String COLUMN_CATEGORY_NAME = "category";
SQLiteDatabase mDB;
public SQLiteHelper(Context context) {
super(context, DBNAME, null, DBVERSION);
mDB = this.getWritableDatabase();
}
@Override
public void onCreate(SQLiteDatabase db) {
String crt_item_table = "CREATE TABLE IF NOT EXISTS " + TABLE_ITEM + "(" +
COLUMN_ITEM_ID + " INTEGER PRIMARY KEY, " +
COLUMN_ITEM_NAME + " TEXT, " +
COLUMN_ITEM_CATEGORYREF + " INTEGER" +
")";
db.execSQL(crt_item_table);
String crt_category_table = "CREATE TABLE IF NOT EXISTS " + TABLE_CATEGORY + "(" +
COLUMN_CATEGORY_ID + " INTEGER PRIMARY KEY," +
COLUMN_CATEGORY_NAME + " TEXT" +
")";
db.execSQL(crt_category_table);
mDB = db;
// ADD AN INITIAL CATEGORY AND THEN AN ITEM USING THAT CATEGORY
addCateory("My FIRST CATEGORY");
addItem("My First Item",1);
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
}
public long addCateory(String category) {
ContentValues cv = new ContentValues();
cv.put(COLUMN_CATEGORY_NAME,category);
return mDB.insert(TABLE_CATEGORY,null,cv);
}
public long addItem(String name, long category_reference) {
ContentValues cv = new ContentValues();
cv.put(COLUMN_ITEM_NAME,name);
cv.put(COLUMN_ITEM_CATEGORYREF,category_reference);
return mDB.insert(TABLE_ITEM,null,cv);
}
public Cursor getAllCategories() {
return mDB.query(TABLE_CATEGORY,null,null,null,null,null, COLUMN_CATEGORY_NAME + " ASC");
}
public Cursor getAllItemsWithCategoryName(long category_id) {
String table = TABLE_ITEM +
" JOIN " + TABLE_CATEGORY + " ON " + TABLE_ITEM + "." + COLUMN_ITEM_CATEGORYREF + " = " + TABLE_CATEGORY + "." + COLUMN_CATEGORY_ID;
String[] columns = new String[]{
TABLE_ITEM + "." + COLUMN_ITEM_ID,
COLUMN_ITEM_NAME,
COLUMN_CATEGORY_NAME
};
String whereclause;
String[] whereargs;
if (category_id < 1) {
whereclause = null;
whereargs = null;
} else {
whereclause = COLUMN_ITEM_CATEGORYREF + "=?";
whereargs = new String[]{String.valueOf(category_id)};
}
return mDB.query(table,columns,whereclause,whereargs,null,null,COLUMN_ITEM_NAME + " ASC");
}
}
getAllItemsWithCategoryName
方法中各项的查询有效SELECT item._id, itemname, category FROM item JOIN category ON item._id = category._id WHERE category_reference = ? ORDER BY itemname ASC
MainActivity.java
public class MainActivity extends Activity {
// Define class variables/objects
Spinner mCategorySpinner;
long mCurrentSelectedcategory = 0;
ListView mItemList;
Button btn_add;
Cursor mCategories, mItems;
SQLiteHelper mDBHlpr;
CursorAdapter mCategorySpinnerAdapter;
CursorAdapter mItemListViewAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/**
* Added button to initiate AddActivity
*/
btn_add = this.findViewById(R.id.add_button);
mCategorySpinner = (Spinner) this.findViewById(R.id.spinnerX);
mItemList = (ListView) this.findViewById(R.id.item_listview);
mDBHlpr = new SQLiteHelper(this);
setupOrRefreshUI();
btn_add.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent i = new Intent(MainActivity.this,AddActivity.class);
startActivity(i);
}
});
}
private void setupOrRefreshUI() {
//Category Spinner
mCategories = mDBHlpr.getAllCategories();
if (mCategorySpinnerAdapter == null) {
mCategorySpinnerAdapter = new SimpleCursorAdapter(
this,
android.R.layout.simple_spinner_dropdown_item,
mCategories,
new String[]{
SQLiteHelper.COLUMN_CATEGORY_NAME
},
new int[]{
android.R.id.text1
},
0
);
((SimpleCursorAdapter) mCategorySpinnerAdapter).setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
mCategorySpinner.setAdapter(mCategorySpinnerAdapter);
mCategorySpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
mCurrentSelectedcategory = l;
setupOrRefreshUI();
}
@Override
public void onNothingSelected(AdapterView<?> adapterView) {
}
});
} else {
mCategorySpinnerAdapter.swapCursor(mCategories);
}
//Item ListView
mItems = mDBHlpr.getAllItemsWithCategoryName(mCurrentSelectedcategory);
if (mItemListViewAdapter == null) {
mItemListViewAdapter = new SimpleCursorAdapter(
this,
android.R.layout.simple_list_item_2,
mItems,
new String[]{
SQLiteHelper.COLUMN_ITEM_NAME,
SQLiteHelper.COLUMN_CATEGORY_NAME
},
new int[]{
android.R.id.text1,
android.R.id.text2
},
0
);
mItemList.setAdapter(mItemListViewAdapter);
mItemList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
//<<<<<<<<<<<<<<<< handle clicking an item here
}
});
} else {
mItemListViewAdapter.swapCursor(mItems);
}
}
/**
* ADDED as this is called when activity is resumed, so rebuild the Spinner's list
*/
@Override
protected void onResume() {
super.onResume();
setupOrRefreshUI();
}
}
AddActivity.java
public class AddActivity extends AppCompatActivity {
EditText edt_quality;
Button btn_add, btn_done;
SQLiteHelper mDBHlpr;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_add);
edt_quality = this.findViewById(R.id.edt_quality);
btn_add = this.findViewById(R.id.add_button);
btn_done = this.findViewById(R.id.done_button);
mDBHlpr = new SQLiteHelper(this);
btn_add.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String newcategory = edt_quality.getText().toString();
if (newcategory.length() > 0) {
mDBHlpr.addCateory(newcategory);
}
}
});
btn_done.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
finish();
}
});
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"/>
<Button
android:id="@+id/add_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="ADD NEW CATEGORY"/>
<Spinner
android:id="@+id/spinnerX"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</Spinner>
<ListView
android:id="@+id/item_listview"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</ListView>
</LinearLayout>
activity_add.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".AddActivity">
<EditText
android:id="@+id/edt_quality"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button
android:id="@+id/add_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="SAVE CATEGORY"/>
<Button
android:id="@+id/done_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="DONE ADDING CATEGORIES"
/>
</LinearLayout>
注意以上是一个有效的示例,仅作为示例说明如何解决众多问题。