ListView+RecyclerView

来源:互联网 发布:大非农数据利空金银 编辑:程序博客网 时间:2024/05/05 05:41

先看API文档的结构,SimpleAdapter和ArrayAdapter都是BaseAdapter的子类。子类实现了抽象父类的方法,许多细节都被实现,构造函数和成员函数都被设定好。

ArrayAdapter和SimpleAdapter以及BaseAdapter都可以对getView方法进行优化。

ArrayAdapter可以指定泛型,通过实体类带入各种数据;

SimpleAdapter可以通过List里面装着HashMap的泛型,用HashMap的键值对带入数据。

BaseAdapter构造函数没有形参,随便重载。

参考文章
http://www.cnblogs.com/loulijun/archive/2011/12/27/2303488.html
http://www.cnblogs.com/loulijun/archive/2011/12/28/2305016.html
http://www.cnblogs.com/loulijun/archive/2011/12/26/2302287.html
http://www.pocketdigi.com/20101102/139.html


这篇文章主要顺序按照ArrayAdapter, SimpleAdapter以及BaseAdapter来讲,今后还需要补充关于SimpleCursorAdapter、recyclerview的内容。


1.ArrayAdapter

public class ArrayAdapter extends BaseAdapter

ArrayAdapter(Context context, int resource)ConstructorArrayAdapter(Context context, int resource, int textViewResourceId)ConstructorArrayAdapter(Context context, int resource, T[] objects)ConstructorArrayAdapter(Context context, int resource, int textViewResourceId, T[] objects)ConstructorArrayAdapter(Context context, int resource, List<T> objects)ConstructorArrayAdapter(Context context, int resource, int textViewResourceId, List<T> objects)Constructor

构造函数第二个参数是一个包含一个TextView的Layout的id,该layout必须含有TextView

目前使用较多的是第五个构造函数,第二个参数是The resource ID for a layout file containing a TextView to use when instantiating views.

就是说ArrayAdapter的getView方法里面会用这个layout xml文件去inflate一个ItemView出来,如果这个layout文件里面有ImageView,TextView,Button等一大堆其他的控件,使用第四个构造函数,指定你要的textViewResourceId即可。

如果你的ItemView全部不包含TextView的话(这种情况好像很少了),请使用BaseAdapter。

或者如果你想在getView里面返回一个自定义View,getView都是直接new CustomView的,不需要告诉Adapter这个Item的layout Id,请使用BaseAdapter

所以感觉ArrayAdapter就是帮助我们实现了BaseAdapter里面的四个抽象方法,置于它支持泛型这回事我暂时没想明白。


2.SimpleAdapter

public class SimpleAdapter extends BaseAdapter<span style="white-space:pre"></span>implements Filterable ThemedSpinnerAdapter

构造函数只有一个

SimpleAdapter(Context context, List<? extends Map<String, ?>> data, int resource, String[] from, int[] to)Constructor


3.BaseAdapter

BaseAdapterextends Objectimplements ListAdapter SpinnerAdapter

构造函数

BaseAdapter()

一个BaseAdapter的项目放上gitHub,根本不会去看的好吧。。

BaseAdapter里面就是使用ViewHolder装控件,用convertView缓存View这些小知识点了。

以上三个Adapter都实现了

From interface android.widget.Adapter
这个接口,这个接口里面有一个

public abstract View getView (int position, View convertView, ViewGroup parent)

Get a View that displays the data at the specified position in the data set. You can either create a View manually or inflate it from an XML layout file. When the View is inflated, the parent View (GridView, ListView...) will apply default layout parameters unless you use inflate(int, android.view.ViewGroup, boolean) to specify a root view and to prevent attachment to the root.

抽象方法,这三个Adapter都从Adapter这个接口实现了这个getView()方法,所以在写Adapter时可以自己重写getView方法。

以下后期还要继续改,随着java的理解深入,慢慢都会暴露的。

此外,关于这三种Adapter内部控件的事件相应,找到一些方法。

链接



4.看完了这三个立马有点想要研究这些类的父类或者接口了。。。害羞

ListAdapter,SpinnerAdapter是什么玩意

再往上还有Adapter这个接口,稍微看了下,这些父类或者接口的方法比较少,也没谁直接拿来用,暂时不看了吧。



5.关于往listView里面添加ContextMenu的问题

网上看到有人往listView里面添加ContextMenu,长按显示ContextMenu。因为ContextMenu和OptionMenu都不是写在xml布局文件里的,诡异的是这货是在监听器阶段添加的,我觉得还是有点不一样,需要注意。因为写到现在几乎都还处在绘制UI的阶段,还没有添加监听器。举个例子:下面代码是直接从别人那里拷来的,省时间,

出处。

