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

커스텀 리스트뷰에 값이 들어가질 않아요

0 추천
package com.example.ccc;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.Window;
import android.widget.ListView;
import android.widget.TextView;

public class MainActivity extends Activity {
 
 private ListView listview; // 리스트뷰 선언
 DataAdapter adapter;  // 데이터를 연결할 Adapter;
 ArrayList<CData> alist; // 데이터를 담을 자료구조
 String mdate, mtime;
@Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  requestWindowFeature(Window.FEATURE_NO_TITLE);  // 상단타이틀 없앤다.
  setContentView(R.layout.activity_main);
  
  
  
  listview = (ListView) findViewById(R.id.listView1); // 사용하게 될 리스트뷰 연결 
  alist = new ArrayList<CData>();  // 객체생성
  adapter = new DataAdapter(this, alist); //
  listview.setAdapter(adapter);
  
 // adapter.add(new CData(getApplicationContext(), "ksj", "33", R.drawable.a));  // adapter를 이용하여 Arraylist로 저장 
 }

public void onClick(View v) {
  
  switch(v.getId()){
  case R.id.button1 :
   
   getTiming();
   getDate();
   adapter.add(new CData(getApplicationContext(), mdate, mtime, R.drawable.a));
  }
 }
 
 public void getDate() {
  Log.d("tag", "get current date !!!");
        Calendar calendar = Calendar.getInstance();
  SimpleDateFormat formater = new SimpleDateFormat("yyyy.MM.dd");
  Date current = new Date();     
  String mdate = formater.format(current);   
  System.out.println(formater.format(calendar.getTime()));
  TextView Temp = (TextView)findViewById(R.id.today);
  Temp.setText(mdate);
  Log.d("date get", mdate);
 }
 
 public void getTiming() {
  Log.d("tag", "get current time !!!");
        Calendar calendar = Calendar.getInstance();
  SimpleDateFormat formater = new SimpleDateFormat("HH:mm:ss");
  Date current = new Date();     
  String mtime = formater.format(current);   
  System.out.println(formater.format(calendar.getTime()));
  TextView Temp = (TextView)findViewById(R.id.sigan);
  Temp.setText(mtime);
  Log.d("date get", mtime);
 } 
}

 

 

 

 

커스텀 리스트뷰 구현중인데요

버튼을 클릭하면 현재 시간과 날짜를 얻어옵니다.

그리고 리스트뷰에 뿌려줘야는데 값은 안나오고 리스트만 하나씩 늘어납니다.

 

이 뿌리는 작업이 되질 않습니다.ㅠㅠ

 

 

package com.example.ccc;

import java.util.ArrayList;
import android.content.Context;
import android.graphics.Color;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;

public class DataAdapter  extends ArrayAdapter<CData> {
 // 레이아웃 XML을 읽어들이기 위한 객체
 private LayoutInflater mInflater;

 public DataAdapter(Context context, ArrayList<CData> object) {

 // 상위 클래스의 초기화 과정
  // context, 0, 자료구조
  super(context, 0, object);
  mInflater = (LayoutInflater) context
    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
 }

 // 보여지는 스타일을 자신이 만든 xml로 보이기 위한 구문
 @Override
 public View getView(int position, View v, ViewGroup parent) {
  View view = null;

 // 현재 리스트의 하나의 항목에 보일 컨트롤 얻기 

 if (v == null) {
   // XML 레이아웃을 직접 읽어서 리스트뷰에 넣음
   view = mInflater.inflate(R.layout.myitem, null);
  } else {
   view = v;
  }

  // 자료를 받는다.
  final CData data = this.getItem(position);

  if (data != null) {
   // 화면 출력
   TextView tv = (TextView) view.findViewById(R.id.textView1);
   TextView tv2 = (TextView) view.findViewById(R.id.textView2);
   // 텍스트뷰1에 getLabel()을 출력 즉 첫번째 인수값
   tv.setText(data.getLabel());
   // 텍스트뷰2에 getData()을 출력 즉 두번째 인수값
   tv2.setText(data.getData());
   //tv2.setTextColor(Color.WHITE);

 ImageView iv = (ImageView) view.findViewById(R.id.imageView1); 

// 이미지뷰에 뿌려질 해당 이미지값을 연결 즉 세번째 인수값
   iv.setImageResource(data.getData2());
  } 

return view;
 }
}

  

그리워요 안드로메다 (250 포인트) 님이 2013년 6월 21일 질문
그리워요 안드로메다님이 2013년 6월 21일 수정

2개의 답변

0 추천
 
채택된 답변

adapter.add(new CData(getApplicationContext(), mdate, mtime, R.drawable.a));

위 코드에서 mdate, mtime 값이 비어있기 때문에 데이터가 찍히지 않는겁니다.

다음 부분을 수정하시기 바랍니다.

getDate() 메소드 내에 있는

// String mdate = formater.format(current); //주석처리

mdate = formater.format(current);

getTiming() 메소드 내에 있는

// String mtime = formater.format(current); // 주석처리

mtime = formater.format(current);

Gradler (109,780 포인트) 님이 2013년 6월 21일 답변
그리워요 안드로메다님이 2013년 6월 21일 채택됨
감사합니다. ^^ 대단하세요 ㅋㅋ
String mtime 하는것하고 mtime 그냥 주는것하고 틀린가요?
물론 제가 초보이긴 하지만 그냥 타입형으로 주는걸로 알았는데
잘못 알고있는거군요. 값이 비었다고 생각못한것이 버튼 밑에 텍스트뷰에는 현재시간과 날짜가 잘 나왔었어요
전역변수를 잡아놓고,
지역변수로 해당 값을 덮어버리셨네요?
해결은 하셨으니 이유를 알려드릴께요.

변수를 선언하는 방법과 변수가 유효한 범위에 대해서 아시면 이해가될겁니다. 코드상에서 문제가 되는 부분만 간단히 설명드리면

1. 클래스 단위의 변수는 클래스 내의 모든 메소드에서 사용이 가능하며 값이 공유가 됩니다.
2. 메소드 단위의 변수는 해당 메소드 내에서만 사용이 가능하며 다른 메소드에서 접근할수 없습니다.

어느 단위에 속하는 변수인지를 구분하는 기준은 변수명을 선언 하는 곳이 어디냐에 따라서 달라집니다.
선언이라 함은 "클래스형 변수명" 형태로 작성되는 것을 말합니다.

위에서 문제가 된것은 리스트 뷰에서 사용하는 값은 클래스 단위의 변수를 가져다 쓴 것인데, 메소드 에서는 자기 메소드 안에 새로 변수를 만들어 사용하고 그 변수에다가 값을 넣은겁니다.

당연히 클래스 단위 변수에는 값이 없게 되는거죠.
매우 감사합니다.^^ 후후후 큰 도움이 되네여
0 추천
꼭 밖에 있는 값을 가져가셔서 리스트 뷰 안에 출력하셔야하나요 ?

지금 현재 ㅅㅣ간날짜만 출력하실꺼면, adapter 내부에서는도 현재시간과 날짜를 출력하시는게 제일 간단할 듯합니다만..^^* 꼭 밖에 값을 가지고 adapter 내부에 출력하셔야 한다면, 밖에서  arraylist로 담아서 adapter에 list.get하시는게 더 빠를 것 같구요^^

도움이 되시길 바랍니다!
안드로메다개발자 (8,830 포인트) 님이 2013년 6월 21일 답변
답변 감사드립니다. ^^;;
...