listview布局(android中listView怎么复用多种布局)
本文目录
- android中listView怎么复用多种布局
- 如何实现listview中item的自定义布局
- listview的item条目布局文件一般放在哪个文件夹里
- getItemViewType为Listview,GridView,RecyclerView以及流布局的item设置不同的布局
- android中怎么用代码实现ListView 布局和 GridView 布局 就是完全不用xml写
- android如何在listview里给每个条目设置布局
- 如何在ListView中嵌套ListView
android中listView怎么复用多种布局
adapter填充数据的时候,我们一般要实现以下方法:1 public int getCount(){ }2 public Object getItem(int position) {}3 public long getItemId(int position) {}4 public View getView(int position, View view, ViewGroup viewGroup){} 但是要实现复用多种布局的话我们还要实现下面2个方法 1 public int getItemViewType(int position) {} 返回我们要复用的布局类型,假如我们要复用一个tab结构和item结构,我们可以这么来写 类别的数值在(0,类别总数-1)之间public static final int TYPE_UNKNOW = 0; public static final int TYPE_TAB = 1; public static final int TYPE_LIST_ITEM = 2; public static final int TYPE_MAX_COUNT = 3;@Override public int getItemViewType(int position) { //复用tab结构 if (position == 1) { return TYPE_TAB; } //复用一般的item结构 int size = CollectionUtils.size(feedDataList); if (position 》= 1 && size 》 0 && position 《 (size + 2)) { return TYPE_LIST_ITEM; } return TYPE_UNKNOW; }类别总数是3,类别对应的int值应该在0 - 2 之间,它们分别是 public static final int TYPE_UNKNOW = 0; public static final int TYPE_TAB = 1; public static final int TYPE_LIST_ITEM = 2;2 public int getViewTypeCount() { } 返回复用布局的总数,这里是3@Override public int getViewTypeCount() { return TYPE_MAX_COUNT; }在adapter中的getView方法中,我们就可以这样来写: @Override public View getView(int position, View convertView, ViewGroup viewGroup) { ItemViewHolder itemViewHolder; TabViewHolder tabViewHolder; int viewType= getItemViewType(position); switch (viewType) { case TYPE_TAB: if(convertView == null ) { tabViewHolder = new TabViewHolder(mContext); //给contenView赋值,并给viewHolder设置tag tabViewHolder.findView(position,convertView,viewGroup); }else{ //直接复用 tabViewHolder = (TabViewHolder)convertView.getTag(); } //这里是处理业务逻辑的方法 tabViewHolder.setView(position); return tabViewHolder.layout;//返回convertView case TYPE_LIST_ITEM: if (convertView == null) { itemViewHolder = new ItemViewHolder(mContext); //给contenView赋值,并给viewHolder设置tag itemViewHolder.findView(position, convertView, viewGroup); } else { //convertView不为空,直接复用 itemViewHolder = (ItemViewHolder) convertView.getTag(); } //处理业务逻辑 itemViewHolder.setView((FeedComment)getItem(position)); return itemViewHolder.layout;//返回convertView case TYPE_UNKNOW: return null; } return null; } 说明:处理复用多个布局的时候,如果不调用上面getViewTypeCount()和getItemType(),很容易就出现viewHolder类型转换错误。因为在屏幕滚动的时候,view.getTag()返回的viewHolder有2种,我们拿到的viewHolder可能就不是理想中的viewHolder,这个时候类型转换错误就出现了。
如何实现listview中item的自定义布局
Listview使用自定义布局,则需要创建layout,并引用layout。以下为示例代码:创建layout文件《?xml version="1.0" encoding="utf-8"?》《LinearLayout xmlns:android=android:layout_width="fill_parent"android:layout_height="wrap_content"》《TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/online_user_list_item_textview" android:text="TextView"》《/TextView》《Buttonandroid:text="button"android:layout_width="wrap_content"android:layout_height="wrap_content"》《/Button》《/LinearLayout》2.layout面含有的textview是想要展示内容的地方。那么构建ArrayAdapter时,应该这样写:ArrayAdapter《String》 adapter = new ArrayAdapter《String》(this, R.layout.online_user_list_item, R.id.online_user_list_item_textview); 3.ArrayAdapter并且重写getView方法。代码:public class UserListAdapter extends ArrayAdapter《User》 {private int resourceId;public UserListAdapter(Context context, int textViewResourceId,List《User》 objects) {super(context, textViewResourceId, objects);this.resourceId = textViewResourceId;}@Overridepublic View getView(int position, View convertView, ViewGroup parent){User user = getItem(position);LinearLayout userListItem = new LinearLayout(getContext());String inflater = Context.LAYOUT_INFLATER_SERVICE; LayoutInflater vi = (LayoutInflater)getContext().getSystemService(inflater); vi.inflate(resourceId, userListItem, true);TextView tvUsername = (TextView)userListItem.findViewById(R.id.tv_user_list_username);TextView tvAskedNum = (TextView)userListItem.findViewById(R.id.tv_user_list_askednum);TextView tvLastMsg = (TextView)userListItem.findViewById(R.id.tv_user_list_lastmsg);tvUsername.setText(user.getUsername());tvAskedNum.setText(String.valueOf(user.getAskedNum()));tvLastMsg.setText(user.getLastMsg());return userListItem;}}
listview的item条目布局文件一般放在哪个文件夹里
res文件夹。1、ListView的使用中,item是在adapter中用来显示每一个条目,一般放在res文件夹。2、题目出自《移动端应用方案设计》。
getItemViewType为Listview,GridView,RecyclerView以及流布局的item设置不同的布局
为listview的item设置不同的布局文件,步骤如下;1、为不同的item写不同的布局文件,设置统一的bean类 2、继承BaseAdapter类,实现getItemViewType(int position)和getViewTypeCount() 方法,根据这两个方法,为item设置不同的标记,也就是不同的type /*** 根据数据源的position返回需要显示的的layout的type * * type的值必须从0开始 */ @Override public intgetItemViewType(intposition) { returnposition ==0?0:1; } 3、在getView方法中,利用getItemViewType(position)方法获取当前的type类型,然后根据不同的type类型,加载不同的item布局文件。 intviewType = getItemViewType(position); ViewTagHolder mViewTagHolder =null; if(convertView ==null) { if(viewType ==0) { convertView =mInflater.inflate(R.layout.layout_hot_search,parent, false); }else{ convertView =mInflater.inflate(R.layout.adapter_tag_item,parent, false); mViewTagHolder =newViewTagHolder(convertView); convertView.setTag(R.string.app_name,mViewTagHolder); } }else{ mViewTagHolder = (ViewTagHolder) convertView.getTag(R.string.app_name); } 4、其他的一些listview的优化同一般的listview没有很大区别。
android中怎么用代码实现ListView 布局和 GridView 布局 就是完全不用xml写
ListView lv = new ListView(getApplicationContext()); lv.setLayoutParams(new LayoutParams(width, height));创建一个ListView,然后设置布局。其他属性也一样可以设置。
android如何在listview里给每个条目设置布局
可以为listview设置自定义的Adapter,该自定义Adapter继承BaseAdapter
class MyAdapter extends BaseAdapter { @Override public int getCount() { // TODO Auto-generated method stub return list!=null?list.size():0; } @Override public Object getItem(int position) { // TODO Auto-generated method stub return list.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 View v = getLayoutInflater().inflate(R.layout.data_list, null); TextView name = (TextView) v.findViewById(R.id.name); name.setText((String) list.get(position).get("name")); return v; }}其中getView方法可以通过getLayoutInflater().inflate()方法为每个条目设置不同的布局。
如何在ListView中嵌套ListView
1、简单布局:ListView整页面ListView由于ListView本身带滚效所加载数据超页面显示范围通滑查看所item种情况需要添加ScrollView2、其布局A+ListView种情况布局A定义ListView前面布局A所占比例较或者ListView加载数据较都导致ListView显示完全同由于ListView自身滚仍通滚查看ListView所item图所示:3、其布局B+ListView种情况假设布局B定义ListView面现两种情况:(1)、ListView加载数据完全显示ListView每项面足够剩余空间布局B能显示;(2)、ListView加载数据加导致留给布局B空间足或者根本没布局B显示完全或者完全显示管ListView本身内容都通滑查看于第三种情况重新考虑布局需要添加ScrollView用于查看剩余页面内容二、ScrollViewListView冲突问题1、给ListView指定高度例设置android:layout_height="240dip"解决能影响美观图所示:2、外面再添加ScrollView种情况现问题图所示:3、给ScrollView设置属性:android:fillViewport="true"测试候发现ListView加载数据确实解决ListView加载数据较候仍旧显示完全并且候ListView自身滚三、解决办两种1、计算listview总高度并设置ListView listView = (ListView) findViewById(id);YourAdapter adapter = new MyAdapter("初始化适配器");listView.setAdapter(adapter);setListViewHeightBasedOnChildren(listView);(setAdapter调用自定义)复制代码 代码:/*** @param listView*/private void setListViewHeightBasedOnChildren(ListView listView) {ListAdapter listAdapter = listView.getAdapter();if (listAdapter == null) {return;}int totalHeight = 0;for (int i = 0; i 《 listAdapter.getCount(); i++) {View listItem = listAdapter.getView(i, null, listView);listItem.measure(0, 0);totalHeight += listItem.getMeasuredHeight();}ViewGroup.LayoutParams params = listView.getLayoutParams();params.height = totalHeight+ (listView.getDividerHeight() * (listAdapter.getCount() - 1));listView.setLayoutParams(params);}使用该需要注意:ListView每Item必须LinearLayout能其其Layout(RelativeLayout)没重写onMeasure()所onMeasure()抛异2、 自定义ListView重载onMeasure()设置全部显示复制代码 代码:package com.meiya.ui;import android.widget.ListView;/*** * @Description: scrollview内嵌listview简单实现* * @File: ScrollViewWithListView.java* * @Paceage com.meiya.ui* * * @Date 午03:02:38* * @Version*/public class ScrollViewWithListView extends ListView {public ScrollViewWithListView(android.content.Context context,android.util.AttributeSet attrs) {super(context, attrs);}/*** Integer.MAX_VALUE 》》 2,设置系统默认设置显示两条*/public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE 》》 2,MeasureSpec.AT_MOST);super.onMeasure(widthMeasureSpec, expandSpec);}}解决scrollView内嵌listView问题第进入界面态加载listviewitems页面跳转listview第项蛋疼奈知道解决先用复制代码 代码:scrollView.post(new Runnable() { //让scrollview跳转顶部必须放runnable() @Override public void run() { scrollView.scrollTo(0, 0); } });度希望知道朋友给点解决案3、使用scrollView +LinearLayout用addView()添加列表
更多文章:
免费自动连接wifi(怎样设置电脑开机后自动开启360免费wifi)
2024年7月1日 23:35
天庭战神怎么打攻略?天庭最厉害的战神是谁,不是杨戬,不是哪吒,他是谁
2024年5月2日 03:53
logo设计在线生成免费(自己在线制作logo免费,有什么好用的logo手机制作软件吗)
2024年10月12日 03:45
火影online(火影忍者online什么角色适合平民玩家)
2024年1月21日 08:20
qq技术导航(在手机QQ聊天里面,有发送位置共享,以前直接点别人发过来的地图,就可以用导航软件直接导航过去,现在)
2024年5月3日 08:35
matlab6 5(matlab 6,5怎么读不出excel的文字)
2023年11月15日 08:00
连连看经典旧版下载免费(经典的连连看单机版的,很久以前的,玩习惯的,现在想找都找不到,是一只黄色小恐龙的,宠物小精灵的!)
2024年6月25日 19:16
哪些期货公司开户好银河期户好不好,专业性和公司实力怎么样?用银河期货的人多吗这个平台怎么样
2024年3月22日 23:12