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

리스트뷰 문의드립니다 ㅠㅠ 어려움!!

0 추천
public class MainActivity extends Activity {
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		test();
	}
	
	public void send(View v) {
		EditText editText = (EditText) findViewById(R.id.editText1);
		
		DataBase DB = new DataBase(this);
		DB.InsertRecord(editText.getText().toString());
		
		editText.setText("");
		test();
	}
	
	public void test() {
		ArrayList<MyData> data = new ArrayList<MyData>();
		
		DataBase DB = new DataBase(this);
    	DataBase.cursor = DB.QueryData();
    	
    	DataBase.cursor.moveToFirst();
		
		for(int i = 0; i < DataBase.cursor.getCount(); i++) {
			MyData myData;
			myData = new MyData(
					DataBase.cursor.getString(1),
					DataBase.cursor.getString(2),
					DataBase.cursor.getString(3));
			data.add(myData);
			DataBase.cursor.moveToNext();
		}
		
		MyDataAdapter Adapter =
				new MyDataAdapter(this, R.layout.list_item, data);
		
		ListView listView = (ListView) findViewById(R.id.listView);
		listView.setAdapter(Adapter);
		
		listView.setOnItemClickListener(new OnItemClickListener() {
	       	public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
	       		DataBase.cursor.moveToPosition(position);
	       		Log.d("msg : ", DataBase.cursor.getString(3));
	       	}
	    });
	}
}

class MyData {
	String day, time, memo;
	
	MyData(String aDay, String aTime, String aMemo) {
		day = aDay;
		time = aTime;
		memo = aMemo;
	}
}

class MyDataAdapter extends BaseAdapter {
	
	Context acontext;
	int alistItem;
	ArrayList<MyData> adata;
	
	LayoutInflater inflacter;
	
	public MyDataAdapter(Context context, int listItem, ArrayList<MyData> data) {
		acontext = context;
		adata = data;
		alistItem = listItem;
		
		inflacter = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
	}

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

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

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

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		if (convertView == null) {
			convertView = inflacter.inflate(alistItem, parent, false);
		}
		TextView day = (TextView) convertView.findViewById(R.id.textView1);
		day.setText(adata.get(position).day);
		TextView time = (TextView) convertView.findViewById(R.id.textView2);
		time.setText(adata.get(position).time);
		TextView memo = (TextView) convertView.findViewById(R.id.textView3);
		memo.setText(adata.get(position).memo);
		
		final Button btn = (Button) convertView.findViewById(R.id.button1);
		btn.setOnClickListener(new Button.OnClickListener() {
			public void onClick(View v) {
				btn.setVisibility(View.INVISIBLE);
			}
		});
		
		return convertView;
	}
	
}

그림에서처럼

2번에 있는 버튼을 누르면 버튼이 없어집니다.

그리고 리스트뷰를 내려보면 11번에 있는 버튼도 없어져있네요????????

포지션값 때문에 그런거 같긴 한데...

해결법을 모르겠네요 ㅠ 고수님들 도와주세요!!

 

** 내장 DB 연동시켜서 내장 DB에 있는 걸 커스텀 어뎁터로 불러온 상태입니다.

Android초보개발자 (1,230 포인트) 님이 2015년 6월 16일 질문

2개의 답변

+1 추천
convertView는 항상 내부에서 재활용 되어서,

위에서 사용된게 스크롤 되면 아래쪽에 재사용됩니다.

따라서 invisible만 할게 아니라,

그 반대의 경우는 각 convertView로딩할 때 상태값을 관리/확인 해서 항상 명시적으로 visible 해야합니다.

 

어댑터 공부 다시 하세요. 깊게해야됩니다.
익명사용자 님이 2015년 6월 17일 답변
0 추천

이건 답이라기보단 힌트일듯 한데요

버튼의 onClick이 한번 눌렀을때 몇 번 발생하는지 살펴보세요

btn.setVisibility(View.INVISIBLE); <-- 여기다 breakpoint 걸고 디버깅 해보시면 쉽게 알 수 있을 것같습니다.

그리고 아래 코드에서

final Button btn = (Button) convertView.findViewById(R.id.button1);

        btn.setOnClickListener(new Button.OnClickListener() {
            public void onClick(View v) {
                btn.setVisibility(View.INVISIBLE);
            }
        });
 
final이게 아무래도 걸리는데요 ...
이상합니다. final을 지워보시는 것도..
컴러기 (22,230 포인트) 님이 2015년 6월 17일 답변
...