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

선생님들 intent해서받은값을 listview에 넣으려하는데 새로운값이 덮어쓰여진다면 받는쪽문제인가요?

0 추천
 try {
            if (getIntent().hasExtra("json")) {

                JSONObject json = new JSONObject(getIntent().getStringExtra("json"));
                Iterator x = json.keys();
                JSONArray jsonArray = new JSONArray();
               
                while ( x.hasNext()) {
                    String key = (String) x.next();
                    jsonArray.put(json.get(key));
                       }
                    for (int i = 0; i < jsonArray.length(); i++) {
                        title = jsonArray.getString(i);
                          name = jsonArray.getString(i);
                    }
                myItem.add(new list_item("제목: " + title, "작성자: " + name));
                adapter.notifyDataSetChanged();
                }

        } catch (JSONException e) {
            e.printStackTrace();
        }

최대한 코드리뷰하시기 편하게 정리했는데도 지저분하네요.. 죄송합니다.

현재 A Activity에서 B Activiy로 intent한뒤 jsonObject의 키값을 추출하여 jsonArray에 넣고 for문을 돌려
받은 i값을 title과 name에 넣고 myItem에 추가한뒤 실행하고있습니다. 그런데 하나를 작성하고 새로 작성하려고하면 이전에 있던값에 새로운 데이터가 덮어쓰여지는데 받는부분에서 문제인지 아니면 myItem에서 추가하는부분이 잘못된건지 질의드립니다.

(지금와서 코드보니까 for문 돌리지않고 jsonObject에서 키값만꺼내 넣기만해도 됬네요;;)

큐더블유이알 (370 포인트) 님이 2019년 1월 9일 질문

2개의 답변

0 추천
질문의도가 애매해서 모르겠네요.ㅎㅎ
이해한바로는 데이터를 추가하면 리스트뷰에 추가되는게 아니고 새로운 값만 나온다고 하시는것 같은데
맞나요?
그럼 당연히 데이터가 문제겠죠? myItem이 잘 쌓이는지 확인해보시면 될 것 같아요.
익명사용자 님이 2019년 1월 9일 답변
2019년 1월 9일 수정
답변해주셔서 감사드립니다!!

listview가 이번이처음이라  notifyDataSetChanged의 역할을 잘모르는데

notifyDataSetChanged가 갱신해주면서 새로작성하는 게시글에 인덱스를 제공하는건가요?

지금 notifyDataSetChanged가 실행안되는 문제도있고 다른게시글을보고
if(myItem == null)을 추가하여 실행해봤지만 코드를 잘못짰는지 계속 덮어쓰여집니다
notifyDataSetChanged 는 단순히 리스트뷰를 갱신만 해주는 역할을 합니다. 새로운 데이터가 생기거나 삭제했거나 수정했을때 필요하겠지요.
어뎁터에서 getCount가 혹시 1인가요?
네 지금 myItem.add 하나가 전부입니다.
어뎁터 구현부를 보여주시면 될 것 같습니다.
**listAdapter.java입니다.

public class listAdapter extends BaseAdapter {
    private LayoutInflater mInflater;
    Context context;

    ArrayList<list_item> myItem;
    String title, name;
    TextView postTitle, postName;

    public listAdapter(Context context, ArrayList<list_item> myItem) {
        this.context = context;
        this.myItem = myItem;
    }

     @Override  public int getCount() {
        return this.myItem.size();
    }

    @Override
    public Object getItem(int position) {
        return myItem.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if (convertView == null) {
            convertView = LayoutInflater.from(context).inflate(R.layout.list_item, null);
            postTitle = (TextView)convertView.findViewById(R.id.postTitle);
            postName = (TextView)convertView.findViewById(R.id.postName);
        }
        postTitle.setText(myItem.get(position).getTitle());
        postName.setText(myItem.get(position).getName());
        return convertView;
    }
}

   **list_item(myItem).java입니다

public class list_item
{
    private String title,name,content;

    public String getTitle() {  return title;  }

    public String getName( ) { return name; }

