Android
목록보기
수색…
소개
ListView는 배열 또는 데이터베이스와 같은 데이터 소스의 여러 항목을 그룹화하고 스크롤 가능 목록에 표시하는 뷰 그룹입니다. 데이터는 Adapter 클래스를 사용하여 listview에 바인딩됩니다.
비고
ListView
는 스크롤 가능한 항목의 목록을 표시하는보기 그룹입니다.
목록 항목은 배열 또는 데이터베이스 쿼리와 같은 소스에서 컨텐트를 가져오고 각 항목 결과를 목록에있는보기로 변환하는 Adapter
를 사용하여 목록에 자동으로 삽입됩니다.
레이아웃의 내용이 동적이거나 미리 결정되지 않은 경우, 런타임에 View로 레이아웃을 채우기 위해 AdapterView
를 서브 클래스하는 레이아웃을 사용할 수 있습니다. AdapterView
클래스의 서브 클래스는, Adapter
를 사용해 레이아웃에 데이터를 바인드합니다.
ListView
를 사용하기 전에 RecyclerView
예제도 확인해야합니다.
CursorAdapter를 사용한 필터링
// Get the reference to your ListView
ListView listResults = (ListView) findViewById(R.id.listResults);
// Set its adapter
listResults.setAdapter(adapter);
// Enable filtering in ListView
listResults.setTextFilterEnabled(true);
// Prepare your adapter for filtering
adapter.setFilterQueryProvider(new FilterQueryProvider() {
@Override
public Cursor runQuery(CharSequence constraint) {
// in real life, do something more secure than concatenation
// but it will depend on your schema
// This is the query that will run on filtering
String query = "SELECT _ID as _id, name FROM MYTABLE "
+ "where name like '%" + constraint + "%' "
+ "ORDER BY NAME ASC";
return db.rawQuery(query, null);
}
});
사용자가 EditText
입력 할 때마다 쿼리가 실행 EditText
가정 해 보겠습니다.
EditText queryText = (EditText) findViewById(R.id.textQuery);
queryText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(final CharSequence s, final int start, final int count, final int after) {
}
@Override
public void onTextChanged(final CharSequence s, final int start, final int before, final int count) {
// This is the filter in action
adapter.getFilter().filter(s.toString());
// Don't forget to notify the adapter
adapter.notifyDataSetChanged();
}
@Override
public void afterTextChanged(final Editable s) {
}
});
사용자 정의 ArrayAdapter
기본적 으로 ArrayAdapter 클래스는 각 항목의 toString()
을 호출하고 내용을 TextView에 배치하여 각 배열 항목에 대한보기를 만듭니다.
각 항목에 대한 복잡한보기를 만들려면 (예를 들어 각 배열 항목에 ImageView를 사용하려는 경우) ArrayAdapter 클래스를 확장하고 getView()
메서드를 재정 의하여 각 항목에 대해 원하는보기 유형을 반환합니다.
예 :
public class MyAdapter extends ArrayAdapter<YourClassData>{
private LayoutInflater inflater;
public MyAdapter (Context context, List<YourClassData> data){
super(context, 0, data);
inflater = LayoutInflater.from(context);
}
@Override
public long getItemId(int position)
{
//It is just an example
YourClassData data = (YourClassData) getItem(position);
return data.ID;
}
@Override
public View getView(int position, View view, ViewGroup parent)
{
ViewHolder viewHolder;
if (view == null) {
view = inflater.inflate(R.layout.custom_row_layout_design, null);
// Do some initialization
//Retrieve the view on the item layout and set the value.
viewHolder = new ViewHolder(view);
view.setTag(viewHolder);
}
else {
viewHolder = (ViewHolder) view.getTag();
}
//Retrieve your object
YourClassData data = (YourClassData) getItem(position);
viewHolder.txt.setTypeface(m_Font);
viewHolder.txt.setText(data.text);
viewHolder.img.setImageBitmap(BitmapFactory.decodeFile(data.imageAddr));
return view;
}
private class ViewHolder
{
private final TextView txt;
private final ImageView img;
private ViewHolder(View view)
{
txt = (TextView) view.findViewById(R.id.txt);
img = (ImageView) view.findViewById(R.id.img);
}
}
}
ArrayAdapter를 사용한 기본 ListView
기본적으로 ArrayAdapter
는 각 항목의 toString()
을 호출하고 내용을 TextView
에 배치하여 각 배열 항목에 대한보기를 만듭니다.
예:
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, myStringArray);
여기서 android.R.layout.simple_list_item_1
은 배열의 각 문자열에 대한 TextView
를 포함하는 레이아웃입니다.
그런 다음 ListView
에서 setAdapter()
를 호출하면 ListView
.
ListView listView = (ListView) findViewById(R.id.listview);
listView.setAdapter(adapter);
예를 들어, ImageViews와 같은 배열 표시를 위해 TextViews 이외의 것을 사용하거나 toString()
결과 이외의 일부 데이터가 뷰를 채우려면 getView(int, View, ViewGroup)
를 재정 의하여 원하는 유형의보기를 반환하십시오. 이 예제를 확인하십시오 .