마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

sharedpreference를 사용해서 ListView에 아이템 나타낼 수 있을까요?

0 추천
다른 액티비티의 리스트뷰(1) 값을 받아와 리스트뷰(2)에 뿌려주는 형식입니다.

리스트뷰(1)에서 10개의 아이템이 있다면 해당 아이템을 누르면 리스트뷰(2)에

등록,추가해주도록 구현하려는데 아마 SharedPreference를 사용해야 할듯 해서

여쭈어 봅니다. 혼자 천천히 보고 따라하면서 배우는 중인데 안써본 것들에 대해

도통 적용력이 늘지않아 계속 여쭙습니다 도와주시면 감사하겠습니다.

우선 생각해본건 중간에 getintent 이하에서 받은 값을 sharedpreference로 저장

하고 리스트뷰(2)에 연결된 어댑터에 적용을 해야하는가? 생각해봤는데 방법을..
도와주세요!!

 

public class mylist extends AppCompatActivity{

    private final String mdbName = "myassign";
    private final String mtablename = "myclass";

    private String[] msubject = new String[]{};
    private String[] mday = new String[]{};

    ArrayList<HashMap<String, String>> mclassList;
    ListView mlist;

    private static final String mTAG_SUB = "msubject";
    private static final String mTAG_DAY = "mday";
    SQLiteDatabase mclassDB = null;
    ListAdapter madapter;

    // 액티비티에서 사용할 값을 저장
    private SharedPreferences prvPref;

    // 애플리케이션 전체에서 사용할 값
    private SharedPreferences sharedPref;

    private SharedPreferences.Editor prvEditor;
    private SharedPreferences.Editor sharedEditor;

    final SharedPreferences mPrefs = getSharedPreferences("sub",MODE_PRIVATE);

    SharedPreferences.Editor mEditor = mPrefs.edit();

 

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

        mlist = (ListView) findViewById(R.id.lstv1);
        mclassList = new ArrayList<HashMap<String, String>>();

        // 가져온 데이터를 myDB에 넣자
        Intent intent = getIntent();

        String myday = intent.getStringExtra("TAG_DAY");
        String mysub = intent.getStringExtra("TAG_SUB");

        List<String> Getday = new ArrayList<String>();
        Getday.add(myday);
        List<String> Getsub = new ArrayList<String>();
        Getsub.add(mysub);

        mday = new String[Getday.size()];
        Getday.toArray(mday);
        msubject = new String[Getsub.size()];
        Getsub.toArray(msubject);

        Toast.makeText(getApplicationContext(), "선택 강의:\n수업시간 :  " + myday + " \n과목명: " + mysub, Toast.LENGTH_LONG).show();

        mEditor.putString("sub",mysub);
        mEditor.putString("day",myday);
        mEditor.commit();

// 값 저장하기

        try {

            mclassDB = this.openOrCreateDatabase(mdbName, MODE_PRIVATE, null);

            mclassDB.execSQL("CREATE TABLE IF NOT EXISTS " + mtablename
                    + " (msubject VARCHAR(20), mday VARCHAR(20) );");

            mclassDB.execSQL("DELETE FROM " + mtablename  );

 

            //새로운 데이터를 테이블에 집어넣습니다..
            for (int i = 0; i < msubject.length; i++) {
                mclassDB.execSQL("INSERT INTO " + mtablename
                        + " (msubject, mday)  Values ('" + msubject[i] + "', '" + mday[i] + "');");
            }

            mclassDB.close();

        } catch (SQLiteException se) {
            Toast.makeText(getApplicationContext(), se.getMessage(), Toast.LENGTH_LONG).show();
            Log.e("", se.getMessage());
        }

        showList();

    }

    protected void showList() {

        try {

            SQLiteDatabase ReadDB = this.openOrCreateDatabase(mdbName, MODE_PRIVATE, null);

            Cursor c = ReadDB.rawQuery("SELECT * FROM " + mtablename, null);
            /**○  이 부분이 없으면 vmylistv에 정보를 그려넣을 수 없음*/
            if (c != null) {

                if (c.moveToFirst()) {
                    do {//테이블에서 가져옴

 

                        String mSUBJECT = c.getString(c.getColumnIndex("msubject"));
                        String mDAY = c.getString(c.getColumnIndex("mday"));

                       HashMap<String, String> cls1 = new HashMap<String, String>();

                        cls1.put(mTAG_SUB, mSUBJECT);
                        cls1.put(mTAG_DAY, mDAY);

                        //어레이리스트에 추가
                       mclassList.add(cls1);

                    } while (c.moveToNext());
                }
            }
                   /**○  여기까지*/

            ReadDB.close();
            madapter = new SimpleAdapter(this, mclassList, R.layout.vmylistv, new String[]{mTAG_SUB, mTAG_DAY}, new int[]{R.id.mtv1, R.id.mtv2});

            mlist.setAdapter(madapter);

      
        } catch (SQLiteException se) {
            Toast.makeText(getApplicationContext(), se.getMessage(), Toast.LENGTH_LONG).show();
            Log.e("", se.getMessage());
        }
    }
    }
도해이 (270 포인트) 님이 2017년 6월 18일 질문

1개의 답변

0 추천
정확히 하고자하는 바을 이해하기가 힘들어서 정확한 답변을 드리기 힘들지만,

전달을 목적으로 억지로 SharedPreferece를 사용해서

ListView item들을 저장하자면 저장할 수는 있을겁니다.

(수없이 많은 String key를 통해...)

하지만 절대 좋은 방법이 아니며,

정석대로 하자면 Intent.getSerializableExtra()를 통해 intent를 전달하는 것이 맞습니다.

또는 전역 static 변수를 통해서도 전달할 수 있겠습니다. (ArrayList등...)

또는 SQLite DB를 통해서도 전달할 수 있겠습니다.
디자이너정 (42,810 포인트) 님이 2017년 6월 18일 답변
액티비티가 2개 있습니다. 각 A와 B라고 두면

A에서 DB를 통해 listview(이하 리스트뷰1)에 아이템을 출력합니다.

그렇게 화면에 나오는 리스트뷰1에서 아이템(문자열입니다)을 클릭하면

아이템을 그대로 다른 B액티비티에서 받아 B액티비티에 연결된 리스트뷰(이하2)

에 나오게 합니다.

  ex)
처음실행시: 리스트뷰1의 3번item : 가나다  -> 클릭 -> 리스트뷰2의 1번 item
 이후            리스트뷰1의 1번item : 마바사  -> 클릭 -> 리스트뷰2의 2번 item

(이런식으로 선택한 아이템을 다른 리스트뷰에 더함)

이후가 질문사항입니다.  리스트뷰 1 - > 리스트뷰2 로 해당아이템을 추가하는

기능을 구현하고 싶어서 위와같이 했는데 리스트뷰1에서 아이템을 클릭하면

해당 아이템이 리스트뷰2에 나오고, 다른 아이템을 다시 선택하려고

리스트뷰1의 액티비티로 넘어가면 이전 값이 저장되지 않고 계속 클릭 한값만

나오는 상황입니다

때문에 한번 받은 리스트뷰1의 아이템값을 리스트뷰2에 그대로 보존하고 싶어

질문했습니다. 현재는 SharedPreference적용이 어느 변수에 해야 할지 몰라서

새로운 db를 입력받고 해결을 해볼까하는데 좋은 방법이 있을까요?

매번 도움주셔서 감사합니다
...