package com.easyway.android.listview;import java.util.ArrayList;import java.util.HashMap;import android.app.Activity;import android.os.Bundle;import android.view.ContextMenu;import android.view.ContextMenu.ContextMenuInfo;import android.view.MenuItem;import android.view.View;import android.view.View.OnCreateContextMenuListener;import android.widget.AdapterView;import android.widget.AdapterView.OnItemClickListener;import android.widget.ListView;import android.widget.SimpleAdapter;/** * ListView和上下文菜单的使用 * @author longgangbai * */public class ListViewActivity extends Activity {    @Override        public void onCreate(Bundle savedInstanceState) {            super.onCreate(savedInstanceState);            setContentView(R.layout.main);                        //绑定Layout里面的ListView            ListView list = (ListView) findViewById(R.id.ListView01);                        //生成动态数组,加入数据            ArrayList<HashMap<String, Object>> listItem = new ArrayList<HashMap<String, Object>>();            for(int i=0;i<10;i++)            {            HashMap<String, Object> map = new HashMap<String, Object>();            map.put("ItemImage", R.drawable.icon);//图像资源的ID            map.put("ItemTitle", "Level "+i);            map.put("ItemText", "Finished in 1 Min 54 Secs, 70 Moves! ");            listItem.add(map);            }                       //生成适配器的Item和动态数组对应的元素            SimpleAdapter listItemAdapter = new SimpleAdapter(this,listItem,//数据源              R.layout.listview,//ListItem的XML实现                //动态数组与ImageItem对应的子项                        new String[] {"ItemImage","ItemTitle", "ItemText"},                 //ImageItem的XML文件里面的一个ImageView,两个TextView ID                new int[] {R.id.ItemImage,R.id.ItemTitle,R.id.ItemText}            );                       //添加并且显示            list.setAdapter(listItemAdapter);                        //添加选中点击事件            list.setOnItemClickListener(new OnItemClickListener() {    @Override    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,    long arg3) {    setTitle("点击第"+arg2+"个项目");    }    });                      //添加上下文事件点击事件            list.setOnCreateContextMenuListener(new OnCreateContextMenuListener() {        @Override    public void onCreateContextMenu(ContextMenu menu, View v,ContextMenuInfo menuInfo) {    menu.setHeaderTitle("长按菜单-ContextMenu");       menu.add(0, 0, 0, "弹出长按菜单0");    menu.add(0, 1, 0, "弹出长按菜单1");       }    });         }        //长按菜单响应函数    @Override    public boolean onContextItemSelected(MenuItem item) {    setTitle("点击了长按菜单里面的第"+item.getItemId()+"个项目");     return super.onContextItemSelected(item);    }    }

可以看见,list作为一个listView对象,在被manipulate的时候还是会有一个position的参数的(知道你点击了哪个view),网上有人问如何取得这个view,查到了这样一个比较好的示例

简单来说就是先通过onCreateContextMenuListener创建一个ContextMenu对象,然后在

public boolean onContextItemSelected(Menuitem item)里面获得position,通过一个Toast的形式展示出来,我觉得应该也可以通过一个全局变量提取出来。

package com.pocketdigi.com; import java.util.ArrayList;  import android.app.Activity;import android.os.Bundle;import android.view.ContextMenu;import android.view.ContextMenu.ContextMenuInfo;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.widget.AdapterView;import android.widget.ArrayAdapter;import android.widget.ListView;import android.widget.Toast; public class main extends Activity { /** Called when the activity is first created. */ListView lv;ArrayAdapter<String> Adapter;ArrayList<String> arr=new ArrayList<String>();//定义菜单项protected static final int Menu_Item1=Menu.FIRST;    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);        lv=(ListView)findViewById(R.id.lv);        //添加ListView项    arr.add("123");    arr.add("234");    arr.add("345");    Adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, arr);    lv.setAdapter(Adapter);    lv.setOnCreateContextMenuListener(MenuLis);    }    ListView.OnCreateContextMenuListener MenuLis=new ListView.OnCreateContextMenuListener(){@Overridepublic void onCreateContextMenu(ContextMenu menu, View v,ContextMenuInfo menuInfo) {// TODO Auto-generated method stub//添加菜单项menu.add(Menu.NONE,Menu_Item1,0,"获取position");}        };    //选中菜单Item后触发    public boolean onContextItemSelected(MenuItem item){    //关键代码在这里        AdapterView.AdapterContextMenuInfo menuInfo;        menuInfo =(AdapterView.AdapterContextMenuInfo)item.getMenuInfo();        //输出position    Toast.makeText(main.this,String.valueOf(menuInfo.position), Toast.LENGTH_LONG).show();     return super.onContextItemSelected(item);         } }

http://developer.android.com/reference/android/widget/AdapterView.AdapterContextMenuInfo.html#targetView

提示一句,既然都是BasseAdapter,那么都可以通过重写getView()方法来量身定制return的view。



6.SimpleCursorAdapter知识补充

这部分待续

7.RecyclerVeiw

编写一个recyclerview需要:setLayoutManager、setAdapter还有addItemDecoration(optional)

主要关于setAdapter,需要准备一个extends Recyclerview.adapter的自定义adapter,给这个自定义adapter准备几个控件成员变量,textView什么的,注意这个adapter的构造函数需要一个View对象,一般就是item_detail。

然后是构造函数(提供数据list),oncreateViewHolder(inflate出来一个),onBindViewHolder,getItemCount方法这三个需要复写。



0 0