안드로이드 개발 질문/답변
(글 수 45,052)
listview row안에 각각 프로그레스바를 넣었는데..
문제는 scroll을 하면 1번 position 에서 동작하는 프로그래스상태바가
갑자기 8번에서도 같이 동작 합니다.
대체 원인을 모르겠네요..
고수분들 부탁 드립니다.
아래 소스 내용과 소스 파일 첨부 하겠습니다.
package test.list;
import java.util.ArrayList;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
public class ListActivity extends Activity {
ArrayList<String> list = new ArrayList<String>();
ProgressBar prog;
TextView test;
boolean isRun=false;
ListView listview;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
listview = (ListView)findViewById(R.id.listview);
for(int i=0; i<10; i++){
String test = "no."+i;
list.add(test);
}
listview.setAdapter(new progAdapter());
listview.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View v, int position, long arg3) {
//Toast.makeText(getApplicationContext(), "Listview Position : " + position, Toast.LENGTH_SHORT).show();
switch(position){
case 0 :
Toast.makeText(getApplicationContext(), "0", Toast.LENGTH_SHORT).show();
prog = (ProgressBar)v.findViewById(R.id.prog);
prog.setProgress(0);
progRun();
break;
case 1 :
Toast.makeText(getApplicationContext(), "1", Toast.LENGTH_SHORT).show();
prog = (ProgressBar)v.findViewById(R.id.prog);
prog.setProgress(0);
progRun();
break;
case 2 :
Toast.makeText(getApplicationContext(), "2", Toast.LENGTH_SHORT).show();
prog = (ProgressBar)v.findViewById(R.id.prog);
prog.setProgress(0);
progRun();
break;
case 3 :
Toast.makeText(getApplicationContext(), "3", Toast.LENGTH_SHORT).show();
prog.setProgress(0);
progRun();
break;
}
}
});
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
}
@Override
protected void onRestart() {
// TODO Auto-generated method stub
super.onRestart();
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
}
public void progRun(){
Thread background=new Thread(new Runnable(){
public void run(){
try{
for(int i=0;i<20&&isRun;i++){
Thread.sleep(1000);
handler.sendMessage(handler.obtainMessage());
}
}catch(Throwable t){
}
}
});
isRun=true;
background.start();
}
Handler handler=new Handler(){
@Override
public void handleMessage(Message msg){
prog.incrementProgressBy(5);
}
};
class progAdapter extends BaseAdapter{
public progAdapter(){
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
//Toast.makeText(getApplicationContext(), "getItem : " + position, Toast.LENGTH_SHORT).show();
return list.get(position);
}
@Override
public long getItemId(int position) {
//Toast.makeText(getApplicationContext(), "getId : " + position, Toast.LENGTH_SHORT).show();
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final Context context = parent.getContext();
if(convertView == null){
LayoutInflater li = LayoutInflater.from(context);
convertView = li.inflate(R.layout.listview, parent, false);
}
TextView title = (TextView)convertView.findViewById(R.id.title);
title.setText("listtest click "+list.get(position));
return convertView;
}
}
protected void onStop() {
super.onStop();
isRun=false;
};
}
listview.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="80dip"
android:layout_margin="8dip">
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="18sp"
android:text="listtest click "/>
<ProgressBar
android:id="@+id/prog"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
style="?android:attr/progressBarStyleHorizontal"
/>
</LinearLayout>
main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<ListView
android:id="@+id/listview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:cacheColorHint="#00000000"
android:paddingRight="5px"
/>
</LinearLayout>
2011.10.04 18:19:57
포인트는 각각의 리스트 행들을 제어하기 위해서 프로그래스바 상태를 저장할 클래스를 만들어야 합니다.
지금 구현하신 코드를 보면 리스트 이름이랑 프로그래스바 게이지 두개가 필요하겠네요.
class progbarStatusClass {
String title = "";
int progressValue = 0;
}
그리고 getView() 안에 Progress바를 업데이트 하는 코드를 넣습니다.
prog = (ProgressBar)convertView.findViewById(R.id.prog);
prog.setProgress(list.get(position).progressValue);
그다음은 onItemClick 대신 listview의 클릭리스너를 이용하세요. onItemClick 이용시에는 position 값이 덧글에서 설명한 값 밖에 오지 않습니다.
listview.setOnItemClickListener();
이것들을 잘 조합하시면 됩니다. 코드도 첨부하니 정 모르시겠으면 열어보세요.




일본어로 된 사이트긴 한데 글은 볼 필요없이 그림만 한번 봐주세요.
http://d.hatena.ne.jp/hyoromo/touch/20090912/1252777077
즉 0~7행 까지 보인다면 포지션은 0~7까지 존재하고 스크롤을 조금 해서 0~8행까지 보인다면 포지션역시 0~8까지 존재합니다. 그런데 좀더 스크롤을 내리게 된다면 가장위의 포지션인 0번은 가장 아래에 위치하게 됩니다. 리스트별 로 다른 UI를 뿌리기 위해서는 getView() 함수 안에서 progress 작업을 하시면 됩니다.