Заполните список данными, полученными из SharePreferences - PullRequest
0 голосов
/ 05 декабря 2018

Мне нужна ваша помощь.Я хотел бы заполнить счетчик данными из другого класса.Когда я нажимаю кнопку btn_add, она добавляет данные в мою базу данных.В то же время я храню «String-качество» в 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;
}

}

Примечание:при запуске приложения ошибки нет.Пожалуйста, у кого-нибудь есть идея, как я могу это сделать?

Ответы [ 2 ]

0 голосов
/ 08 декабря 2018

Вот быстро составленный пример согласно предложению, использующему только таблицы.При этом также будут выбраны элементы в соответствии с выбранной категорией.

Обратите внимание, что для демонстрации добавлена ​​1 начальная категория (Моя первая категория) и 1 элемент, в котором используется Моя первая категория.Элемент с именем My First Item.

При отображении в списке также отображается категория элемента.

Это не облегчает добавление элементов.Однако это облегчает добавление категорий (отмечая, что при выборе добавленного из счетчика ничего не будет отображаться в списке, а при повторном выборе категории «Мой первый» будет отображаться элемент).

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
    • ?будет выбранным идентификатором категории (category._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>

ПРИМЕЧАНИЕ Вышеприведенный пример является рабочим примером, предоставленным исключительно в качестве демонстрации того, как можно решить многочисленные проблемы.

0 голосов
/ 06 декабря 2018

Spinner не будет магически обновляться при условии, что ваш поток состоит в том, что вы переходите к AddActivity из MainActivity, добавляете качество и затем возвращаете.

Если это так, вам нужно обновить источник Spinner изатем сообщите адаптеру, что данные изменились.Вы делаете последнее, используя метод notifyDatasetChanged Адаптера.

Использование List очень ограничено для List (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 (см. Комментарии)

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

Результат

Когда приложение запускается (самый первый раз после установки)

enter image description here

  • Ничего в Spinner.

Кнопка «Добавить» нажата на MainActivity

enter image description here

  • Очень хорошо * Затем в EditText вводится , нажимается ADD и затем DONE : -

Основная активность возобновлена ​​

enter image description here

  • и, как вы можете видеть, Очень хорошо теперь можно выбратьd в Spinner.

  • Обратите внимание, что в таком случае будет только 1 выбор, вам будет лучше получить список из базы данных.

...