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





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