Scrollview 안에 Listview 가 있다면

listview 가 제대로 노출이 되지 않습니다.

Scrollview 안에 있는 뷰 높이를 정확히 알 수 없어서

생기는 문제 인데요 이걸 해결 하기 위해서는

listview 높이를 계산하고 높이를 설정해주는 방법입니다.


아래 소스를 이용하시면 listview 의 높이를 구해서

높이를 정의 해줄 수 있습니다.

Scrollview 에서 listview 모든 내용을 모두 노출 해줄 수 있습니다.


protected void onCreate(Bundle savedInstanceState) {
        ListView listview1 = (ListView) view.findViewById(R.id.list1);
        ArrayAdapter<data> adapter = new ArrayAdapter<data>(this, R.layout.simple_list_item, listData1);
        listview1.setAdapter(adapter);
 
        <data>setListViewHeightBasedOnChildren(listview1);
        
}
 
public static void setListViewHeightBasedOnChildren(ListView listView) {
        ListAdapter listAdapter = listView.getAdapter();
        if (listAdapter == null) {
            // pre-condition
            return;
        }
 
        int totalHeight = 0;
        for (int i = 0; i &lt; listAdapter.getCount(); i++) {
            View listItem = listAdapter.getView(i, null, listView);
            listItem.measure(0, 0);
            totalHeight += listItem.getMeasuredHeight();
        }
 
        ViewGroup.LayoutParams params = listView.getLayoutParams();
        params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
        listView.setLayoutParams(params);
        listView.requestLayout();
}

자바 예제이지만 이걸 이용하여 안드로이드에도 응용해서

안드로이드에 적용 가능합니다. 


안드로이드는 자바로 되어있기때문에 사용가능

하니 아래 소스를 이용하시고

사용 하시면 되겠습니다.


이름 오름차순 방법 내림차순 방법

숫자 오름차순 과 내림차순 방법입니다.


Collections.sort(users, new NameAscCompare());

      /**  
   * 이름 오름차순
   * @author falbb
   *
   */
 static class NameAscCompare implements Comparator<user> {
 
  /**
   * 오름차순(ASC)
   */
  @Override
  public int compare(User arg0, User arg1) {
   // TODO Auto-generated method stub
   return arg0.getName().compareTo(arg1.getName());
  }
 
 }
 
 /**
  * 이름 내림차순
  * @author falbb
  *
  */
 static class NameDescCompare implements Comparator<user> {
 
  /**
   * 내림차순(DESC)
   */
  @Override
  public int compare(User arg0, User arg1) {
   // TODO Auto-generated method stub
   return arg1.getName().compareTo(arg0.getName());
  }
 
 }
 
  /**
   * No 오름차순
   * @author falbb
   *
   */
 static class NoAscCompare implements Comparator<user> {
 
  /**
   * 오름차순(ASC)
   */
  @Override
  public int compare(User arg0, User arg1) {
   // TODO Auto-generated method stub
   return arg0.getNo() &lt; arg1.getNo() ? -1 : arg0.getNo() &gt; arg1.getNo() ? 1:0;
  }
 
 }
 
 /**
  * No 내림차순
  * @author falbb
  *
  */
 static class NoDescCompare implements Comparator<user> {
 
  /**
   * 내림차순(DESC)
   */
  @Override
  public int compare(User arg0, User arg1) {
   // TODO Auto-generated method stub
   return arg0.getNo() &gt; arg1.getNo() ? -1 : arg0.getNo() &lt; arg1.getNo() ? 1:0;
  }
 
 }

자바 그림 출력 해보는 예제 소스 입니다.

천천히 따라 해보시면 원하는 그림을

출력 해보실 수 가 있습니다.


주석도 달아 놨으니 천천히 따라 해보시고

주석을 보시면서 이해 해보세요 ^^


import java.awt.*;
import java.awt.event.*;


class GraphicsEx6 extends Frame {
 Image img = null;
 
 public GraphicsEx6(String title){
  super(title); // 조상인 Frame의 생성자 Frame (String title)을 호출한다
  addWindowListener(new WindowAdapter(){  //  추상 클래스인 windowAdapter 오버라딩한다
    public void windowClosing(WindowEvent we){ // 윈도우가 closing  되면 불려가게된다
     System.exit(0);  
    }
  });
 
 Toolkit tk = Toolkit.getDefaultToolkit(); // default의 toolkit 툴을 돌려준다
 img = tk.getImage("a.gif"); //지정된 파일로부터 픽셀 데이터를 취득하는 이미지를 돌려줍니다

 setBounds(100,100,500,500); // 100 , 100 위치에 width 500 height 500 크기로 보이게한다
 setVisible(true);
 }


 public static void  main(String args[]){
  new GraphicsEx6("GraphicseEx");
 }
 
 public void paint(Graphics g){
  if(img==null) return;
  int imgWidth = img.getWidth(this);  // 이미지 폭을 지정합니다
  int imgHeight = img.getHeight(this); //이미지 높이를 지정합니다.

  //이미지를 frame의 중앙에 출력한다
  g.drawImage(img,(getWidth()-imgWidth)/2,
   (getHeight()-imgHeight)/2, this);
 }
}


안드로이드 기기 디바이스에 실행 되고 있는
앱 정보를 뽑아오는 방법 입니다.
현재 실행 중인 앱 중에 해당 앱이 있는지
검사 할때나 여러 가지 방법으로 쓰일 수 있습니다.

현재 실행 되고 있는 앱 전체 정보를 가저 오는 방법과 첫번째로
실행 되고 있는 앱 정보를 가저 오는 방법으로 되어 있습니다.


