最近很多小伙伴都在问AndroidArrayAdapter过滤问题和安卓arrayadapter这两个问题,那么本篇文章就来给大家详细解答一下,同时本文还将给你拓展13.Android-ListVie
最近很多小伙伴都在问Android ArrayAdapter过滤问题和安卓arrayadapter这两个问题,那么本篇文章就来给大家详细解答一下,同时本文还将给你拓展13.Android-ListView使用、BaseAdapter/ArrayAdapter/SimpleAdapter适配器使用、android Adapter 综合使用(ArrayAdapter、SimpleAdapter、Bas、Android ArrayAdapter和JSONArray、Android ArrayAdapter没有清除?等相关知识,下面开始了哦!
本文目录一览:- Android ArrayAdapter过滤问题(安卓arrayadapter)
- 13.Android-ListView使用、BaseAdapter/ArrayAdapter/SimpleAdapter适配器使用
- android Adapter 综合使用(ArrayAdapter、SimpleAdapter、Bas
- Android ArrayAdapter和JSONArray
- Android ArrayAdapter没有清除?
Android ArrayAdapter过滤问题(安卓arrayadapter)
因为我想使用“自定义列表适配器”,以便可以为列表设置样式,但“过滤器”功能无法正常工作.我可以使用基本的过滤功能,但是一旦过滤结果列表小于我开始过滤时显示的listItems数量,应用程序就会崩溃.
这段代码中还有第二个问题,我不确定是否相关,但是何时
明确();在publishResults中运行,然后应用程序也崩溃.
这是我正在使用的代码.
package com.android.example;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Filter;
import android.widget.TextView;
public class Customlistadapter extends ArrayAdapter<String> {
private Context mContext;
private String[] items;
private String[] filtered;
public Customlistadapter(Context context, int textViewResourceId, String[] items) {
super(context, textViewResourceId, items);
this.filtered = items;
this.items = filtered;
setNotifyOnChange(true);
mContext = context;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
if (v == null) {
LayoutInflater vi = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(R.layout.list_item, null);
}
String o = filtered[position];
if (o != null) {
TextView tt = (TextView) v.findViewById(R.id.tvViewRow);
if (tt != null) {
tt.setText("Name: "+o);
}
}
return v;
}
public void notifyDataSetInvalidated()
{
super.notifyDataSetInvalidated();
}
private Filter filter;
public Filter getFilter()
{
if(filter == null)
filter = new NameFilter();
return filter;
}
private class NameFilter extends Filter
{
@Override
protected FilterResults performFiltering(CharSequence constraint) {
// NOTE: this function is *always* called from a background thread, and
// not the UI thread.
constraint = constraint.toString().toLowerCase();
FilterResults result = new FilterResults();
if(constraint != null && constraint.toString().length() > 0)
{
ArrayList<String> filt = new ArrayList<String>();
List<String> lItems = new ArrayList<String>();
synchronized (items)
{
lItems = Arrays.asList(items);
//Collections.copy(lItems, Arrays.asList(items));
}
for(int i = 0, l = lItems.size(); i < l; i++)
{
String m = lItems.get(i);
if(m.toLowerCase().startsWith(constraint.toString()))
filt.add(m);
}
result.count = filt.size();
result.values = filt.toArray(new String[0]);
}
else
{
synchronized(items)
{
result.values = items;
result.count = Arrays.asList(items).size();
}
}
return result;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
// NOTE: this function is *always* called from the UI thread.
filtered = (String[])results.values;
notifyDataSetChanged();
clear();
notifyDataSetInvalidated();
}
}
}
解决方法:
我只是有同样的问题.只需将getCount()方法放在适配器类中即可.它应该返回过滤后的计数.像这样:
public int getCount() {
return mItems.size();
}
我过滤了mItems.
13.Android-ListView使用、BaseAdapter/ArrayAdapter/SimpleAdapter适配器使用
https://www.cnblogs.com/lifexy/archive/2020/02/04/12261805.html
1.ListView
ListView 是 Android 系统为我们提供的一种列表显示的一种控件,使用它可以用来显示我们常见的列表形式。继承自抽象类 AdapterView。继承图如下所示:
以微信好友列表为例:
里面的每个好友就是由一个个 item 组成的,而每个item都存在Adapter适配器类中(负责数据处理),然后通过ListView显示出来.
2.ListView显示原理
ListView显示数据原理实际就是MVC设计模式,如下图所示:
- Model(模型) – 数据集合,用来存储数据组织
- View(视图) – ListView,负责数据显示
- Controller(控制器) - 负责管理Model,并设置要显示的哪个具体数据.
3.使用BaseAdapter适配器
BaseAdapter比较简单,主要是通过继承此类来实现BaseAdapter的四个方法:
public int getCount();
//设置适配器中数据集的数据个数(ListView要显示的所有数据行);
public Object getItem(int position):
//获取数据集中与索引对应的数据项;
public long getItemId(int position);
//获取指定行对应的ID,一般都是直接返回position
public View getView(int position,View convertView,ViewGroup parent);
//获取每一行Item的显示内容。
// position:表示当前获取的Item是哪一行,开头从0开始
// convertView:旧视图复用,如果convertView不为空则表示可以用来复用.无需再次new一个view来使用.
// ViewGroup:只有LinearLayout或者RelativeLayout,如果viewGroup传入一个具体的对象,那么这个方法创建出来的view对象将作为这个viewGroup的childView来显示.
示例效果如下所示:
3.1写activity_main.xml
只是添加了一个ListView:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<ListView
android:id="@+id/lv_list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true" >
</ListView>
</RelativeLayout>
4.2 写item.xml
用来显示每一项item的view视图
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="5dp" >
<ImageView
android:id="@+id/imageView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_launcher" />
<TextView
android:id="@+id/tv_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/imageView1"
android:textSize="20sp"
android:textColor="#000000"
android:text="name" />
<TextView
android:id="@+id/tv_content"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/imageView1"
android:layout_alignLeft="@+id/tv_name"
android:text="content"
android:textColor="#88000000"
android:textSize="18sp" />
</RelativeLayout>
4.3 写MainActivity.java
package com.example.baseadaptertest;
import java.util.ArrayList;
import android.os.Bundle;
import android.app.Activity;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;
class Person {
String name;
String content;
public Person(String name,String content){
this.name = name;
this.content = content;
}
public String getName() {
return name;
}
public String getContent() {
return content;
}
}
public class MainActivity extends Activity {
ArrayList<Person> list;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//1.添加要显示的数据
list = new ArrayList<Person>();
list.add(new Person("张三","18岁 电话:158888666"));
list.add(new Person("李四","21岁 电话:158888777"));
list.add(new Person("王二","23岁 电话:158888877"));
list.add(new Person("孙武","25岁 电话:158888997"));
//2.设置Adapter
ListView lv_list = (ListView)findViewById(R.id.lv_list);
lv_list.setAdapter(new MyAdapter());
}
class MyAdapter extends BaseAdapter{
@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) {
View view = null;
//如果convertView为空则需要重新创建资源视图,如果不为空则表示可以用来复用.无需再次new一个view来使用.
if(convertView==null){
//通过R.layout.item 来创建一个item视图资源
view = LayoutInflater.from(getApplicationContext()).inflate(R.layout.item, null);
}else{
view = convertView;
}
//设置要显示的内容
TextView tv_name = (TextView)view.findViewById(R.id.tv_name);
TextView tv_content = (TextView)view.findViewById(R.id.tv_content);
tv_name.setText(list.get(position).getName());
tv_content.setText(list.get(position).getContent());
return view;
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
5.使用ArrayAdapter适配器
ArrayAdapter数组适配器用于绑定格式单一的数据,每个item只有一个数据需要被修改,数据源可以是集合或者数组
并且ArrayAdapter可以直接用来使用,无需再继承此类来实现.
ArrayAdapter的构造方法常用的有两种:
public ArrayAdapter(Context context, int resource, T[] objects);
//第一个参数 上下文
//第二个参数 包含且只有一个textview的布局文件id
//第三个参数 要展示的数据数组
public ArrayAdapter(Context context, int resource, int textViewResourceId, T[] objects);
//第一个参数 上下文
//第二个参数 可以包含很多内容(ImageView、textview等)的布局文件id
//第三个参数 指向resource中要显示数据的一个textView控件id
//第三个参数 要展示的数据数组
接下来,我们使用第二种构造方法来演示.
效果如下:
5.1 写activity_main.xml
只是添加了一个ListView,内容和BaseAdapter的activity_main.xml一致
5.2 写item.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:id="@+id/imageView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_launcher" />
<TextView
android:id="@+id/tv_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="name"
android:textColor="#AA000000"
android:textSize="40sp" />
</LinearLayout>
5.3 写MainActivity.java
package com.example.arrayadapter;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.ArrayAdapter;
import android.widget.ListView;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//定义一个String数组
String[] objects = {"李白","姜子牙","李元芳","高渐离","后羿","王昭君","虞姬"};
//初始化ArrayAdapter
ArrayAdapter<String> adapter = new ArrayAdapter<String>(getApplicationContext(), R.layout.item, R.id.tv_content, objects);
//设置ArrayAdapter
ListView lv_list = (ListView)findViewById(R.id.lv_list);
lv_list.setAdapter(adapter);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
6.使用SimpleAdapter适配器
SimpleAdapter适配器适用于拥有多数据的item. 每个item通过Map集合来实现.而Map里则可以包含多个数据.
SimpleAdapter的构造方法如下所示:
public SimpleAdapter(Context context, List<? extends Map<String, ?>> data,
int resource, String[] from, int[] to);
//context: 上下文,填入getApplicationContext()即可
//data:包含了Map(String ,Object)的List数组,每个Map表示每个item数据。
//resource:要加载item的xml布局文件Id
//from:string数组, 用来标识一个item需要设置哪些key.而key对应的value则是要显示的数据
//to:int数组,填入item xml布局文件里的要更改的控件内容ID号 ,用来对应from中的key值,表示设置的key值最终是更改哪些控件内容
效果如下:
6.1 写activity_main.xml
只是添加了一个ListView,内容和BaseAdapter的activity_main.xml一致
6.2 写item.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="5dp" >
<ImageView
android:id="@+id/imageView1"
android:layout_width="wrap_content"
android:layout_height="60dp"
android:src="@drawable/ic_launcher" />
<TextView
android:id="@+id/tv_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/imageView1"
android:textSize="17sp"
android:textColor="#000000"
android:text="name" />
<TextView
android:id="@+id/tv_content"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/imageView1"
android:layout_alignLeft="@+id/tv_title"
android:layout_alignParentRight="true"
android:layout_below="@+id/tv_title"
android:text="content"
android:textColor="#88000000"
android:textSize="15sp" />
</RelativeLayout>
6.3 写MainActivity.java
package com.example.simpleadapter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.ListView;
import android.widget.SimpleAdapter;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
List<Map<String, String>> data = new ArrayList<Map<String,String>>();
String[] from = {"title","content"};//用来标识一个item需要设置哪些key.而key对应的value则是要显示的数据,这里设置了2个key
int[] to={R.id.tv_title,R.id.tv_content}; //填入要更改的控件内容ID号 ,用来对应from中的两个key值,
//添加内容
Map<String, String> map1 = new HashMap<String, String>();
map1.put("title", "成都5.1级地震");
map1.put("content", "成都市青白江区5.1级地震尚无人员伤亡报告");
data.add(map1);
Map<String, String> map2 = new HashMap<String, String>();
map2.put("title", "英雄联盟手游即将上线");
map2.put("content", "期待已久的英雄联盟即将上线...");
data.add(map2);
Map<String, String> map3 = new HashMap<String, String>();
map3.put("title", "英语专四考试延期");
map3.put("content", "2020年英语专四专八考试延期...");
data.add(map3);
Map<String, String> map4 = new HashMap<String, String>();
map4.put("title", "上海出台减负政策");
map4.put("content", "上海发布抗疫企业减负政策 中小微企业:希望继续加大...");
data.add(map4);
Map<String, String> map5 = new HashMap<String, String>();
map5.put("title", "最硬核科蜜");
map5.put("content", "史上最硬核科蜜!穿着24号肩扛RPG伫立战火中...");
data.add(map5);
//初始化SimpleAdapter
SimpleAdapter adapter = new SimpleAdapter(getApplicationContext(), data, R.layout.item, from, to);
//设置SimpleAdapter
ListView lv_list = (ListView)findViewById(R.id.lv_list);
lv_list.setAdapter(adapter);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
Ps:如果要设置Item点击事件,则通过下面方法设置即可
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
//写要实现的事
}
});
android Adapter 综合使用(ArrayAdapter、SimpleAdapter、Bas
android Adapter 综合使用(ArrayAdapter、SimpleAdapter、BaseAdapter 在 ListView 和 GridView 中的使用)
在转载的 android Adapter 综合介绍中对 Adapter 接口及他的子接口或相关子类进行了详细的介绍,也对他的常用方法和各种子类适用在那种场所进行了介绍。接下来通过实例和代码分析来了解他的使用。
一、比较常用的有 BaseAdapter,ArrayAdapter,SimpleCursorAdapter 等。
①BaseAdapter 是一个抽象类,继承它需要实现较多的方法,所以也就具有较高的灵活性;
② ArrayAdapter 支持泛型操作,通常需要实现 getView 方法,特殊情况下(结合数据 row id),为了让 ui 事件相应处理方便点最好重写 getItemId;
③ SimpleCursorAdapter 可以适用于简单的纯文字型 ListView,它需要 Cursor 的字段和 UI 的 id 对应起来。如需要实现更复杂的 UI 也可以重写其他方法。
④ 若你的数据来源于一个 Arraylist 就使用 BaseAdapter,SimpleAdapter, 而数据来源于通过查询数据库获得 Cursor 那就使用 SimpleCursorAdapter 等。
二、ArrayAdapter 在 ListView 中使用
该使用方法主要是以文本为内容的列表。
1、在 xml 文件中添加 ListView 元素
①通过 array 元素添加 ListView 的内容
[html] view plaincopy
<ListView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:entries="@array/books" 通过数组设置向列表中添加的内容
android:divider="@drawable/red"/>// 设置每个内容的分隔符
②通过数组添加 ListView 的内容
[html] view plaincopy
<ListView
android:id="@+id/list"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
在 java 代码中通过 ArrayAdapter 的对象向 ListView 中添加内容
[java] view plaincopy
ListView list = (ListView)findViewById(R.id.list);
String []arr = {" 郑州铁路职业技术学院","无线电协会","创新室"};
// 将数组包装 ArrayAdapter
ArrayAdapter <String>arrayAdapter = new ArrayAdapter<String>( this,android.R.layout.simple_list_item1,arr);
list.setAdapter(arrayAdapter);// 为 ListView 设置 Adapter
public ArrayAdapter (Context context, int textViewResourceId, T [] objects) 中 textViewResource 的属性值:
simple_list_item_1:TextView
simple_list_item_2:TextView(字体略大);
simple_list_item_checked: 每个列表项都是一个已勾选的列表项。
simple_list_item_multiple_choice: 每个列表都是带多选框的文本。
simple_list_item_single_choice: 每个列表项都是带多单选按钮的文本。
使用:
[java] view plaincopy
list.SetOnItemClickListener(new OnItemClickListener(){
@Override
public void onItemClickListener(AdapterView<?>parent,View arg1,int pos,long id){
String result= parent.getItemPosition(pos).toString();
}});
③让 Activity 继承 ListActivity 实现列表
[java] view plaincopy
public class MainActivity ListActivity{
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState){
String[]ctype = new String[]{"郑州铁路职业技术学院","无线电协会","www.wxdxh.net"};
ArrayAdapter<String>adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_single_choice,ctype);
setListAdapter(adapter);
}}
使用:
[java] view plaincopy
@Override
protected void onListItemClick(ListView l,View v,int position,long id){
super.onListItemClick(l,v,position,id);
String result = l.getItemAtPosition(position).toString();}
④ArrayAdapter 类:一个管理这样的 ListView 的 ListAdapter:这个 ListView 被一个数组所支持。这个数组可装任意对象。默认状态下,这个类预期能这样:提供的资源 id 与一个单独的 TextView 相关联。如果你想用一个更复杂的 layout,就要用包含了域 id 的构造函数。这个域 id 能够与一个在更大的 layout 资源里的 TextView 相关联。它将被在数组里的每个对象的 toString () 方法所填满。你可以添加通常对象的 lists 或 arrays。重写你对象的 toString () 方法来决定 list 里哪一个写有数据的 text 将被显示。如果想用一些其它的不同于 TextView 的 view 来显示数组(比如 ImageViews),或想有一些除了 toString () 返回值所填在 views 里的以外的数据,你就要重写 getView (int,View,ViewGroup) 方法来返回你想要的 View 类型。
三、SimapleAdapter 在 ListView 中的使用
该使用方法主要是自定义内容的列表。
①、在 xml 中自定义列表中的项
主界面元素:
[html] view plaincopy
<ListView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/listView1"
>
自定义元素内容:
[html] view plaincopy
<LinearLayout
android:orientation="horizontal"
andrlod:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/image"
android:paddingRigth="10px"
android:paddingTop="20px"
android:paddingBotton="20px"
android:adjustViewBounds="true"// 可以自动调整 View 的大小
android:maxWidth="72px"
android:maxHeight="72px"
android:layout_height="wrap_content"
android:layout_width="wrap_content"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="10px"
android:layout_gravity="center"
android:id="@+id/title"/>
②在 JAVA 中为 ListView 添加内容
[java] view plaincopy
listView listview = (ListView)findViewById(R.id.listView1);
int[] imageId = new int[]{R.drawable.imag0,R.drawable.imag1,R.drawable.imag2};
String[] title = new String[]{"郑州铁路职业技术学院","无线电协会",www.wxdxh.net};
List<Map<String,Object>>listItems = new ArrayList<Map<String,Object>>();// 创建一个 List 集合
for(int i=0;i<imageld.length;i++){// 遍历数组
Map<String,Object>map = new HashMap<String,Object>();// 创建哈希表
map.put("image",imageId[i]);
map.put("title",title[i]);
listItems.add(map);}
SimpleAdapter adapter = new SimpleAdapter(this,listItems,R.layout.items,new String[]{"title","image"},new
int[]{"R.id.title","R.id.image"});
listView.setAdapter(adapter);
//SimpleAdapter(Context, List<? extends Map<String, ?>>, int, String[], int[]);
③、SimpleAdapter 类:一个使静态数据和在 XML 中定义的 Views 对应起来的简单 adapter。你可以把 list 上的数据指定为一个 Map 范型的 ArrayList。ArrayList 里的每一个条目对应于 list 里的一行。Maps 包含着每一行的数据。你先要指定一个 XML,这个 XML 定义了用于显示一行的 view。你还要指定一个对应关系,这个对应关系是从 Map 的 keys 对应到指定的 views。
绑定数据到 views 发生在两个阶段:如果一个 simpleAdapter.ViewBinder 是可用的,那么 SetViewValue (android.view.View,Object,String) 要被调用。如果返回 true,那么绑定发生了。如果返回 false,那么如下 views 将被按顺序地尝试:
~实现了 Checkable 的 View(如 CheckBox),预期的绑定值是 boolen
~TextView,预期的绑定值是 String,并且 SetViewText 方法被调用
~ImageView,预期的绑定值是一个资源的 id 或 String。并且 SetViewImage 方法被调用
如果没有合适的绑定被发现,一个 IllegalStateException 被抛出。
四、SimpleAdapter 在 GridView 中使用
1、添加布局和资源
①、 在布局文件中添加 GridView
[html] view plaincopy
<GridView android:id="@+id/gridView1"
android:layout_widtn="wrap_content"
android:layout_height="match_parent"
android:stretchMode="columnWidth" 设置拉伸模式 - 仅拉伸表格元素本身
android:numColimns="4"></GridView> 设置列数
[html] view plaincopy
<GridView android:id="@+id/gridView1"
android:layout_widtn="wrap_content"
android:layout_height="match_parent"
android:stretchMode="columnWidth" 设置拉伸模式 - 仅拉伸表格元素本身
android:numColimns="4"></GridView> 设置列数
②、在新建的资源中添加内容
[html] view plaincopy
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/item"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"// 设置据顶部边缘的距离
android:orientation="vertical" >
<ImageView android:id="@+id/image"
android:layout_width="75dp"
android:layout_height="75dp"
android:layout_gravity="center"
android:scaleType="fitXY"// 设置比例类型为适合 XY
android:padding="4dp"/>
<TextView android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="center_horizontal"
/>
</LinearLayout>
2、在 Java 代码中为 GridViw 添加内容
GridView 中添加内容和 ListView 的内容一样,参考 ListView。
五、BaseAdapter 在 GridView 中的使用
BaseAdapter 抽象类:是一个实现了既能在 ListView (实现了 ListAdapter 接口) 和 Spinner (实现了 Spinner 接口) 里用的 Adapter 类的一般基类。
1、用 BaseAdapter 在 GridView 中只显示网格式图片
①新建 BaseAdapter 对象,重写 getView 方法
[html] view plaincopy
@Override
public View getView(int position,View convertView ViewGroup parent){
ImageView imageView;
if(convertView==null){
imageview=new ImageView(MainActivity.this);
imageview.setScaleType (ImageView.ScaleType.CENTER_INSIDE);// 设置比例类型
imageview.setPadding(5,0,5,0);}
else{
imageview=(ImageView)convertView;
}
imageview.setImageResource (imageId [position]);// 设置图片内容
return imageview;
}
②使用
gridview.setAdapter(adapter);
总结:以上是 Adapter 的子类在列表和网格视图中的应用,只罗列出了关键代码和分析,有好多地方只是理解但是因为水平原因无法表达,希望和其他学习者共同解决。
Android ArrayAdapter和JSONArray
我是Android开发的新手.
考虑到JSON Carrier与XML相比的轻巧性,我纯粹喜欢使用JSON Objects和Arrays作为我的简单应用程序.
我对ArrayAdapter提出了挑战,要求填充ListView.
这就是我如何克服并需要你的建议.
Extend the Adaptor class.
然后将JSONArray传递给构造函数.
这里构造函数使用设置JSONArray长度的虚拟String数组调用super.
将构造函数参数存储在类中以供进一步使用.
public myAdaptor(Context context, int resource, JSONArray array)
{
super(context, resource, new String[array.length()]);
// Store in the local varialbles to the adapter class.
this.context = context;
this.resource = resource;
this.profiles = objects;
}
getView()将完成从JSONArray获取JSONObjects以构建视图的工作.
public View getView(int position, View convertView, ViewGroup parent)
{
View view;
if (convertView == null)
{
LayoutInflater inflater = (LayoutInflater)
context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = inflater.inflate(resource, parent, false);
}
else
{
view = convertView;
}
// Here
JSONObject item = (JSONObject) profiles.getJSONObject(position);
// READY WITH JSONObject from the JSONArray
// YOUR CODE TO BUILD VIEW OR ACCESS THE
}
现在任何改进/建议/尽管问题?
解决方法:
我建议你使用谷歌GSON而不是JSON.它是一个从JSON请求中为您提供创建对象的库,您不再需要解析JSON.只需创建一个对象,其中包含JSON请求中的所有字段,并且命名相同,并且无论您想要什么,都可以使用它 – 例如:
Your JSON request
{
[
{
"id": "2663",
"title":"qwe"
},
{
"id": "1234",
"title":"asd"
},
{
"id": "5678",
"title":"zxc"
}
]
}
你的类 – JSON-Array的项目
public class MyArrayAdapterItem{
int id;
String title;
}
您下载数据的代码中的Somwhere.我不知道你是怎么做的所以我会发布我的代码例如:
mGparser = new JsonParser();
Gson mGson = new Gson();
Url url = "http://your_api.com"
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestProperty("Connection", "close");
conn.connect();
BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
JsonArray request = (JsonArray) mGparser.parse(in.readLine());
in.close();
ArrayList<MyArrayAdapterItem> items = mGson.fromJson(request, new Typetoken<ArrayList<MyArrayAdapterItem>>() {}.getType());
所以,现在只需将“items”替换为适配器构造函数中的JSON数组
Android ArrayAdapter没有清除?
我有一个服务,它执行一个线程来更新ListView中显示的数据.该数据存储在ArrayList中,ArrayList用于为ListView生成一些自定义ArrayAdapter.按下ListView中的项目(添加或删除项目)时,也会更新适配器.我曾经只是在每次有任何类型的更改时创建新适配器,然后将这个新适配器设置为ListView.这很有效,但每次都会导致ListView滚动到顶部.鉴于我的应用程序的性质,这是不可取的.必须在更新之间维护ListView中的当前滚动位置.
我没有创建新的适配器,而是开始使用适配器的clear()方法清除需要更新的适配器,然后使用适配器的add()方法重建适配器的项目.这两种方法都在适配器上调用.适配器都在其构造函数中设置为notifyDataOnChange,因此我不必每次都手动调用notiftyDatasetChanged()(虽然考虑到我的问题,我尝试手动调用它也无济于事).
这是我的自定义适配器的样子:
public class RealmAdapter extends ArrayAdapter<Realm> { Context c; public RealmAdapter(Context context,int resource,int textViewResourceId) { super(context,resource,textViewResourceId); setNotifyOnChange(true); c = context; } @Override public View getView(int position,View convertView,ViewGroup parent) { ... } ... }
长话短说,这是我的问题.当我在适配器上调用clear()时,适配器未被清除.
这是我的线程中的onPostExecute的片段,用于更新.我肯定会把它放在这里,所以它在UI线程上更新.我也在我的UI活动中将这些确切的代码复制到私有方法中.此代码在以下任一位置都不起作用:
appState.favoriteAdapter.clear(); Log.d(LOG_TAG,"COUNT: " + appState.favoriteAdapter.getCount()); for(Realm r : appState.favorites) { appState.favoriteAdapter.add(r); } Log.d(LOG_TAG,"COUNT: " + appState.favoriteAdapter.getCount());
例如,如果上面的适配器中有3个项目,则在clear()返回3而不是0之后立即调用getCount().同样,如果appState.favorites ArrayList中只有2个项目,则getCount( )循环仍然返回3,而不是2.因为适配器没有响应任何这些调用,它使得无法以任何方式更新.我可以稍后发布一个Logcat,如果这会有所帮助,但没有例外或任何有用的东西被显示.
几个小时后,我似乎遇到的问题是适配器没有响应对任何改变它的方法的调用.我已经尝试将一个空的ArrayList传递给适配器的super()调用,这没有用.我错过了什么或者错误地使用了ArrayAdapter吗?我已经搜遍了所有的问题,我已经检查了很多常见的问题,例如修改底层数组并期望它更新,而不是调用(或者在我的外壳设置中使用适配器)notifyDatasetChanged(),并使用不支持的对底层集合的操作.
favoriteAdapter的声明非常简单,包含在我的Application类中:
public RealmAdapter favoriteAdapter;
这是从上面初始化favoriteAdapter:
if(appState.favoriteAdapter == null) { appState.favoriteAdapter = new RealmAdapter(c,R.layout.list_item,R.layout.realm_entry,appState.favorites); } else { appState.favoriteAdapter.clear(); Log.d(LOG_TAG,"COUNT: " + appState.favoriteAdapter.getCount()); for(Realm r : appState.favorites) { appState.favoriteAdapter.add(r); } Log.d(LOG_TAG,"COUNT: " + appState.favoriteAdapter.getCount()); }
上面的代码在我的UI线程和下载刷新数据的线程中.
在上面的代码下面放置了一个过滤器:
if(appState.favoriteAdapter != null && RealmSelector.realmFilter != null) appState.favoriteAdapter.getFilter().filter(RealmSelector.realmFilter.getText().toString());
过滤器会影响清除列表吗?逻辑不会决定……
解决方法
if(appState.favoriteAdapter != null && realmFilter != null) { appState.favoriteAdapter.getFilter().filter(realmFilter.getText().toString()); }
如果有人能解释为什么这很重要,我会很高兴.我认为过滤器是为了选择适配器中的项目子集.在我的测试中,我将用于过滤器的文本框留空,因此不应该应用实际的过滤器文本.再说一次,如果有人知道发生了什么,可以向我解释为什么这样可以解决我想知道的问题.
关于Android ArrayAdapter过滤问题和安卓arrayadapter的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于13.Android-ListView使用、BaseAdapter/ArrayAdapter/SimpleAdapter适配器使用、android Adapter 综合使用(ArrayAdapter、SimpleAdapter、Bas、Android ArrayAdapter和JSONArray、Android ArrayAdapter没有清除?的相关信息,请在本站寻找。
本文标签: