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

DB값을 adapter 이용하여 listview 에 추가하는데 막히네요...

0 추천

infoFragment에서 추가버튼 클릭으로 inputFragment로 전환 후

inputFragment 에서 선택한 값을 infoFragment 에 뿌려주려 하고 있습니다

inputFragment에서 날짜와 거리는 무조건 입력되고 checkbox를 이용하여 3가지 리스트 중 선택된 값만

저장 버튼 클릭 시 insertColumn 으로 ListDB에 저장하고 infoFragment로 화면 전환하여 표시하게 하고 싶습니다

inputFragment

날짜  (무조건 저장) 거리  (무조건 저장)
체크박스  aaa  (체크 되면 1로저장)
체크박스  bbb  (체크 되지 않으면 0으로저장)
체크박스  ccc

일단 날짜와 거리는 무조건 입력되는 값이기에 adapter_info.xml에 TextView를 만들어 놓았으며

DB에서 읽어와 SetText하였고 aaa, bbb, ccc 항목은 DB에 1 값이 들어 있을 때만 TextView를

동적으로 생성하여 날짜와 거리 아래에 붙여 하나의 항목을 표시하고 싶습니다

근데 처음 aaa 체크 후 저장하면 1개가 잘 보여지나 

날짜거리

aaa


항목 추가를 위해 추가 버튼 클릭 후 bbb만 선택하여 저장 시 분명 bbb만 선택을 하였고 값도 bbb만 들어간 것을

확인하였음에도 첫번째 리스트에 bbb가 추가되어 보여집니다

다시 ccc만 추가를 하여도 bbb항목아래 ccc가 추가되고 마찬가지로 첫번째 리스트에까지 ccc가 추가되어 첫번째 항목이

3개로 표시되는 문제가 있습니다 3개가 첫번째 리스트에 모두 추가가 되고 난 이후엔 문제없이 선택 된 값만

리스트에 추가되어 표시를 하고 있습니다

날짜거리

aaa

bbb

날짜거리

bbb

어떻게 해줘야 선택된 값만 표시가 되는건지 도통 감이 잡히지를 않네요... addview 를 하는게 문제인것 같은데

아무리 검색을 해봐도 해결법을 찾지 못하겠습니다...

infoFragment.java

public class InfoFragment extends ListFragment {
	private Button m_btnAdd;
	private ListDbHelper		mListDbHelper;
	private ListDTO			mListDTO;
	private Cursor				mListCursor;
	private ListDataAdapter    mdAdapter;
	private static ArrayList<ListDTO> listArray;

	public static InfoFragment newInstance() {
		InfoFragment fragment = new InfoFragment(listArray);
		return fragment;
	}

	public InfoFragment(ArrayList<ListDTO> listArray) {
		this.listArray = listArray;
	}
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		View view = inflater.inflate(R.layout.fragment_info, 
                                                     container, false);

		m_btnAdd = (Button) view.findViewById(R.id.add);
		return view;
	}
	public void onActivityCreated(@Nullable Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onActivityCreated(savedInstanceState);

		mListDbHelper = new ListDbHelper(getActivity());
		mListDbHelper.open();
		listArray = new ArrayList<ListDTO>();
		getDbList();

		mdAdapter = new ListDataAdapter(getActivity(), listArray);
		setListAdapter(mdAdapter);

		m_btnAdd.setOnClickListener(new OnClickListener() {
			public void onClick(View v) {
				FragmentManager fragmentManager = getFragmentManager();
				fragmentManager.beginTransaction().replace(R.id.container, InputFragment.newInstance()).commit();
			}
		});
	}
	public void getDbList(){
		int cnt = 0;
		mListCursor = mListDbHelper.getAllColumns();
		while (mListCursor.moveToNext()) {
			mListDTO = new ListDTO(mListCursor.getString(mListCursor.getColumnIndex("listdate")),mListCursor.getInt(mListCursor.getColumnIndex("listdistance")),
					mListCursor.getInt(mListCursor.getColumnIndex("listaaa")),mListCursor.getInt(mListCursor.getColumnIndex("listbbb")),mListCursor.getInt(mListCursor.getColumnIndex("listccc")));
			cnt++;
			if (cnt > listArray.size())
				listArray.add(mListDTO);
		}
	}
}
ListDbHelper.java