1.
ActivityManager am = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
List<activitymanager.runningappprocessinfo> runningAppProcessInfoList = am.getRunningAppProcesses();
List<string> processNameList = new ArrayList<string>();
for (ActivityManager.RunningAppProcessInfo rapi : runningAppProcessInfoList) {
processNameList.add(rapi.processName);
}
StringBuilder processNamesBuilder = new StringBuilder();
for (String processName : processNameList) {
Log.e(" =========== ", " ========= " + processName);
}

2.
ActivityManager am = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
List<runningtaskinfo> Info = am.getRunningTasks(1);
ComponentName topActivity = Info.get(0).topActivity;
String topactivityname = topActivity.getPackageName();
</runningtaskinfo></string></string></activitymanager.runningappprocessinfo>


다이얼로그를 로딩화면으로 만들기 위한 방법입니다.
프로그레스바를 레이아웃에 넣어두면 화면 화면 마다
레이아웃이 복잡 해지거나 시간낭비가 될때가 있습니다.

dialog 로딩화면 즉 progressbar 로 하나 만들어두면 모든 화면에서
로딩화면을 보여주거나 안보이게 할 수가 있습니다.

아래는 리턴값으로 dialog 넘겨주고있어서 리턴값을 받아서
처리 할 수도있습니다.

public static Dialog setProgress(Activity mActivity){
               Dialog mDialog = new Dialog(mActivity , android.R.style.Theme_Dialog);
        mDialog.getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));
        mDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
        mDialog.setContentView(new ProgressBar(mActivity, null, android.R.attr.progressBarStyleSmall));
        mDialog.setCanceledOnTouchOutside(false);
        mDialog.setCancelable(false);
        mDialog.show();
        return mDialog;
    }



안드로이드 자바 디데이 계산 방법을 소개합니다.
안드로이드에서 자바로 디데이 계산 하기가 복잡하죠
켈린더로 -1을 해줘야 하고 등 해줘야 하는데
아래 메소드를 복사해서 사용 하시면 됩니다.
Dday( 날짜 ) 를 넣어 주시면 됩니다. 형식은 2014-08-20 이런식으로
되어있습니다. 만약 형식이 다르면 약간의 수정이 필요 합니다. ^^


public static long Dday(String mday) {
        if (mday == null )
            return 0;
        mday = mday.trim();
        int first = mday.indexOf("-");
        int last = mday.lastIndexOf("-");
        int year = Integer.parseInt(mday.substring(0 , first ));
        int month = Integer.parseInt(mday.substring(first + 1 , last ));
        int day = Integer.parseInt(mday.substring( last + 1 , mday.length()));

        GregorianCalendar cal = new GregorianCalendar();  
        long currentTime = cal.getTimeInMillis() / (1000*60*60*24);       
        cal.set(year,month - 1 , day);      
        long birthTime = cal.getTimeInMillis() / (1000*60*60*24);
        int interval = (int)( birthTime - currentTime );     

        return interval;        
    }

리스트뷰 안에서 혹은 헤더에 넣어둔 이미지뷰나 버튼에 온터치를 줘야 한다면
기본 리스트뷰로는 온터치에서 세로로 터치가 이루어지면 리스트뷰가
인터셉터를 하기때문에 온터치를 처리 할 수 없습니다.

리스트뷰 안에 온터치를 컨트롤 하기 위해서는 Custom listview 를 사용 해야 합니다.
listview 를 상속 받아 사용 해야 하는데 클레스를 하나 생성후 extend listview 해서
만들어 주면 됩니다.

아래 소스는 제가 임의로 onIntercepttouch를 컨트롤 하기 위해 만들었습니다.
TouchCheck 변수를 통해서 컨트롤를 하는데요 리스트뷰 안에 다른 뷰가
온터치가 발생 하게 되면 TouchCheck 를 false 로 바꿔주면서 리스트뷰가
인터셉터를 하는걸 막게 되는겁니다.
TouchCheck 변수를 변경하기 위하여 setTouch 라는 메소드를 임의로 생성 하였습니다.

사용 방법은
아래처럼 메인 클레스에서 생성 합니다.
CustomListview lsitview = (CustomListview )findViewById(R.id.list);
생성 후
lsitview.setTouch() 로 컨트롤 하게 됩니다.
아래에서 img 는 listivew 안에 온터치를 처리하게될 다른 뷰라고 생각하시면 됩니다.


  ImageView img = new ImageView(this);
        img.setOnTouchListener(m_onTouchListener);

    OnTouchListener m_onTouchListener = new OnTouchListener(){

        @Override
        public boolean onTouch(View p_v, MotionEvent p_event){
            
            switch (p_event.getAction()){
            case MotionEvent.ACTION_DOWN:{
                lsitview .setTouch(false); // 온터치가 이루어질때 false 로 바꿔준다.
                
            }
            case MotionEvent.ACTION_UP:{
                lsitview .setTouch(true); // 온터치에서 손을 땐경우 true 로 바꿔준다
                break;
            }

            case MotionEvent.ACTION_MOVE:{
                 //드레그 할때 처리
                break;
            }
            }
            return true;
        }
    };


public class CustomListview extends ListView {

    private boolean TouchCheck = true;
    
    public CustomListview(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
    
        if ( TouchCheck == false){
            super.onInterceptTouchEvent(ev);
            return false;
        }
        return super.onInterceptTouchEvent(ev);
    }
        
    public void setTouch(boolean check){
        TouchCheck = check ;
    }
            
}


+ Recent posts