Android開發筆記之Adapter用法

Adapter的概念

適配器對象作爲視圖和該視圖的基礎數據之間的橋樑。適配器提供對數據項的訪問。適配器還負責對數據集中的每個項目進行視圖的視圖。

三個要素:

Data—連接—Adapter—連接—View

Adapter接口的繼承關係如下圖:


重寫 getView()方法的工作原理:
1.ListView 向 Adapter 對於List中的每一條數據索要一個View ,“give me a view” (getView)。
2.一個新的View 返回並且展示。 



但是出現下面的情況,系統內存無法滿足,*ListView裏面的條目過多,例如 ,100000萬條。其中只有可見的項目存在內存中,其他的在Recycler中。其實我的理解Recyler就是一個隊列,用來存儲不在屏幕範圍內的item,如果item滾出屏幕範圍,那麼就入隊,這裏的滾出是完全滾出,即邊界等也要完全滾出。如果新的item要滾進來,那麼android系統的framework就會查看Recyler是否含有可以重複使用的iew,如果有那麼就重新設置該iew 的數據源,然後顯示,即出隊。

常用的Adapter實現的類有:

(1)ArrayAdapter,支持泛型,可以展示一行字符串。

ArrayAdapterDemo:

使用系統自帶的android.R.layout.simple_list_item_1佈局文件。

MainActivity.java文件

package edu.jnu.adapterdemo;

import android.app.Activity;
import android.content.Context;
import android.net.Uri;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;
import android.widget.Toast;

import com.google.android.gms.appindexing.Action;
import com.google.android.gms.appindexing.AppIndex;
import com.google.android.gms.common.api.GoogleApiClient;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class MainActivity extends Activity {

    private ListView listView;
    private List<String> list;
    private ArrayAdapter arrayAdapter;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        listView = (ListView) findViewById(R.id.listView);

        list = new ArrayList<String>();

        for (int i = 1; i < 100; i++) {
            list.add("item" + i);
        }

        arrayAdapter = new ArrayAdapter(this,android.R.layout.simple_list_item_1,list);
        listView.setAdapter(arrayAdapter);

    }


}



(2).SimpleAdapter可以添加各種各樣的組件,靈活易用。


lv_layout.xml文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal" android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <ImageView
        android:id="@+id/img"
        android:layout_width="60dp"
        android:layout_height="60dp"
        android:layout_margin="5dp"

        />
    <LinearLayout

        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        >
        <TextView
            android:id="@+id/text1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="22sp"
            />
        <TextView
            android:id="@+id/text2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="12sp"/>

    </LinearLayout>


</LinearLayout>

MainActivity.java文件

package edu.jnu.adapterdemo;

import android.app.Activity;
import android.content.Context;
import android.net.Uri;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;
import android.widget.Toast;

import com.google.android.gms.appindexing.Action;
import com.google.android.gms.appindexing.AppIndex;
import com.google.android.gms.common.api.GoogleApiClient;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class MainActivity extends Activity implements AdapterView.OnItemClickListener {

    private ListView listView;
    private List<String> list;
    private SimpleAdapter simpleAdapter;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        listView = (ListView) findViewById(R.id.listView);

        list = new ArrayList<String>();

        for (int i = 1; i < 100; i++) {
            list.add("item" + i);
        }
        simpleAdapter = new SimpleAdapter(this,getdata(),R.layout.lv_layout,
                new String[]{"title","info","image"},
                new int[]{R.id.text1,R.id.text2,R.id.img});

        listView.setAdapter(simpleAdapter);
        listView.setOnItemClickListener(this);

    }

    private List<Map<String,Object>> getdata(){
        List<Map<String,Object>> list = new ArrayList<Map<String,Object>>();
        Map<String,Object> map = new HashMap<String,Object>();
        map.put("title","Title1");
        map.put("info","Info1");
        map.put("image",R.drawable.i1);
        list.add(map);
        map = new HashMap<String,Object>();
        map.put("title","Title2");
        map.put("info","Info2");
        map.put("image",R.drawable.i1);
        list.add(map);
        map = new HashMap<String,Object>();
        map.put("title","Title3");
        map.put("info","Info3");
        map.put("image",R.drawable.i1);
        list.add(map);



        return list;
    }


    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        Toast.makeText(this,"pos:"+position,Toast.LENGTH_SHORT).show();
    }
}