public class ListDbHelper {
	private static SQLiteDatabase mDB;
	public long insertColumn(String listdate, int listdistance,
			int listaaa, int listbbb, int listccc) {
		ContentValues values = new ContentValues();
		values.put("listdate", listdate);
		values.put("listdistance", listdistance);
		values.put("listaaa", listaaa);
		values.put("listbbb", listbbb);
		values.put("listccc", listccc);
		return mDB.insert(TABLE_NAME, null, values);
	}
	public Cursor getAllColumns() {
		return mDB.query(TABLE_NAME, null, null, null, null, null, null);
	}
}
ListDTO.java

public class ListDTO {
	private String		listdate;
	private int		listdistance;
	private int 		listaaa;
	private int 		listbbb;
	private int 		listccc;
	public ListDTO(String listdate, int listdistance, int listaaa, int listbbb,
			int listccc) {
		super();
		this.listdate = listdate;
		this.listdistance = listdistance;
		this.listaaa = listaaa;
		this.listbbb = listbbb;
		this.listccc = listccc;
	}
	public String getListdate() {
		return listdate;
	}
                    .....
}
ListDataAdapter.java

public class ListDataAdapter extends ArrayAdapter<ListDTO> {
	private final LayoutInflater mInflater;
	public ListDataAdapter(Context context, ArrayList<ListDTO> array) {
		super(context, 0, array);
		String service = Context.LAYOUT_INFLATER_SERVICE;
		mInflater = (LayoutInflater) context.getSystemService(service);
	}
	public View getView(int position, View convertView, ViewGroup parent) {
		ViewHolder holder;
		if (convertView == null) {
			convertView = mInflater.inflate(R.layout.adapter_info, null);
			holder = new ViewHolder();
			holder.nTextDate = (TextView) convertView.findViewById(R.id.date);
			holder.nTextDistance = (TextView) convertView.findViewById(R.id.distance);
			holder.topLL = (LinearLayout) convertView.findViewById(R.id.linearlayout);
			convertView.setTag(holder);
		} else {
			holder = (ViewHolder) convertView.getTag();
		}
		final ListDbHelper mListDbHelper = new ListDbHelper(convertView.getContext());
		final ListDTO mListDTO = this.getItem(position);
		holder.nTextDate.setText(mListDTO.getListdate());
		holder.nTextDistance.setText(String.valueOf(mListDTO.getListdistance()));
		if(1 == mListDTO.getListaaa())
		{
			if(holder.aaa == null) {
				holder.aaa = new TextView(convertView.getContext());
				holder.aaa.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
				holder.aaa.setText("Textaaa");
				holder.topLL.addView(holder.aaa);
			}
		}
		if(1 == mListDTO.getListbbb())
		       { a 와 동일		}
                if(1 == mListDTO.getListccc())
                	{ a 와 동일		}
              	return convertView;
             	}
	private static class ViewHolder {
		public 	LinearLayout topLL;
		public 	TextView 		nTextDate;
		public 	TextView 		nTextDistance;
		public 	TextView 		aaa;
		public 	TextView 		bbb;
		public 	TextView 		ccc;
	}
}
기수님 (510 포인트) 님이 2014년 9월 15일 질문

1개의 답변

0 추천
 
채택된 답변
add로만 하지마시고 notifyDataChange 인가 하는 어댑터의 함수를 호출해보세요

https://github.com/susemi99/TestDBListView
쎄미 (162,410 포인트) 님이 2014년 9월 15일 답변
기수님님이 2014년 9월 16일 채택됨
textview addview 하기전에 holder.topLL.removeAllViews(); 추가하여 주니 잘 동작하네요^^
...