안드로이드에서 자주 사용하는 기법인 ListView에 동적으로 아이템을 추가시 새로추가된 아이템으로 스크롤이 이동이 되지 않는 현상에 대해서 간단하게 알아보겠습니다.

일단 간단한 상황을 예를 들어서 풀어보도록 하겠습니다.

상황 : 현재의 Activity는 ListView와 EditText로 구성이 되어있고 EditText에 내용을 입력하고 Enter키를 입력시 ListView에 동적으로 추가된다.

위의 상황을 코드로 표현을 해보겠습니다.

01 public class TranscriptDemo extends ListActivity implements OnKeyListener {
02     private ArrayAdapter<STRING> adapter;
03     private ArrayList<STRING> list = new ArrayList<STRING>();
04     private EditText editText;
05        
06     public void onCreate(Bundle bundle){
07         super.onCreate(bundle);
08         setContentView(R.layout.transcript);
09           
10         editText = (EditText)findViewById(R.id.EditText01);
11         editText.setOnKeyListener(this);
12         adapter = new ArrayAdapter<STRING>(this, android.R.layout.simple_list_item_1, list);
13         setListAdapter(adapter);
14     }
15   
16     @Override
17     public boolean onKey(View v, int keyCode, KeyEvent event) {
18         if (event.getAction() == KeyEvent.ACTION_DOWN) {
19             switch (keyCode) {
20                 case KeyEvent.KEYCODE_ENTER:
21                     setText();
22                     return true;
23             }
24         }
25         return false;
26     }
27       
28     private void setText() { 
29         adapter.add(editText.getText().toString());
30         editText.setText(null);
31     }
32 }
33 </STRING></STRING></STRING></STRING>

코드를 정상적으로 작성을 하였으면 밑에 화면과 같이 정상적으로 동작이 됩니다.



하지만 여기서 문제가 있는게 위와같이 게속 아이템을 등록을 한다면 스크롤바가 생기게 될텐데 그 포커스가 밑에 그림과 같이 처음의 포커스에 맞춰져 잇다는점 입니다.



이 문제를 해결하기 위해서 저는 예전에 새로운 아이템을 추가할 시에 마지막 아이템을 선택 하기 조건을 줬습니다.

1 getListView().setSelection(list.size() - 1);

하지만 안드로이드 내에서 ListView에 제공하는 속성인 android:transcriptMode를 이용하여 더욱더 간단하게 처리를 할수 있습니다.
android:transcriptMode에 대해서 알아보자.

android:transcriptMode ?


Sets the transcript mode for the list. In transcript mode, the list scrolls to the bottom to make new items visible when they are added.

Must be one of the following constant values.


 Constant  Value  Description
 disabled  0  Disables transcript mode. This is the default value.
 normal  1  The list will automatically scroll to the bottom when a data set change notification is received and only if the last item is already visible on screen.
 alwaysScroll  2  The list will automatically scroll to the bottom, no matter what items are currently visible.

위에 자료는 안드로이드 API에 있는 내용이다. 간단하게 설명을하자면
transcriptMode 속성은 3가지의 값을 정의해줄수 있고 각각의 설명은 아래와 같다.  

1. disabled : 스크롤이 되지 않음
2. nomal : 현재의 포커스에서 추가된만큼의 포커스가 이동
3. alwaysScroll : 마지막에 추가된곳으로 포커스 이동

제가 만들프로그램은 마지막에 추가된곳으로 포커스가 이동을 해야하기 때문에 alwaysScroll을 줘야한다.

1 getListView().setTranscriptMode(ListView.TRANSCRIPT_MODE_ALWAYS_SCROLL);

위와같이 Java단에서 설정을 해줘도 되고 xml에서 설정을 해줘도 된다.
설정이 올바르게 끝났으면 정상적으로 밑에 화면과 같이 작동을 할것이다.

+ Recent posts