Android listview item 显示不全
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android listview item 显示不全相关的知识,希望对你有一定的参考价值。
参考技术A 1.这篇博文不算什么知识点。使用的都是的系统中已经提供给我们的方式方法。这是最近用到了,感觉很实用,特此贡献出来。首先需要定义,listview中需要展示的view个数,和view的布布局类型
private final int TYPE_1 = 0; 类型1
private final int TYPE_2 = 1; 类型2
private final int VIEW_TYPE = 2; 总布局数
@Override
public int getItemViewType(int position)
if (position == 0 || position == weeklyCount + 1 || position == weeklyCount + tasteCount + 2)
return TYPE_2;
else
return TYPE_1;
public int getViewTypeCount()
return VIEW_TYPE;
/-------------------------------------------------------------------------------------******-------------------------------------------------------------------/
@Override
public View getView(final int position, View convertView, ViewGroup parent)
ViewHolder viewHolder = null;
ViewHolder2 viewHolderf = null;
int type = getItemViewType(position);
if (convertView == null)
switch (type) // 各个布局中使用的资源进行初始化
case TYPE_1:
viewHolder = new ViewHolder();
convertView = View.inflate(context, R.layout.item_ranking_user_top, null);
viewHolder.txtview_votesize = (TextView) convertView.findViewById(R.id.txtview_votesize);
viewHolder.txtview_fontnumber = (TextView) convertView.findViewById(R.id.txtview_fontnumber);
viewHolder.username = (TextView) convertView.findViewById(R.id.txtview_username);
viewHolder.imgbtn_attention = (ImageButton) convertView.findViewById(R.id.imgbtn_attention);
viewHolder.imgcrown = (ImageView) convertView.findViewById(R.id.img_crown);
viewHolder.iv_userheade = (CircularImage) convertView.findViewById(R.id.img_userheader);
viewHolder.cellContainer = (RelativeLayout) convertView.findViewById(R.id.fragment_container);
convertView.setTag(viewHolder);
break;
case TYPE_2:
viewHolderf = new ViewHolder2();
convertView = View.inflate(context, R.layout.item_ranking_title, null);
viewHolderf.txtview_catagory = (TextView) convertView.findViewById(R.id.txtview_catagory);
viewHolderf.imgview_rankingtitle = (ImageView) convertView.findViewById(R.id.imgview_rankingtitle);
convertView.setTag(viewHolderf);
break;
else //缓存复用
switch (type)
case TYPE_1:
viewHolder = (ViewHolder) convertView.getTag();
break;
case TYPE_2:
viewHolderf = (ViewHolder2) convertView.getTag();
break;
switch (type)
case TYPE_1:
break;
case TYPE_2:
break; //......... 给各个布局需要展示内容 进行赋值
其他的也不过进行描述了,之前一直没有这样写,以为一个listview中显示不同的布局很麻烦。就使用其他的方式了。一直没有自己动手写,这次项目中用到,所以自己找了点资料看了一下。
下面项目中的真实效果图
1项目背景是,有一个排行榜,三个不同的对象。周排行,热度排行,最受欢迎的排行。因为对象不同,所以处理起来挺麻烦的 ,一堆的判断语句。下周一,需要review一下代码,不然,会被批的哦。
这里里的标题背景是一个veiw ,类别展示是一个类别
说到这里,正好把,这个简单的算法说一下,如何算出来,标题在listvew中的具体位置。
到这里就差不多了,突然发现 getveiwcount() 和 getviewtype() 配合着 标题的这个简单位置算法,用起来,少了,很多烦恼。很顺利的就解决了这个分类问题追问
what fuck?
Android基本控件之ListView
我们在使用手机的时候,通常看到,像通讯录,QQ列表样式的东西,这里来解释一下,其实那些都是一个ListView
今天,我们就来详细的讲解一下ListView这个控件
ListView中每条显示的数据都称为一个item。每个item都有自己的布局。
在这里,我们就先来实现一个简单的功能,用来解释ListView这个控件
我们就来做一个最简单的只显示文本和图片的这样的一个ListView。
我先来和大家一起分析一下我们应该准备些什么:
首先,我们需要一个主界面布局文件,并在布局文件中定义一个ListView
然后,我们需要创建一个布局文件,这么布局文件是每个item的布局。因为我们只是显示文本和图片,所以我们的这个item的布局就只是一个简简单单的TextView和一个ImageView
那么好,我们就来实现一下,这两个布局文件。
我们先来看主界面的布局文件:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" 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="application.smile.listview.MainActivity"> <ListView android:id="@+id/listView" android:layout_width="match_parent" android:layout_height="match_parent"/> </RelativeLayout>
然后,我们再来看一下每个item的布局:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="10dp"> <ImageView android:id="@+id/iv_icon" android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="5dp" android:src="@mipmap/ic_launcher"/> <TextView android:id="@+id/tv_title" android:layout_marginTop="10dp" android:layout_toRightOf="@+id/iv_icon" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="这是标题" android:textSize="20sp"/> <TextView android:id="@+id/tv_content" android:layout_toRightOf="@+id/iv_icon" android:layout_below="@+id/tv_title" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:text="这是内容"/> </RelativeLayout>
这样,我们的两个布局文件就准备完成了。
然后,我们来看Activity中是如何实现的。
我们首先需要几个想要显示的数据的集合(或者数组),这里就需要两个了,一个用来放图片,一个用来放文字
然后,我们通过老套路,先找到相应的控件,然后设置适配器,然后设置点击事件
然后,因为我们有很多的item需要显示,所以,我们需要一个适配器来将我们的数据显示到屏幕上。
这样,我们就按照我们所想的去打造这么一个Activity吧
public class MainActivity extends AppCompatActivity { //存储文字的数组 private String [] names ={"刘备","张飞","诸葛亮","赵云","孙权","周瑜","司马懿","夏侯惇"}; //存储图片的数组 private int [] images = {R.mipmap.liubei,R.mipmap.zhangfei,R.mipmap.zhugeliang,R.mipmap.zhaoyun, R.mipmap.sunquan,R.mipmap.zhouyu,R.mipmap.simayi,R.mipmap.xiahoudun}; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //找到控件 ListView listView = (ListView) findViewById(R.id.listView); //设置适配器 listView.setAdapter(new MyAdapter(this)); //设置点击事件 listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { //弹出吐司 Toast.makeText(MainActivity.this, "点我了?我是"+names[position], Toast.LENGTH_SHORT).show(); } }); } /** * 自定义适配器,继承BaseAdapter */ class MyAdapter extends BaseAdapter{ //维护一个上下文,为了得到布局填充器 private Context context; //维护一个布局填充器,为了得到每个item 的布局 private LayoutInflater layoutInflater; public MyAdapter(Context context){ //通过构造方法获取布局填充器对象 layoutInflater = LayoutInflater.from(context); } //该方法是总共有多少个item @Override public int getCount() { return names.length; } //该方法是得到每个item的值 @Override public Object getItem(int position) { return names[position]; } //该方法是得到每个item的id @Override public long getItemId(int position) { return position; } //该方法是获得视图,也是这些里面最重要的方法 @Override public View getView(int position, View convertView, ViewGroup parent) { //首先,我们通过布局填充器获得item的布局 View view = layoutInflater.inflate(R.layout.item_layout,null); //根据item的布局找到图片 ImageView iv_icon = (ImageView) view.findViewById(R.id.iv_icon); //根据item的布局找到标题 TextView tv_title = (TextView) view.findViewById(R.id.tv_title); //根据item的布局找到内容 TextView tv_content = (TextView) view.findViewById(R.id.tv_content); //设置图片源(也就是我们装图片的那个数组) iv_icon.setImageResource(images[position]); //设置标题文字 tv_title.setText(names[position]); //设置内容文字 tv_content.setText("我是"+names[position]); //返回item的布局 return view; } } }
我们通过上面的代码,再来理一理思路。
首先,我们准备资源。
//存储文字的数组 private String [] names ={"刘备","张飞","诸葛亮","赵云","孙权","周瑜","司马懿","夏侯惇"}; //存储图片的数组 private int [] images = {R.mipmap.liubei,R.mipmap.zhangfei,R.mipmap.zhugeliang,R.mipmap.zhaoyun, R.mipmap.sunquan,R.mipmap.zhouyu,R.mipmap.simayi,R.mipmap.xiahoudun};
然后,我们通过findViewById来找到我们需要的控件,这里就是ListView
//找到控件 ListView listView = (ListView) findViewById(R.id.listView);
然后,我们设置适配器
//设置适配器 listView.setAdapter(new MyAdapter(this));
这里出现了MyAdapter,一会进行讲解
然后,我们通过匿名内部类来获得点击事件
//设置点击事件 listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { //弹出吐司 Toast.makeText(MainActivity.this, "点我了?我是"+names[position], Toast.LENGTH_SHORT).show(); } });
接下来,我们就来看一下MyAdapter这个自定义适配器
我们的适配器有很多,但是为什么我们偏偏选择继承BaseAdapter呢?因为它灵活
我们继承BaseAdapter之后,我们需要重写四个方法。
在重写那四个方法之前,我们来介绍一下布局填充器。所谓的布局填充器就是通过XML文件去获得里面的布局
我们在这里通过布局填充器去获得item的布局,但是呢,布局填充器需要一个上下文作为参数。
所以,我们先维护一个上下文和 一个布局填充器,并通过构造方法获得布局填充器的对象
//维护一个上下文,为了得到布局填充器 private Context context; //维护一个布局填充器,为了得到每个item 的布局 private LayoutInflater layoutInflater; public MyAdapter(Context context){ //通过构造方法获取布局填充器对象 layoutInflater = LayoutInflater.from(context); }
然后,我们来看看重写的那四个方法
1.
//该方法是总共有多少个item @Override public int getCount() { return names.length; }
2.
//该方法是得到每个item的值 @Override public Object getItem(int position) { return names[position]; }
3.
//该方法是得到每个item的id @Override public long getItemId(int position) { return position; }
4.
//该方法是获得视图,也是这些里面最重要的方法 @Override public View getView(int position, View convertView, ViewGroup parent) { //首先,我们通过布局填充器获得item的布局 View view = layoutInflater.inflate(R.layout.item_layout,null); //根据item的布局找到图片 ImageView iv_icon = (ImageView) view.findViewById(R.id.iv_icon); //根据item的布局找到标题 TextView tv_title = (TextView) view.findViewById(R.id.tv_title); //根据item的布局找到内容 TextView tv_content = (TextView) view.findViewById(R.id.tv_content); //设置图片源(也就是我们装图片的那个数组) iv_icon.setImageResource(images[position]); //设置标题文字 tv_title.setText(names[position]); //设置内容文字 tv_content.setText("我是"+names[position]); //返回item的布局 return view; }
在这四个方法中getView方法是最重要的方法,主要的逻辑都在这里。
我们先通过布局填充器获得我们的布局,并通过布局获得控件,然后设置每个控件的值,最后返回这个item的布局
我们来一起看一下运行的结果吧
这样,我们这个简单的listView就完成了
让程序写入生命,将代码融入灵魂
-------smile、zj
以上是关于Android listview item 显示不全的主要内容,如果未能解决你的问题,请参考以下文章
android ListView显示多个类型item 和 item中控件抢夺焦点解决办法
android ListView显示多个类型item 和 item中控件抢夺焦点解决办法
android在listView的item中有一个ImageView,如何让每一个item中的ImageView显示不同的图片
ListView的使用小记(使用SimpleAdapter显示列表实现Item的点击事件)