您的位置:首页 > 其它

实现ListView的几种方式

2015-10-15 16:00 239 查看
最近要实现动态搜索显示历史记录,需要用到ListView加载历史记录。这东西感觉历经几个星期了,一直出现各种问题。其实利用ListView进行加载Item已经比较成熟了,各种方式都可以,只是自己之前没有深入探索,照书搬,没有深入理解才出现了各种奇葩问题。现将一些方式总结如下:

一、使用默认的布局以及适配器实现ListView

首先在布局文件中定义ListView:

<ListView
android:id="@+id/lv_item"
android:layout_width="match_parent"
android:layout_height="match_parent" />
然后,在MainActivity中实例化控件,并设置相关监听事件:

//定义ListView的Item数据
String[] data={};//自定义,也可以是ArrayList类型的

//声明并实例化
ListView lv_item= (ListView) findViewById(R.id.lv_item);
//定义ArrayAdapter适配器

ArrayAdapter<String> adapter=new ArrayAdapter<String>(MainActivity.this,android.R.layout.simple_list_item_2,data);
//设置适配器
lv_item.setAdapter(adapter);
//设置监听事件
lv_item.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
//触发ListView的Item的事件
}
});
*这是最简单的一种,其中android.R.layout.simple_list_item_2即为一种最简单的默认布局

二、使用自定义的布局

将第一种方式的android.R.layout.simple_list_item_2换成自定义的布局文件,但是自定义布局文件时可能就不单单是只显示文件,有可能需要在文字里配上图标。这样就必须要定制适配器了。在定制适配器的时候又有两种不同的方式,一种是继承BaseAdapter,一种是集成ArrayAdapter;

1、使用带图标的自定义布局并继承ArrayAdapter

1)自定义布局文件:

<?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"
android:layout_marginTop="10dp">

<ImageView
android:id="@+id/iv"
android:layout_width="35dp"
android:layout_height="35dp"
android:layout_marginLeft="10dp"
android:src="@drawable/ic1"/>
<TextView
android:id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="25sp"
android:layout_marginLeft="10dp"/>

</LinearLayout>
2)Java代码实现:

public class MainActivity extends ActionBarActivity {

ArrayList<Item> arrayList = new ArrayList<MainActivity.Item>();
ListView lv_item;
ImageView imageView;
TextView textView;
ItemAdapter adapter;

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

initData();
lv_item = (ListView) findViewById(R.id.lv_item);

adapter = new ItemAdapter(MainActivity.this,
R.layout.listview_item, arrayList);
lv_item.setAdapter(adapter);

lv_item.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
String sendValue = lv_item.getItemAtPosition(position).toString();
Intent intent = new Intent();
intent.putExtra("value", sendValue);
intent.setClass(MainActivity.this, SecondActivity.class);
startActivity(intent);
}
});
}

//初始化数据
private void initData() {
Item item;
int[] resourceID = {R.drawable.ic1, R.drawable.ic2, R.drawable.ic3, R.drawable.ic4, R.drawable.ic5
, R.drawable.ic6, R.drawable.ic7, R.drawable.ic8, R.drawable.ic9, R.drawable.ic10
, R.drawable.ic11, R.drawable.ic12, R.drawable.ic13, R.drawable.ic14, R.drawable.ic15
, R.drawable.ic16, R.drawable.ic17, R.drawable.ic18, R.drawable.ic19, R.drawable.ic20};
for (int i = 0; i < 20; i++) {
item = new Item(resourceID[i], "Item " + i);
arrayList.add(item);
}

}

//    定义一个Item
public class Item {
private int imageView_id;
private String textView_text;

public Item(int imageView_id, String textView_text) {
this.imageView_id = imageView_id;
imageView_id = R.drawable.ic1;
this.textView_text = textView_text;
}

public int getImageView_id() {
return imageView_id;
}

public String getTextView_text() {
return textView_text;
}

public void setTextView_text(String textView_text) {
this.textView_text = textView_text;
}

@Override
public String toString() {

return "资源ID:" + imageView_id + '\'' + "   Item:" + textView_text;
}
}

//  自定义适配器
public class ItemAdapter extends ArrayAdapter<Item> {

int resourceId;

public ItemAdapter(Context context, int resource, List<Item> objects) {
super(context, resource, objects);
this.resourceId = resource;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {

Item item = getItem(position);
View view;
ViewHolder viewHolder;
if (convertView == null) {
view = LayoutInflater.from(getContext()).inflate(resourceId,
null);
viewHolder = new ViewHolder();
viewHolder.imageView = (ImageView) view.findViewById(R.id.iv);
viewHolder.textView = (TextView) view.findViewById(R.id.tv);
view.setTag(viewHolder);
} else {
view = convertView;
viewHolder = (ViewHolder) view.getTag();
}
viewHolder.imageView.setImageResource(item.getImageView_id());
viewHolder.textView.setText(item.getTextView_text());

return view;

}

class ViewHolder {
ImageView imageView;
TextView textView;
}

}

}
由于其中涉及到一些资源文件,可能加载很慢,或者运行不出来,建议使用小一点的图标。

2、使用带图标的自定义布局并继承BaseAdapter

1)自定义布局文件:

<span style="font-family:SimSun;font-size:18px;"><?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"
android:layout_marginTop="10dp">

<ImageView
android:id="@+id/iv"
android:layout_width="35dp"
android:layout_height="35dp"
android:layout_marginLeft="10dp"
android:src="@drawable/ic1"/>
<TextView
android:id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="25sp"
android:layout_marginLeft="10dp"/>

</LinearLayout></span>
2)Java代码实现:

public class ItemAdapter extends BaseAdapter{

private LayoutInflater mInflater;
private List<Item> mList;

public ItemAdapter(Context context, List<Item> mList) {
this.mInflater = LayoutInflater.from(context);
this.mList = mList;
}

@Override
public int getCount() {
if(mList.size()>0){
return mList.size();
}
return 0;
}

@Override
public Object getItem(int i) {
if(mList.size()>0){
return mList.get(i);
}
return null;
}

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

@Override
public View getView(int position, View convertView, ViewGroup parent) {
Item item = (Item) getItem(position);
View view;
ViewHolder viewHolder;
if (convertView == null) {
view=convertView;
view = mInflater.inflate(R.layout.listview_item, null);
viewHolder = new ViewHolder();
viewHolder.imageView = (ImageView) view.findViewById(R.id.iv);
viewHolder.textView = (TextView) view.findViewById(R.id.tv);
view.setTag(viewHolder);
} else {
view = convertView;
viewHolder = (ViewHolder) view.getTag();
}
viewHolder.imageView.setImageResource(item.getImageView_id());
viewHolder.textView.setText(item.getTextView_text());

return view;

}

class ViewHolder {
ImageView imageView;
TextView textView;
}
}


具体项目工程参见:http://download.csdn.net/detail/u011439776/9186569点击打开链接

运行效果图:



*由于图片资源较大,故只加载了一张图片

在ListView中还可以放一些其他的控件,只要封装并注意监听控制就可以实现。有兴趣可以尝试尝试。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: