【问题标题】:Fill a list with data getting from the SharePreferences使用从 SharedPreferences 获取的数据填充列表
【发布时间】:2018-12-08 12:20:22
【问题描述】:

我需要你的帮助。 我想用另一个类的数据填充微调器。 当我单击按钮 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;
}

}

注意:运行应用程序时没有错误。 请问有人知道我该怎么做吗?

【问题讨论】:

  • 您以前的质量正在被新的质量所取代,因为您将单个值保存在首选项中并从首选项中获取单个值。相反,您应该在首选项中保存一些列表,或者您应该更改获取列表的代码

标签: android sqlite spinner


【解决方案1】:

根据建议,这是一个仅使用表格的快速组合示例。这也将根据所选类别选择项目。

注意,为了演示,添加了 1 个初始类别(我的第一个类别)和 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
    • ?将是选定的类别 id (category._id)
    • 请注意,如果所选类别 id 为 0,则省略 WHERE 子句。

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>

注意以上是一个工作示例,仅用于演示如何解决众多问题。

【讨论】:

  • 感谢@Mike T 提供的示例。
【解决方案2】:

假设您的流程是您从 MainActivity 转到 AddActivity,添加质量然后返回,Spinner 不会神奇地刷新。

如果是这种情况,您需要刷新 Spinner 的源,然后告诉适配器数据已更改。后者使用适配器的 notifyDatasetChanged 方法。

对于发生变化的列表(Spinner's、Listviews),使用列表非常有限。 ArrayList 的适应性更强。

假设上述情况,那么以下是基于您的代码的工作示例。

  • 注意数据库访问代码已被注释掉。
  • 为了模拟调用 AddActivity,向 MainActivity 添加了一个按钮。
  • 模拟返回/完成

代码

AddActivity(基本上是为返回添加按钮)

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();
            }
        });
    }
}

MainActivity(见 cmets)

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();
        }
    }
}

结果

应用启动时(安装后的第一次)

  • 微调器中没有任何内容。

在 MainActivity 上单击添加按钮

  • 然后在EditText中输入非常好,点击ADD,然后点击DONE:-

主要活动恢复

  • 如您所见,现在可以在 Spinner 中选择 非常好

  • 请注意,目前只有 1 个选择,最好从数据库中获取列表。

【讨论】:

  • 感谢@Mike T 的回答。为什么 ArrayList 将只有一个选择,即使我通过 AddActivity 在其中添加了许多数据? 请注意,目前只有 1 个选择,最好从数据库中获取列表。 为什么会这样?当我重新启动应用程序时,为什么列表的所有元素都会消失?
  • 这些都是像其他问题一样需要问的问题。答案是否允许您从共享偏好中获取数据,尽管只有 1 个?如果是这样,请将问题标记为已回答。然后提出其他问题并附上相关代码。
  • 好的@Mike T.,谢谢你的责任
  • @Kel 额外的答案(不打勾)可能会有所帮助。
猜你喜欢
  • 2016-07-16
  • 1970-01-01
  • 2021-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多