안드로이드 Custom ListView 만들기



Custom ListView는 기존 Listview처럼 문자열이나 이미지로만 표시하는게 아니라 원하는 레이아웃으로 항목에 표시하는 리스트 뷰입니다.


원하는 대로 항목을 표시하기 위해서 먼저  보여줄 Layout을 만듭니다.


그리고 만든 Layout을 항목에 보여주기 위해서 BaseAdapter를 상속받는 새로운 클래스를 정의하고 


다음 4개의 메소드를  Override해야 합니다.

public class CustomAdapter extends BaseAdapter {

@Override
public int getCount() {
return 0;
}

@Override
public Object getItem(int i) {
return null;
}

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

@Override
public View getView(int i, View view, ViewGroup viewGroup) {
return null;
}
}


getCount() - ListView에서 사용할 데이터의 총개수

getItem(int i) - 해당 i번째의 데이터 값

getItemId(int i) - 해당 i번째 id 값

getView(int i, View view, ViewGroup viewGroup) - 이 메소드에서 화면에 보여질 아이템을 구성합니다.


getView는 스마트폰에 화면이 보여질 때 화면 구성을 위해서 호출됩니다.


즉, 데이터가 100개 들어있어도 화면에 10개의 item만 보인다면 getView를 10번 호출하고 화면에 안보이다가


다시 보이게 되는 item이 생기면 다시 getView 를 호출합니다.


ListView는 View를 재활용 하기 때문에 최초 한번만 View값이 NULL이 들어오고 그 후에 호출 되면 이미 생성된 View가 들어오게 됩니다.


따라서 아래와 같이 View가 NULL일 때만 inflate를 해주면 됩니다.

public View getView(int i, View view, ViewGroup viewGroup) {
if (view == null) {
view = LayoutInflater.from(context).inflate(R.layout.list_item, null);
}
TextView txt1 = (TextView) view.findViewById(R.id.textName);
TextView txt2 = (TextView) view.findViewById(R.id.textTel);

txt1.setText(datalist.get(i).getName());
txt2.setText(datalist.get(i).getTell());


return view;
}


아래 예제는 Custom ListView를 사용한 예제입니다.

 

 





위 예제 코드는 gitHub에서 볼 수 있습니다.

https://github.com/Ywook/Android.practice6







안드로이드 스튜디오 ListView, Intent 사용하기


ListView는 안드로이드에서 지원하는 위젯 중 하나이고 세로로 스크롤되는 목록에 항목을 표시해주는 역할을 합니다.


ListView에 나타나는 아이템들은 ArrayAdapter를 통해서 추가할 수 있습니다.


간단한 데이터를 다룰때는 ArrayAdapter 클래스를 그대로 사용하기도 하지만 사용자가 원하는 형태로 효과를 주고 싶으면


ArrayAdapter클래스를 상속 받아서 사용해야합니다.



ListView를 사용하기 위해서 해당 activity의 res/layout파일에 ListView를 추가해줍니다.




그리고 activity파일로 돌아가서 ListView를 객체화 시킵니다.


ListView에 아이템을 추가하기 위해선 Adapter를 사용해야 합니다.


즉, ListView는 Adapter를 통해 데이터를 보여주는 형식의 뷰입니다.


ListView는 .setAdapter()를 사용해서 Adapter를 설정해줄 수 있습니다.


아래에서 ArrayAdapter의 생성자 호출에 사용된 인자는 다음과 같습니다. 

  • this - context (일반적으로 Adapter를 포함하는 Activity의 instance)
  • android.R.layout.simple_list_item_1 - 어떤 resource를 넣느냐에 따라서 ListView를 구성하는 item의 text 형태나 모양                 이 바뀌는데 안드로이드에서 지원하는 것을 사용
  • data - Adapter에 적용할 data

ArrayList<String> data = new ArrayList<String>();

ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,data);

Listview.setAdapter(adapter);


ListView의 아이템 클릭 이벤트는 .setOnItemClickListenr를 이용해서 설정할 수 있습니다.

listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {

}
});

그리고 ListView 아이템이 변경될 때 화면에 반영되기 위해서 adapter의 .notifyDataSetChanged()를 사용해야합니다.


adapter.notifyDataSetChanged();