(3).BaseAdapter:可以對ListView的性能進行優化,通過重寫GetView方法。

採用ViewHolder模式。


lv_layout.xml文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal" android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <ImageView
        android:id="@+id/img"
        android:layout_width="60dp"
        android:layout_height="60dp"
        android:layout_margin="5dp"
        android:layout_weight="1"

        />
    <LinearLayout

        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:layout_weight="4"
        >
        <TextView
            android:id="@+id/title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="22sp"
            />
        <TextView
            android:id="@+id/info"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="12sp"/>

    </LinearLayout>
    <Button
        android:id="@+id/imgbtn"
        android:layout_width="60dp"
        android:layout_height="60dp"
        android:layout_margin="5dp"
        android:background="@drawable/selector"
        android:gravity="right"
        />


</LinearLayout>


ViewHolder.java文件
package edu.jnu.adapterdemo;

import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;

/**
 * Created by roly on 16/6/28.
 */
final public class ViewHolder {
    public ImageView imageView;
    public TextView title;
    public TextView info;
    public Button viewBtn;
}

MyAdapter.java文件

package edu.jnu.adapterdemo;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;

/**
 * Created by roly on 16/6/28.
 */
class MyAdapter extends BaseAdapter {


    private MainActivity mainActivity;
    private LayoutInflater layoutInflater;

    public MyAdapter(MainActivity mainActivity, Context context) {
        this.mainActivity = mainActivity;
        this.layoutInflater = LayoutInflater.from(context);
    }

    @Override
    public int getCount() {
        return mainActivity.mData.size();
    }

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

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder viewHolder = null;
        if (convertView == null) {
            viewHolder = new ViewHolder();

            convertView = layoutInflater.inflate(R.layout.lv_layout, null);
            viewHolder.imageView = (ImageView) convertView.findViewById(R.id.img);
            viewHolder.title = (TextView) convertView.findViewById(R.id.title);
            viewHolder.info = (TextView) convertView.findViewById(R.id.info);
            viewHolder.viewBtn = (Button) convertView.findViewById(R.id.imgbtn);

            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }

        viewHolder.imageView.setBackgroundResource((Integer) mainActivity.mData.get(position).get("image"));
        viewHolder.title.setText((String) mainActivity.mData.get(position).get("title"));
        viewHolder.info.setText((String) mainActivity.mData.get(position).get("info"));

        viewHolder.viewBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                mainActivity.showInfo();
            }
        });


        return convertView;
    }
}

MainActivity.java文件

package edu.jnu.adapterdemo;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.widget.ListView;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


public class MainActivity extends Activity {

    private ListView listView;

    List<Map<String,Object>> mData;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        listView = (ListView) findViewById(R.id.listView);

        mData = getdata();

        MyAdapter adapter = new MyAdapter(this, this);

        listView.setAdapter(adapter);

    }

    //數據源
    public List<Map<String,Object>> getdata(){

        List<Map<String,Object>> list = new ArrayList<Map<String,Object>>();

        Map<String,Object> map = new HashMap<String,Object>();
        map.put("title","Title1");
        map.put("info","Info1");
        map.put("image",R.drawable.i1);
        list.add(map);

        map = new HashMap<String,Object>();
        map.put("title","Title2");
        map.put("info","Info2");
        map.put("image",R.drawable.i2);
        list.add(map);

        map = new HashMap<String,Object>();
        map.put("title","Title3");
        map.put("info","Info3");
        map.put("image",R.drawable.i3);
        list.add(map);

        return list;
    }

    public void showInfo(){
        new AlertDialog.Builder(this)
                .setTitle("Alert")
                .setMessage("Introduce")
                .setPositiveButton("ok",new DialogInterface.OnClickListener(){

                    @Override
                    public void onClick(DialogInterface dialog, int which) {

                    }
                })
                .show();
    }

}





項目源碼:

http://download.csdn.net/detail/ymmqwe/9562334





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章