ListView, adapter 사용 요약
7639 단어 개인 요약
private ListView lvObj;
private String citys[]=new String[]{
" ",
" ",
" ",
" ",
" "
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_list_view_by_entity);
lvObj=(ListView)findViewById(R.id.listView);
ArrayAdapter dataAdpater=new ArrayAdapter(
this,
R.layout.item01,
R.id.city,citys);*/
ArrayAdapter dataAdpater=new ArrayAdapter(
this,
android.R.layout.simple_list_item_1,citys);
// ListView
lvObj.setAdapter(dataAdpater);
}
코드에서 보듯이 ArrayAdapter 대상을 실례화합니다. 그의 구조기는 세 가지 인자가 있습니다. 그것이 바로 context: 현재 창 대상(상하문), Resource: 각item마다 레이아웃 파일에 대한 색인 값, textViewResourceId: 각item마다 레이아웃 파일에 대응하는 TextView 구성 요소의 ID 값, objects: 그룹 데이터,안의 item 레이아웃은 보통android가 자체로 가지고 있는 레이아웃 R.layout입니다.item01, 실례적으로 데이터를 추가하면 어댑터 안에 데이터가 있습니다.ListView 클래스에 setAdapter 방법이 있고 어댑터를 추가하면 됩니다.단순 어댑터(Simple Adapter): Simple Adapter는 Array Adapter와 차이가 많지 않다. 단지Simple Adapter는 Array List로 데이터를 저장하고 데이터도 비교적 복잡하다. 예시 코드는 다음과 같다.private ListView lvObj;
private ArrayList> data=new ArrayList<>();
private int qqiconIds[]=new int[]{
R.drawable.orange_pic,
R.drawable.apple_pic,
R.drawable.banana_pic,
R.drawable.pineapple_pic
};
private String qqnames[]=new String[]{
" ",
" ",
" ",
" "
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_list_view_by_simple_adpater);
for(int index=0;index rowData=new HashMap<>();
rowData.put("qqicon",qqiconIds[index]);
rowData.put("qqname",qqnames[index]);
data.add(rowData);
}
SimpleAdapter simpleAdapterData=new SimpleAdapter(
this,
data,
R.layout.item02,
new String[]{"qqicon","qqname"},
new int[]{R.id.qqiconId,R.id.qqnameId}
);
lvObj=(ListView)findViewById(R.id.lvId);
lvObj.setAdapter(simpleAdapterData);
}
마찬가지로 우리도 하나의 Simple Adapter 대상을 실례화해야 한다. 그의 구조 방법에도 이렇게 몇 가지 파라미터가 있다. 한번 보자. context: 현재 창 대상(상하문), 데이터: 어댑터의 데이터 원본, Resource: 각각의 item는 레이아웃 파일에 대한 인덱스 값,from: 각각의 item 데이터는 맵 형식의 키 값에 대응한다.to: 모든 item은 레이아웃 파일의 구성 요소 ID 값에 대응합니다. (값의 순서는from과 일치해야 합니다.) 추가하면 setAdapter가 들어갈 수 있습니다.유니버설 어댑터(Base Adapter): 이 어댑터는 앞의 두 개와 다르다. 이것은 우리가 다시 써야 하는 어댑터이다. 사실, Simple Adapter는 Array Adapter에서 코드를 다시 쓴 것이다. 일반적인 상황에서 우리가 표시하고자 하는 데이터는 모두 비교적 복잡하고 다양하다. 예를 들어 텍스트, 이미지, 단추, 단일 선택, 복선 등이다.그래서 BaseAdapter는 우리가 비교적 많이 사용하는 어댑터입니다. 여기서 우리는 내부 클래스를 사용하고 BaseAdapter를 계승하여 그의 몇 가지 방법을 실현했습니다. 그 중에서 가장 중요한 것은 GetView 방법:public class ListViewByBaseAdpater extends ActionBarActivity {//사용자 정의 어댑터 class MyAdpater extends BaseAdapter {
ArrayList list=new ArrayList<>();
MyAdpater(ArrayList list) {
this.list = list;
}
// item
@Override
public int getCount() {
return list.size();
}
// item
@Override
public Object getItem(int position) {
return list.get(position);
}
// item
@Override
public long getItemId(int position) {
return position;
}
public void addRowData(QqinfoEntity entity)
{
list.add(entity);
notifyDataSetChanged();
}
// item
//convertView: item
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// , View
View view;
SurfaceHolder surfaceHolder;
if(convertView==null)
{
view= LayoutInflater.from(ListViewByBaseAdpater.this).inflate(R.layout.item02,null);
// item02
surfaceHolder=new SurfaceHolder();
surfaceHolder.qqIconIamgeViewObj=(ImageView)view.findViewById(R.id.qqiconId);
surfaceHolder.qqnameTvObj=(TextView)view.findViewById(R.id.qqnameId);
view.setTag(surfaceHolder);
}else{
view=convertView;
surfaceHolder=(SurfaceHolder)view.getTag();
}
QqinfoEntity entity=(QqinfoEntity)list.get(position);
// ImageView TextView
surfaceHolder.qqIconIamgeViewObj.setImageDrawable(getResources().getDrawable(entity.getQqiconId()));
surfaceHolder.qqnameTvObj.setText(entity.getQqname());
return view;
}
class SurfaceHolder
{
ImageView qqIconIamgeViewObj;
TextView qqnameTvObj;
}
}
ArrayList data=new ArrayList<>();
private ListView lvObj;
private Button addBtnObj;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_list_view_by_base_adpater);
initData();
lvObj=(ListView)findViewById(R.id.lvId);
addBtnObj=(Button)findViewById(R.id.btnaddId);
final MyAdpater myAdpaterObj=new MyAdpater(data);
lvObj.setAdapter(myAdpaterObj);
addBtnObj.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
QqinfoEntity entity=new QqinfoEntity();
//R.drawable.banana_pic entity.setQqiconId(R.drawable.banana_pic); entity.setQqname("바나나");myAdpaterObj.addRowData(entity); } });
}
//
public void initData()
{
int qqiconIds[]=new int[]{
R.drawable.orange_pic,
R.drawable.apple_pic
};
String qqnames[]=new String[]{
" ",
" "
};
for(int index=0;index
Adapter의 주요 기능 실현은 바로 getView 방법에서 볼 수 있다. 여기서 Adapter의 데이터를 어떻게 최적화하는가이다. 매번findviewbyid에 가지 않고 메모리를 소모한다. 데이터가 얕잡아 볼 수 없고 데이터의 양이 많으면 원활하게 돌아가지 못하기 때문에 최적화를 하는 것이 가장 좋다. 방법은convertView 캐시가 존재하는지 판단하는 것이다.findviewbyid를 채택하지 않고 존재하면 바로 부여하면 됩니다.그 중에서SurfaceHolder의 이런 종류는 사실 데이터의 저장을 편리하게 하기 위해 설정된 것이기 때문에 너도 직접 값을 부여할 수 있다.그리고 oncreate에 adapter를 추가하면 됩니다.이것들은 모두Activity에서 많이 사용되고 현재는 Fragment를 많이 사용하고 있다. 그러면 Fragment에서ListView를 어떻게 실현하는지는 이전의 방법으로도 실현할 수 있다. 다만 비교적 번거로울 뿐이다. 가장 간단한 것은 Fragment가ListFragment의 부류를 계승하도록 하는 것이다. 그러나 당신의 레이아웃 파일의listview에 있는 id는 반드시android:id/list,이것은android에서 규정한 것입니다. 구체적인 내용은 뒤에 있는 Fragment에서 말씀드리겠습니다.