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

listview에 adapter로 생성한 edittext에 입력한 값을 어떻게 가져와야 할까요?

0 추천
안녕하세요. 졸업프로젝트로 안드로이드 앱을 개발하고 있는 대학생입니다.

listview와 adapter를 이용해서 edittext를 한 10개정도 생성했는데요

이 edittext에 있는 값을 가져와서 서버로 업로드하려고 하는데 어떤식으로 가져와야 할지 모르겠습니다..

getCount가 리턴하는 객체 개수만큼 edittext를 생성하는거라 각각에 대한 값을 어떻게 적용시켜야할까요

그리고 현재 edittext에 키보드로 값을 입력하고 키보드를 내리면 값이 사라집니다..

제 생각으로는 getView함수가 다시 호출되서 초기화되는 거 같은데 이 부분을 어떻게 해결해야 할까요..

도움 주시면 정말 감사하겠습니다.
higuru (500 포인트) 님이 2015년 3월 15일 질문

1개의 답변

0 추천
흠 좀더 자세히 아니면

코드 첨부해주세요!

봐드릴게요. 제가 피곤한건지 모르겠는데 내용의 포인트가 뭔지 모르겠네요.
Djleeee (13,180 포인트) 님이 2015년 3월 16일 답변
package com.antonioleiva.wearcook;

import android.annotation.TargetApi;
import android.app.Activity;
import android.content.ClipData;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Build;
import android.provider.MediaStore;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.Toast;

import com.parse.ParseFile;
import com.parse.ParseObject;
import com.parse.ParseUser;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.ArrayList;


public class Post extends ActionBarActivity {

    private static final int REQ_CODE_SELECT_IMAGE =1;
    String name_Str;
    EditText post_title;

    ListView list;
    MyAdapter mAdapter;
    ArrayList<PostData> dataArr;

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

        name_Str="";

        dataArr = new ArrayList<PostData>(); //PostData객체를 저장하는 리스트를 만든다.
        mAdapter = new MyAdapter(this, R.layout.list_item, dataArr);//PostData를 생성하여 리스트와 XMl을 설정한다.

        //리스트를 얻어와서 어댑터를 설정한다.
        list = (ListView) findViewById(R.id.listView);
        list.setAdapter(mAdapter);
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_post, menu);
        return true;
    }
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    class MyAdapter extends BaseAdapter {
        Context context;
        int layoutId;

        LayoutInflater Inflater;
        //PostData 객체를 관리하는 ArrayList
        ArrayList<PostData> myDataArr;

        //생성자
        MyAdapter(Context _context, int _layoutId, ArrayList<PostData> _myDataArr){
            context = _context;
            layoutId = _layoutId;
            myDataArr = _myDataArr;
            Inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            //infate는 다른 layout의 xml안에 뷰를 추가적으로 사용하고 싶을 때 쓰는 것이다.
        }
        @Override //리스트의 갯수를 반환해주는 함수로 Arraylist의 사이즈를 반환해준다.
        public int getCount() {
            return myDataArr.size();
        }

        @Override // Adapter가 관리하는 Data의 Item 의 Position을 <객체> 형태로 얻어 온다.
        public PostData getItem(int position) {
            return myDataArr.get(position);
        }

        @Override //해당 Item를 나타내는 고유한정보로 position을 리턴해주면된다.
        public long getItemId(int position) {
            return position;
        }

        @Override ////매우중요! ListViewd에 뿌려질 한줄의 row를 설
        public View getView(int position, View convertView, ViewGroup parent) {
            Log.d("zz","getVieW!!!!!!!!!!!!!!!");
            int pos = position;

            if (convertView == null)  {
                convertView = Inflater.inflate(layoutId, parent, false);

            }

            ImageView post_img = (ImageView)convertView.findViewById(R.id.post_img);
            EditText post_title=(EditText)convertView.findViewById(R.id.post_title);
            EditText post_content=(EditText)convertView.findViewById(R.id.post_content);

            post_img.setImageBitmap(myDataArr.get(position).myImg);

            return convertView;
        }
    }
    //갤러리를 호출
    public void image_load(View view) {
        /*
        Intent intent = new Intent(Intent.ACTION_PICK);
        intent.setType(android.provider.MediaStore.Images.Media.CONTENT_TYPE);
        intent.setData(android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
        startActivityForResult(intent, REQ_CODE_SELECT_IMAGE);
        */
        Intent intent = new Intent();
        intent.setType("image/*");
        intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
        intent.setAction(Intent.ACTION_GET_CONTENT);
        startActivityForResult(Intent.createChooser(intent,"Select Picture"), REQ_CODE_SELECT_IMAGE);
    }
    //갤러리에서 이미지를 가져온다. image_load 함수에서 갤러리를 호출한 후 그 결과 작업에 따른 반환 값을 onActivityResult에서 가진다.
    @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {

        if (Build.VERSION.SDK_INT >= 18 && null == data.getData()) {
            ClipData clipdata = data.getClipData();
            for (int i=clipdata.getItemCount()-1; i>=0;i--)
            {
                try {
                    Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), clipdata.getItemAt(i).getUri());
                    dataArr.add(new PostData(bitmap,null,null));
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        mAdapter.notifyDataSetChanged(); //리스트뷰 업데이트
        Toast.makeText(getBaseContext(), "이미지 로드 완료 : " + resultCode, Toast.LENGTH_SHORT).show();
    }
    //이미지의 경로와 이름을 받아오는 함수
    public String getImageNameToUri(Uri data) {
        String[] proj = { MediaStore.Images.Media.DATA };
        Cursor cursor = managedQuery(data, proj, null, null, null);
        int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);

        cursor.moveToFirst();

        String imgPath = cursor.getString(column_index);
        String imgName = imgPath.substring(imgPath.lastIndexOf("/")+1);

        return imgName;
    }

    //parse에 이미지 업로드 시키기
    public void post(View view) {
        /*
        titleTxt=title.getText().toString();
        contentTxt=content.getText().toString();


        //이미지 파일을 byte형태로 변환
        ByteArrayOutputStream byteArray2 = new ByteArrayOutputStream();
        image_bitmap.compress(Bitmap.CompressFormat.PNG, 100, byteArray2); //png포맷의 품질을 100(%)으로 byteArray2에 저장.
        byte[] image_to_byte = byteArray2.toByteArray();

        ParseUser user= ParseUser.getCurrentUser();
        String userName=user.getUsername();

        ParseFile Imagefile = new ParseFile(name_Str, image_to_byte);       //(업로드할 파일,byte[])
        Imagefile.saveInBackground();
        ParseObject imageApplication = new ParseObject("post"); //parse에 만들어진 해당 클래스로 데이터를 업로드한다.

        imageApplication.put("title",titleTxt);
        imageApplication.put("content",contentTxt);
        imageApplication.put("FileName", Imagefile);
        imageApplication.put("userName",userName);
        //imageApplication.put("열이름",데이터 벨류");
        imageApplication.saveInBackground(); //Parse Cloud에 데이터를 저장하는 함수

        Toast.makeText(this, "이미지 업로드 완료", Toast.LENGTH_SHORT).show();
        finish();*/
    }
}
   


