ListView-BaseAdapter

1、 首先需要有兩個佈局文件,一個是主佈局,用來放ListView,另一個用來作爲ListView的Item中的佈局。
vitem.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal">

    <ImageView
        android:layout_width="60dp"
        android:layout_height="60dp"
        android:id="@+id/imageView" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="New Text"
        android:id="@+id/textView"
        android:paddingTop="20dp"
        android:paddingLeft="20dp"/>
</LinearLayout>

2、新建一個類MyClass來存放vitem佈局裏每個組件的內容

public class MyClass {
    String text;
    int image;
    public MyClass(String text,int image){
        this.text=text;
        this.image=image;
    }
}

3、在活動中把每個item中組件的內容存入一個List中,類型爲MyClass
MainActivity

public class MainActivity extends Activity {
    MyClass myClass;
    ListView listView;

    List<MyClass> list;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        listView=(ListView)findViewById(R.id.listView);
        list=new ArrayList<>();
//這裏通過循環創建MyClass對象,每個對象存放每個item中組件內容,並添加到一個List中,注:這裏我的每個item內容都是相同
        for(int i=0;i<10;i++){
            myClass=new MyClass("text",R.drawable.youtube);
            list.add(myClass);
        }

        listView.setAdapter(new MyAdapter(MainActivity.this,list));

    }
}

4.、新建一個類繼承BaseAdapter,並重寫裏面的getCount、getItem、getItemId、getView方法

public class MyAdapter extends BaseAdapter {
    private LayoutInflater inflater;
    private List<MyClass> list;

    public MyAdapter(Context context2,List<MyClass> list2){
        inflater=LayoutInflater.from(context2);
        this.list=list2;
    };
    @Override
    public int getCount() {
        return list.size();
    }

    @Override
    public Object getItem(int position) {
        return list.get(position);
    }

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
    //首先使用找到context加載其中的item的佈局,獲得一個View對象
        View view=inflater.inflate(R.layout.vitem,null);
    //獲得item佈局的View對象後就可以找到其中的組件
        ImageView image=(ImageView)view.findViewById(R.id.imageView);
        TextView text=(TextView)view.findViewById(R.id.textView);
    //ListView中存放了MyClass類實例,MyClass類實例中又有存放ImageView的id的變量和存放要付給TextView的字符串,position是一個下標
        MyClass myClass=list.get(position);
    //設置組件
        image.setImageResource(myClass.image);
        text.setText(myClass.text);
        return view;
    }
}

上面的getView方法是效率最低的寫法,getView還可以進行優化。
主要是對LayoutInflater.form(context).inflate(R.layout.item)
和findViewById的優化,第一次加載後存放到一個對象中,第二次直接使用該對象中存放的內容。

    public view getView(int position,View convertView,ViewGroup parent){
    View view;
    ViewHolder viewHolder;
    MyClass myClass=list.get(position);
    //判斷convertView是否爲空,當佈局第一次加載時爲空
    if(convertView==null){
    view=inflater.inflate(R.layout.vitem,null);
    viewHolder=new viewHolder();
    //第一次加載時把組件存放到ViewHolder中
    viewHolder.imageView=(ImageView)findViewById(R.id.imageView);
    viewHolder.textView=(TextView)findViewById(R.id.textView);
    view.setTag(viewHolder);
    }else{
        view=convertView;
        viewHolder=(ViewHolder)view.getTag();
    }
    viewHolder.imageView.setImageResource(myClass.image);
    viewHolder.textView.setText(myClass.text);
    return view;
}
Class ViewHolder(){
    ImageView imageView;
    TextView textView;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章