안드로이드 어플리케이션을 구성하는 네 가지 요소에는 

  • Activity  - 화면을 구성하는 기본적인 컴포넌트
  • Service    - 화면 없이 백그라운드에서 동작하는 컴포넌트   
  • BroadCast Receiver - 문자메세지, 배터리 방전 등의 방송을 받는 수신자
  • Content Provider    - 응용 앱 사이에 데이터를 공유하기 위한 컴포넌트

가 있습니다.


Intent는 어플리케이션 구성 요소 간에 작업 수행을 위한 정보를 전달, 실행하는 역할을 합니다. 


예를 들면 액티비티간의 화면 전환이 있습니다.


Intent는 명시적 인텐트(Explicit Intent)암시적 인텐트(Implicit Intent)로 나눌 수 있습니다.


Intent에 클래스 객체나 컴포넌트 이름을 지정하여 호출할 대상을 알 수 있는 경우에는 명시적 인텐트


미리 정의된 액션(Action)을 지정해서 안드로이드에서 제공하는 기존 응용 프로그램을 실행하는 것을 암시적 인텐트라고 합니다.


액티비티의 호출간에 정보를 주고 받을 수 있는데 정보를 줄때는 putExtra를 사용하고 

Intent intent = new Intent(this, SecondActivity.class);

intent.putExtra("tag",et.getText().toString());

startActivity(intent);


정보를 받을때는 Get데이터타입Extra를 사용합니다.

Intent intent = getIntent();

String str = intent.getStringExtra("tag");


사용자 정의 객체도 주고 받을 수 있는데 이때는 Parcelable 타입을 사용하면 됩니다.



아래 앱은 ListView, Intent를 사용해서 만든 앱입니다.


 


 


 





전체 코드는 gitHub에서 볼 수 있습니다

https://github.com/Ywook/Android.practice5


안드로이드 스튜디오 Fragment, AlertDialog, Snackbar 사용하기



Fragment란?

아래 사이트에 잘 나와있습니다.

- https://developer.android.com/guide/components/fragments.html?hl=ko#Design



public class Fragment1 extends Fragment {

@Nullable

@Override


public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

this.inflater = inflater;

v = inflater.inflate(R.layout.fragment1, container, false );

return v;

}


Fragment를 extends 하고 Fragment에 붙일 layout을 작성하고 inflate를 해줍니다.


그리고 Fragment를 붙이고 싶은 Activity의 layout에 아래 코드를 추가합니다.


<fragment

    android:id="@+id/fragment"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:name="com.examples.androidpractice4_1.Fragment1"

/>


 name에는 들어가는 Activity에 들어가는 Fragment의 위치를 작성해줍니다.




AlertDialog는 안드로이드의 대화상자를 말합니다.


기본적인 형태의 AlertDialog는 Activity 코드 작성만을 통해 사용할 수 있습니다.

AlertDialog.Builder dialog = new AlertDialog.Builder(this);

dialog.setTitle("제목")
.setMessage("내용")
.setNegativeButton("닫기", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {

}
})
.setPositiveButton("확인", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {

}
})
.show();

setTitle은 제목 설정, setMessage는 내용설정 

setNegativeButton은 왼쪽에 있는 버튼

setPositiveButton은 오른쪽에 있는 버튼을 나타냅니다.

그리고 new OnClickListener 설정을 통해서 버튼 클릭 이벤트를 설정해 줄 수 있습니다.


AlertDialog의 모양을 원하는대로 바꾸고 싶다면 새로운 xml 파일을 만들고 .setView(int layoutResId)를 통해 붙여주면 됩니다.




Snackbar를 사용하기 위해서는 dependecy를 추가해야합니다.

File에서 ProjectStructure를 클릭해서 들어갑니다.


그리고 Dependencies를 클릭하고 + 버튼을 클릭합니다.


그리고 design을 입력하고 나오는 칸을 클릭하고 Ok를 누르면 Snackbar를 사용할 수 있습니다.


아래 앱은 Fragment, AlertDialog, Snackbar 사용해서 만든 앱입니다.


 

-

 

-

 


-


깃 허브 주소입니다.


https://github.com/Ywook/Android.practice4_1











+ Recent posts