대략의 소스지만 이해가 되실지 모르겠어요...
대략 이해했는데, BaseAdapter extend 하는 class랑 PostData 클래스는 따로  java파일로 만드셔서 하세요. 그래야 보기 쉬우니 그나저나
PostData
public class PostData{
   생성자
   getter / setter
}
이부분은 어디있죠??
그리고 그 문제 정확히 한번만 더 설명해주세요. 지금 한 두시간정도 있을테니 댓글달아보시길!

제가 이해하기로는 님의 문제가
1) Edittext에 title과 content를 어떻게 불러오는지 모르겠다(값을)
2) 키보드 완료 누르거나 뒤로가기로 키보드 내리면 글이 사라진다?
이정도인것 같은데,

1)의 문제는 님께서 지금 머리가 아프셔서 정말 쉬운방법을 캐치못하시는거 같아요. 이거는 음 다시 설명해드리죠. 댓글 다시면
2)의 문제는 내리면 없어진다고 하셨는데, 제가 보기엔
  @Override ////매우중요! ListViewd에 뿌려질 한줄의 row를 설
        public View getView(int position, View convertView, ViewGroup parent) {
            Log.d("zz","getVieW!!!!!!!!!!!!!!!");
            int pos = position;

            if (convertView == null)  {
                convertView = Inflater.inflate(layoutId, parent, false);

            }

            ImageView post_img = (ImageView)convertView.findViewById(R.id.post_img);
            EditText post_title=(EditText)convertView.findViewById(R.id.post_title);
            EditText post_content=(EditText)convertView.findViewById(R.id.post_content);

            post_img.setImageBitmap(myDataArr.get(position).myImg);

            return convertView;
        }
여기서, convertView가 null이 아닌데 Edittext나 이런게 다시 초기화되고 있으니, 값이 사라지는것 같아요.
이어 적자면, (2)번 코드에서는 이렇게 바꿔보시길
위에서
아... 댓글로 코드 적을수가 없네요. 그냥 putzzang@hotmail.com 메일로 프로젝트 함 보내보세요. 제 컴터에서도 작동될수있도록 서버 그대로 냅두시고, 기존 있던거에서 edittext부분 확인하던가 해서 알려드릴게요.
메일 드렸습니다.. 도움주시면 정말 감사드리겠습니다 ㅠㅠ
...