marquee는 selected 또는 focused 되었을때 동작


<TextView

    android:id="@+id/longtextname"

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    android:layout_gravity="center"

    android:ellipsize="marquee"

    android:marqueeRepeatLimit="marquee_forever"

    android:scrollHorizontally="true"

    android:singleLine="true"

    android:gravity="center" />



TextView tv = (TextView)findViewById(R.id.longtextname);

tv.setText(str);

tv.setHorizontallyScrolling(true);

tv.setEllipsize(TruncateAt.MARQUEE);

tv.setSelected(true);

tv.setSingleLine(true);

tv.setMarqueeRepeatLimit(-1);



GridView or ListView

GridView 또는 ListView의 경우 첫 화면에 보이지 않던 아이템이 scroll 후 표시될 때 marquee가 동작하지 않는 문제가 있다.

예를 들어 Column 4의 Gridview에 12개의 아이템이 있다면

처음 1~4개의 아이템은 정상적으로  marquee가 동작하지만

스크롤 하여 5~8 아이템을 보면 marquee가 동작하지 않는다.

하지만 9~12 아이템은 또 정상적으로 marquee가 동작한다.ㅡㅡㅋ 

다시 스크롤을 올려 5~8 아이템을 보면 marquee가 동작한다.

왜 그런지는 나도 모른다.

다만 Marquee의 동작 조건이 focus 또는 selected인데 

View가 visibile 상태가 아니면 selected나 focus 처리를 하더라도 abort 된 것으로 보인다.

그래서 생각한 해결책이 delay를 주어 selected 처리를 하는 것이었고

정상적으로 모든 아이템이 marquee 된다.



private static class ViewHolder {

    ImageView mIcon;

    TextView mTitle;

    TextView mSubtitle;

}


private class MyListAdapter extends BaseAdapter {

    @Override

    public View getView(int position, View convertView, ViewGroup parent) {

        View view = mLayoutInflater.inflate(R.layout.my_list_layout_item, null);

        startMarquee(view);

        return view;

    }

}


public class MyAdapter extends CursorAdapter{

    @Override

    public void bindView(View view, Context context, Cursor cursor) {

        startMarquee(view);

    }

}


public void startMarquee(final View v){

    if(v == null){

        return;

    }

    v.postDelayed(new Runnable(){

        @Override

        public void run() {

            Object obj = v.getTag();

            if(obj != null && obj instanceof ViewHolder){

                final ViewHolder holder = (ViewHolder) obj;

                holder.mTitle.setHorizontallyScrolling(true);

                holder.mTitle.setEllipsize(TruncateAt.MARQUEE);

                holder.mTitle.setSelected(true);

                holder.mTitle.setSingleLine(true);

                holder.mTitle.setMarqueeRepeatLimit(-1);

            }

        }

    }, 300);

}



'programmer > android' 카테고리의 다른 글

Content Uri and File path  (0) 2013.07.25
Screen rotation  (0) 2013.07.24
view dimension(width/height) check before view is displayed  (0) 2013.07.18
custom spinner  (0) 2013.07.18
content observer  (0) 2013.07.17

+ Recent posts