项目中遇到的问题,上网查阅以及自己思考解决了ListView控件的使用问题,废话不多说,程序运行图如下所示:
常规的方法我们通常采用的是ListView + SimpleAdapter来实现上述的界面,代码很简单,逻辑很清楚。但是如果我想要点击比如说上方的item条目中的查看视频,查看留言,使它们点击后产生相应的点击事件,也就是弹出你好和再见字样,使用这种方法就行不通了。所以在此我使用另外一种方法 ListView + 自定义适配器
三个实现功能的java类 :
两个xml布局文件:
1 activity_main.xml(listview的布局文件):
item就是上图中画圈的地方,此listview总共有7个item,android:divider 代表的属性是每个item之间的分隔符
2 zhuangzai_ui.xml(item的布局文件):
这个布局文件会装载到自定义适配器中
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> getdate(){
List> listviewinfo = new ArrayList>();
for(int i = 0; i < 7;i++){
HashMap data = new HashMap();
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