codingeverybody / codingyahac

https://coding.yah.ac
292 stars 50 forks source link

[안드로이드] 커스텀 ListView 가 EditText일 때 값 받아오는 방법 #348

Open Diocto opened 6 years ago

Diocto commented 6 years ago

안녕하세요. 단어장 앱을 만들고 있는 diocto입니다.

현재 단어 추가 액티비티를 만들던 중에 문제가 생겨서 질문 드립니다.

커스텀 리스트 뷰를 EditText 두개의 조합으로 만들어서 입력한 값을 DB에 넣으려고 하는데, 어댑터를 구현해서 화면에 getView 메소드를 이용해서 뷰를 보여주는 걸로 알고있습니다. 또 어댑터 클래스는 실제 데이터를 List<Item> 형태로 가지고 있고 보통의 텍스트뷰 형태의 리스트 뷰인 경우 List<Item> 에서 값을 얻어오는 방식인 걸로 알고 있습니다. 그런데 저는 EditText를 사용해서 ListView를 만들었는데 이 경우 각 EditText에 사용자가 입력한 값을 어떻게 가져올수 있나요? 즉, 해당 EditText객체를 id 검색으로 찾아오면 되는 것이여서 ListViewActivity 쪽에서 adapter 멤버를 관리하면서 adapter.getView(int i, View convertView, ViewGroup parent) 를 호출하면 되지 않을까 싶었지만 인자로 View를 줘야 하는데 이 인자가 제가 원하는 값이고.. 검색도 해보고 고민도 해보고 코딩을 해봐도 null값이 나와서 질문드립니다.

ListView에 있는 EditText객체를 어떻게 얻어올 수 있나요?

아래는 어댑터와 리스트뷰 액티비티 코드입니다.


public class AddWGListViewAdpater extends BaseAdapter {
    private ArrayList<AddWGListViewItem> listView ;
    private Context context;
    final static int IS_CLICKED_ONCE = 0;
    final static int IS_NOT_CLICKED = 1;
    public AddWGListViewAdpater(Context context, ArrayList<AddWGListViewItem> listView) {
        this.listView = listView;
        this.context = context;
    }

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

    @Override
    public AddWGListViewItem getItem(int i) {
        return listView.get(i);
    }

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

    @Override
    public View getView(int i, View convertView, ViewGroup parent) {
        final int pos = i;
        final Context context = parent.getContext();

        if (convertView == null)
        {
            LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.word_add_listview_item,parent,false);

        }

        return convertView;
    }
    public  void addBottomEditText(View view){
        if(view == null)
        {
            Log.d("user","view is null");
            return;
        }
        else
        {
            Log.d("user",view.toString());
        }
        if(view.getTag() == null) {
            Log.d("user","view tag is null");
            view.setTag(IS_CLICKED_ONCE);
            addEditText();
            notifyDataSetChanged();
        }
    }
    public void addEditText()
    {
        AddWGListViewItem newItem = new AddWGListViewItem();
        listView.add(newItem);
    }
}
public class AddWordGruopActivity extends AppCompatActivity {
    Button cancelButton;
    Button addWGButton;
    AddWGListViewAdpater adapter;
    ListView listview;
    ArrayList<AddWGListViewItem> itemList = new ArrayList<>();

    public static int addNum = 0;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_add_word_gruop);

        listview = findViewById(R.id.addWordListView);
        adapter = new AddWGListViewAdpater(this,itemList);
        listview.setAdapter(adapter);

        cancelButton = findViewById(R.id.cancelAddButton);
        cancelButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                finish();
            }
        });

        addWGButton = findViewById(R.id.addWGToDBButton);

        for(int i = 0; i < 10 ;i ++)
        {
            adapter.addEditText();
        }
    }
    public void onclickedOnce(View view){
        Log.i("addLod","once Clicked!!!!!!");
        adapter.addBottomEditText(view);
    }

    public void onClickAddWGButton(View view)
    {
        Date date = new Date(System.currentTimeMillis());
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-mm-dd");
        String today = dateFormat.format(date);
        SQLiteDatabase db;
        try{
            db = openOrCreateDatabase("vocabularyDataBase",MODE_PRIVATE,null);
        } catch(Exception ex)
        {
            ex.printStackTrace();
            return;
        }
        String subSQL = "insert into word(value, meaning, correct_answer_num, incorrect_answer_num, group_name)";
        for (int i = 0; i < adapter.getCount(); i++)
        {
            String wordView = adapter.getItem(i).getWord();
            String meaingView = adapter.getItem(i).getWordsMeaning();

            try{
                    if(wordView != null && meaingView !=null)
                       db.execSQL(subSQL + "values ('" +wordView +"', '" + meaingView  +"', 0, 0, " + Integer.toString(addNum) +")");
                } catch(Exception ex)
                {
                    ex.printStackTrace();
                    return;
                }
        }
        String values[] = {Integer.toString(addNum++), today, "0"};
        try{
            db.execSQL("insert into word_group(group_name, registered_data, num_of_test) values(?, ?, ?)",values);
            Toast.makeText(this,"단어 추가가 완료되었습니다", Toast.LENGTH_LONG).show();
        }catch (Exception ex)
        {
            Log.d("sqlerror",ex.toString());
        }

        finish();
        return;
    }
}
Diocto commented 6 years ago

해결했습니다! Adapter 클래스에 EditText ArrayList를 만들고 View 생성시 ArrayList에 저장함으로써 얻을 수 있었습니다. 혹시 보편적인 다른 방법이 있다면 알려주시면 감사하겠습니다.