Android ListView控件的使用(自定义适配器 + ListView + 解决OOM )

时间:2021-05-20 19:33:58

            项目中遇到的问题,上网查阅以及自己思考解决了ListView控件的使用问题,废话不多说,程序运行图如下所示:

                                        Android ListView控件的使用(自定义适配器 + ListView + 解决OOM )                           

       常规的方法我们通常采用的是ListView + SimpleAdapter来实现上述的界面,代码很简单,逻辑很清楚。但是如果我想要点击比如说上方的item条目中的查看视频,查看留言,使它们点击后产生相应的点击事件,也就是弹出你好和再见字样,使用这种方法就行不通了。所以在此我使用另外一种方法 ListView + 自定义适配器

三个实现功能的java类  :                                                  

                                                                  Android ListView控件的使用(自定义适配器 + ListView + 解决OOM )

两个xml布局文件:

                                                                 Android ListView控件的使用(自定义适配器 + ListView + 解决OOM )

 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"
>

<ListView
android:id="@+id/list_view"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:divider="@drawable/seperate1"
></ListView>

</RelativeLayout>

                                          Android ListView控件的使用(自定义适配器 + ListView + 解决OOM )

  item就是上图中画圈的地方,此listview总共有7个item,android:divider 代表的属性是每个item之间的分隔符

  2 zhuangzai_ui.xml(item的布局文件):  

<?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="vertical" >

<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<ImageView
android:id="@+id/xianshiphoto"

android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/find1"/>

<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="130.0dip"
android:orientation="vertical"
>
<TextView

android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="15sp"
android:id="@+id/name"
android:text="门铃NJ"
android:textColor="#000000"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="15sp"
android:id="@+id/content"
android:text="有人长时间逗留"
android:textColor="#000000"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/time"
android:textSize="15sp"
android:text="2015-9-10 : 13: 56 :11"
android:textColor="#000000"/>
</LinearLayout>
</LinearLayout>

<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="15.0dip"
android:layout_gravity="center_horizontal"
android:id="@+id/showphoto"

android:background="@drawable/info"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="15sp"

android:layout_marginTop="6.0dip"
android:id="@+id/checkinfo"
android:text="查看留言"
android:textColor="#000000"/>

<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/videophoto"
android:layout_marginLeft="80.0dip"
android:layout_gravity="center_horizontal"
android:background="@drawable/video" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="15sp"
android:layout_marginTop="6.0dip"
android:textColor="#000000"

android:id="@+id/checkvideo"
android:text="实时视频"/>
</LinearLayout>


</LinearLayout>

这个布局文件会装载到自定义适配器中

3个java类文件

 1 iteminfo.java 用来装载listview每一个item中的信息,item就是上图中画圈的地方,此listview总共有7个item  

package com.example.testlistview;

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



public class iteminfo {


public iteminfo(){

}

public static List<HashMap<String,Object>> getdate(){

List<HashMap<String,Object>> listviewinfo = new ArrayList<HashMap<String,Object>>();
for(int i = 0; i < 7;i++){
HashMap<String , Object> data = new HashMap<String, Object>();
data.put("pitcure", R.drawable.find);
data.put("name", "门铃NJ");
data.put("introduce", "有人长时间逗留");
data.put("time", "2015-9-15 10:11:40");
data.put("liuyan", R.drawable.info);
data.put("liuyancheck","查看留言");
data.put("video", R.drawable.video);
data.put("videocheck", "查看视频");
listviewinfo.add(data);
}
return listviewinfo;
}
}

2 myadapter.java 继承于 BaseAdapter(BaseAdapter是Android-SDK中的基类)这里是重点,这是配置每一个item信息的类,属于自定义适配器

package com.example.testlistview;







import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

public class myadapter extends BaseAdapter implements OnClickListener{

private LayoutInflater inflater = null ;

private Context context;
private ViewHolder viewholder;

public myadapter(){

}

public myadapter(Context context){

this.context = context;
inflater = LayoutInflater.from(context);

}

static class ViewHolder{
private TextView view1;
private TextView view2;
private TextView view3;
private TextView view4;
private TextView view5;
private ImageView imageview1;
private ImageView imageview2;
private ImageView imageview3;
}


@Override
public int getCount() {
// TODO Auto-generated method stub
return iteminfo.getdate().size();
}

@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return iteminfo.getdate().get(position);
}

@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub

if(convertView == null){
viewholder = new ViewHolder();
convertView = inflater.inflate(R.layout.zhuangzai_ui, null);
viewholder. view4 = (TextView)convertView.findViewById(R.id.checkinfo);
viewholder. view5 = (TextView)convertView.findViewById(R.id.checkvideo);
viewholder. view1 = (TextView)convertView.findViewById(R.id.name);
viewholder. view2 = (TextView)convertView.findViewById(R.id.content);
viewholder. view3 = (TextView)convertView.findViewById(R.id.time);
//将设置好的布局保存到缓存中,并将其设置在Tag里,以便后面方便取出Tag
convertView.setTag(viewholder);
}
else{
viewholder = (ViewHolder)convertView.getTag();
}
//填充的数据
viewholder. view1.setText(iteminfo.getdate().get(position).get("name").toString());
viewholder. view2.setText(iteminfo.getdate().get(position).get("introduce").toString());
viewholder. view3.setText(iteminfo.getdate().get(position).get("time").toString());
viewholder. view4.setText(iteminfo.getdate().get(position).get("liuyancheck").toString());
viewholder. view5.setText(iteminfo.getdate().get(position).get("videocheck").toString());
viewholder. view4.setOnClickListener(this);
viewholder. view5.setOnClickListener(this);



return convertView;
}

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.checkinfo:
Toast.makeText(this.context, "你好", 0).show();
break;

case R.id.checkvideo:
Toast.makeText(this.context, "再见", 0).show();

break;
}
}
}

 代码讲述:

  1 在继承BaseAdapter后,会自动给你添加四个方法,需要自己写覆盖原来的,分别为getCount()、getItem()、 getItemId()、getView()。

在这四个方法中getCount ,与getView 是最重要的

 1.1 getCount()方法表示的是这个listview有几个item条目

return iteminfo.getdate().size();   

   这句代码表示的就是获得装载信息集合的大小,在iteminfo中可看出循环了7次,也就是大小是7,item条目有7个

 1.2 getItem() , getItemId()方法表示的是当前item所要绑定的数据在集合中的索引值  

return iteminfo.getdate().get(position);

return  position;
1.3 getView()方法表示的所要加载的界面,从表面上看就是获得视图

  2 在此类中还定义了一个static class ViewHolder 主要是为了解决OOM(内存泄露问题),也就是说在显示listView时,假如listview有成百上千的item,你并不是一次性把这些item生成,而是根据手机屏幕,一次性在手机屏幕上显示的item条目说你能看到的,看不到的并不加载。所以这样就不会出现内存泄露了

3 MainActivity.java

package com.example.testlistview;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;

public class MainActivity extends Activity implements OnItemClickListener {


private ListView listview ;
private myadapter adapter;

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

listview = (ListView)findViewById(R.id.list_view);
adapter = new myadapter(getApplicationContext());
listview.setAdapter(adapter);
listview.setOnItemClickListener(this);




}


@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
// TODO Auto-generated method stub

}




@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;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}

}

以上就是整个代码及讲解,同样的方式还可以用到其它的组件中比如GridView ,AutoCompleteTextView,等等。希望能够得到大家的评论,不足之处会多多改善,大家共同学习。

源代码地址:http://download.csdn.net/detail/danielntz/9462442