    public void setTitle(String title) {  this.title = title;    }

    public void setName(String name) {  this.name = name;    }

    public list_item(String title, String name){
        this.title = title;
    this.name = name;
    }
}

** MainActivity.java입니다.

public class MainActivity extends AppCompatActivity {
    final Context context = this;
    ListView list1;
    Button write1;
    listAdapter adapter;
     ArrayList<list_item> myItem;
    String title, name, content;

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

        list1 = (ListView) findViewById(R.id.list1);
        myItem = new ArrayList<list_item>();

        adapter = new listAdapter(MainActivity.this,myItem);
        list1.setAdapter(adapter);

        try { //여기서부터 Intent한 값을 받아옵니다
            if (getIntent().hasExtra("json")) {

                JSONObject json = new JSONObject(getIntent().getStringExtra("json"));

                Iterator x = json.keys();
                JSONArray jsonArray = new JSONArray();

                while ( x.hasNext()) {
                    String key = (String) x.next();
                    jsonArray.put(json.get(key));

                }

                    for (int i = 0; i < jsonArray.length(); i++) {
                        title = jsonArray.getString(i);
                        name = jsonArray.getString(i);
                    }

                myItem.add(new list_item("제목: " + title, "작성자: " + name));
                adapter.notifyDataSetChanged();
                }

        } catch (JSONException e) {
            e.printStackTrace();
        }

이상입니다.
어뎁터 구현부에서는 이상이 없네요.
구현 방식이 잘못된것 같습니다. 글로 쓰자니 복잡한데 우선 문제가
onCreate에서 추가하는 부분이 있으면 안되구요.
작성화면을 갔다가 돌아올때 어떻게 돌아오나요?
MainActivity가 여러개 쌓여있을꺼 같네요..
작성화면(B)에서 서버에 데이터를 보내고 보낸값을 받아 읽기화면(C)으로 데이터를 Intent합니다.

C에서는 그값을 메인화면(A)로 intent하고 위에 코딩처럼 try부분에서받아 listview에 추가하는데,

 A게시글을 작성하고 새로운 B라는 게시글을 작성하면 A게시글위에 B게시글이 작성됩니다...
작성화면으로 갔다가 다시 메인화면을 Intent 하더라도 기본으로 이전 화면을 뛰우는게 아니고 새로운 메인화면을 생성하여 보여줍니다.
다음 2가지 방법 가지고 구현해볼수 있겠네요. ^^

launchMode : https://blog.naver.com/david_shkim/221299344814
startActivityForResult : https://blog.naver.com/chaizdaiiz/221387629514
답변감사합니다!
첨부해주신 링크 참조하여 다시해보겠습니다 ㅎㅎ
0 추천
리스트뷰에 데이터를 추가해야할때 A액티비티로 되돌아가서 다시 작성후 B액티비티로 넘겨주어 리스트를 띄워주는 형태인가요? 만약 이런형태가 맞다면 B액티비티에있는 리스트객체인 myItem은 작성을 위해 A로 돌아가는 면 사라지니 당연히 이전값이 없어지고 새로운 데이터만 띄워지겠지요? 값을 저장하여 여러 데이터를 쌓아서 리스트뷰에 표현하시려면 DB를 쓰셔야 할것같습니다.
익명사용자 님이 2019년 1월 9일 답변
처음에 글작성을위해 B에서 A로갑니다 A에서 서버에 데이터를보내고 서버에서 보낸 B에서 값을받아 C로넘겨주고 C에서 A로 다시 값을 넘겨주면서 A는 받은jsonObject를 추출하여 해당 textview에 넣고 listview에 추가하고있습니다
그럼 jsonObject에는 이전 작성했던 데이터들이 다 정상적으로 넘어오는 상태이고, 리스트뷰에만 안띄워지는것인가요?
listview에또한 정보는 잘받아서 출력은됩니다만 A라는 게시글을작성하고

B라는 새로운 게시글을 작성하면 A게시글위에 B게시글이 덮여쓰여집니다.
...