很简单地listview重写baseadapter,实现不同item采用不同布局,类型转换错误,求指点。

joyment2010 2015-09-18 02:51:16
public class MyAdapter extends BaseAdapter
{

private LayoutInflater mInflater;

public MyAdapter(Context context)
{
this.mInflater = LayoutInflater.from(context);
}

@Override
public int getCount()
{
if(mData==null) return 0;
return mData.size();
}

@Override
public Object getItem(int position)
{
return mData.get(position);

}

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

@SuppressWarnings("null")
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
ViewHolder holder = null;
ViewHolder2 holder2 = null;
View view=null;
View view2=null;
switch (position)
{
case 2:
if (convertView == null)
{
holder2 = new ViewHolder2();
view2 = mInflater.inflate(R.layout.oneline, null,false);
holder2.title2 = (TextView) view2.findViewById(R.id.title2);
view2.setTag(holder2);
convertView=view2;
}
else
{
holder2 = (ViewHolder2) convertView.getTag();
}
holder2.title2.setText((String) mData.get(position)
.get("title"));
break;

default:
if (convertView == null)
{
holder = new ViewHolder();
view = mInflater.inflate(R.layout.twoline, null,false);
holder.title = (TextView) view.findViewById(R.id.title);
holder.info = (TextView) view.findViewById(R.id.info);
view.setTag(holder);
convertView=view;
}
else
{
holder = (ViewHolder) convertView.getTag();
}
holder.title.setText((String) mData.get(position).get("title"));
holder.info.setText((String) mData.get(position).get("info"));
break;
}
return convertView;



//************************************************************

}

}

// 各个布局的控件资源
class ViewHolder
{
public TextView title;
public TextView info;
}

class ViewHolder2
{
public TextView title2;
}
...全文
673 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_31536627 2015-09-23
  • 打赏
  • 举报
回复
有c+66吗,急需啊求各位了
暮雨潇潇洒 2015-09-22
  • 打赏
  • 举报
回复
谷歌原生态的代码要多读,照着用就可以,UI设计关键是以后的性能优化,多看别人总结的博客,敲代码。。。
joyment2010 2015-09-21
  • 打赏
  • 举报
回复
引用 11 楼 渐行渐远是否还有一种坚持留在心间的回复:
有两种布局也不能直接用两个viewholder,对listview复用机制有些了解就明白了。两种布局要在getitemtype里面声明怎么处理position返回的类型,不同类型返回不同的int值就好了,及getitemtypecount里面返回类型总数2。这样getview方法识别出来的convertview类型才会是同类型的,不用担心转化问题了。
有两种布局也不能直接用两个viewholder,对listview复用机制有些了解就明白了。两种布局要在getitemtype里面声明怎么处理position返回的类型,不同类型返回不同的int值就好了,及getitemtypecount里面返回类型总数2。这样getview方法识别出来的convertview类型才会是同类型的,不用担心转化问题了。[/quote] 新手上路,感谢指点。 心得:我以为那两个函数没什么用,现在明白谷歌写好的,会自动内调,虽然不知道原因,但是目前只需要学会使用,慢慢知所以然。
joyment2010 2015-09-21
  • 打赏
  • 举报
回复
引用 11 楼 u013147734 的回复:
有两种布局也不能直接用两个viewholder,对listview复用机制有些了解就明白了。两种布局要在getitemtype里面声明怎么处理position返回的类型,不同类型返回不同的int值就好了,及getitemtypecount里面返回类型总数2。这样getview方法识别出来的convertview类型才会是同类型的,不用担心转化问题了。
public class MyAdapter extends BaseAdapter
	{
		private static final int TYPE_POSITION_DEFAULT =0;
		private static final int TYPE_POSITION_2 =1;
		private static final int TYPE_MAX_COUNT =2;
		private LayoutInflater mInflater;

		public MyAdapter(Context context)
		{
			this.mInflater = LayoutInflater.from(context);
		}

		@Override
		public int getCount()
		{
			if(mData==null)		return 0;
			return mData.size();
		}

		@Override
		public Object getItem(int position)
		{
			return mData.get(position);

		}

		@Override
		public long getItemId(int position)
		{
			return position;
		}
		public int getViewTypeCount() {
            return TYPE_MAX_COUNT;
        }
		public int getItemViewType(int position) {
            return (position==2) ? TYPE_POSITION_2 : TYPE_POSITION_DEFAULT;
        }

		@Override
		public View getView(int position, View convertView, ViewGroup parent)
		{
			ViewHolder holder = null;
			ViewHolder2 holder2 = null;
			View view=null;
			int type = getItemViewType(position);

			if (convertView == null)
			{
				switch (type)
				{

				case TYPE_POSITION_2:
					holder2 = new ViewHolder2();
					view = mInflater.inflate(R.layout.oneline, null);
					holder2.title2 = (TextView) view.findViewById(R.id.title2);
					view.setTag(holder2);
					break;
				case TYPE_POSITION_DEFAULT:
					holder = new ViewHolder();
					view = mInflater.inflate(R.layout.twoline, null);
					holder.title = (TextView) view.findViewById(R.id.title);
					holder.info = (TextView) view.findViewById(R.id.info);
					view.setTag(holder);
				}
			}
			else
			{
				view = convertView;
				switch (type)
				{
				case TYPE_POSITION_2:
					holder2 = (ViewHolder2) view.getTag();

					break;
				case TYPE_POSITION_DEFAULT:

					holder = (ViewHolder) view.getTag();
				}
			}
			// 设置资源
			switch (type)
			{
			case TYPE_POSITION_2:
				holder2.title2.setText((String) mData.get(position)
						.get("title"));

				break;

			case TYPE_POSITION_DEFAULT:
				holder.title.setText((String) mData.get(position).get("title"));
				holder.info.setText((String) mData.get(position).get("info"));
			}

			return view;
			
			
			
			//************************************************************
			
		}

	}
  • 打赏
  • 举报
回复
有两种布局也不能直接用两个viewholder,对listview复用机制有些了解就明白了。两种布局要在getitemtype里面声明怎么处理position返回的类型,不同类型返回不同的int值就好了,及getitemtypecount里面返回类型总数2。这样getview方法识别出来的convertview类型才会是同类型的,不用担心转化问题了。
  • 打赏
  • 举报
回复
有两种布局也不能直接用两个viewholder,对listview复用机制有些了解就明白了。两种布局要在getitemtype里面声明怎么处理position返回的类型,不同类型返回不同的int值就好了,及getitemtypecount里面返回类型总数2。这样getview方法识别出来的convertview类型才会是同类型的,不用担心转化问题了。
逆转星河 2015-09-20
  • 打赏
  • 举报
回复
试试这样:class ViewHolder2 extends ViewHolder{ public TextView title2; }
Willem_wl 2015-09-20
  • 打赏
  • 举报
回复
因为listview在滑动时会回收item,当被回收的item的对象是viewholder时,又要被转为viewholder2时,就会报错了
阿贵丨 2015-09-19
  • 打赏
  • 举报
回复
你可以看看baseadapter 中getViewItemType方法,有助于实现不同布局额
joyment2010 2015-09-18
  • 打赏
  • 举报
回复
引用 5 楼 qq_30517057 的回复:
当你position为1的时候convertview已经存了viewholder了,position为2的时候你强转为viewholder2报错了。 你这个只有在position为2的时候使用不同的布局,其他position布局是相同的,完全没必要给positon为2的布局实现复用。position为2的时候不要用convertview就好了。
我对convertview的缓存不是十分了解,所以仿别人做的,你说的很对。其实我只是position为2的时候做个实验。按理这种方法是可以的,感兴趣看这个博客,http://www.tuicool.com/articles/6N7jamq,继续等大神了。
qq_30517057 2015-09-18
  • 打赏
  • 举报
回复
当你position为1的时候convertview已经存了viewholder了,position为2的时候你强转为viewholder2报错了。 你这个只有在position为2的时候使用不同的布局,其他position布局是相同的,完全没必要给positon为2的布局实现复用。position为2的时候不要用convertview就好了。
davl 2015-09-18
  • 打赏
  • 举报
回复
因为listview在滑动时会回收item,当被回收的item的对象是viewholder时,又要被转为viewholder2时,就会报错了
joyment2010 2015-09-18
  • 打赏
  • 举报
回复
引用 2 楼 jklwan 的回复:
用一个viewHolder,不要用两个。

public class MyAdapter extends BaseAdapter {

        private LayoutInflater mInflater;

        public MyAdapter(Context context) {
            this.mInflater = LayoutInflater.from(context);
        }

        @Override
        public int getCount() {
            if (mData == null) return 0;
            return mData.size();
        }

        @Override
        public Object getItem(int position) {
            return mData.get(position);

        }

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

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            ViewHolder holder = null;
            if (convertView == null) {
                holder = new ViewHolder();
                switch (position){
                    case 2:
                        convertView = mInflater.inflate(R.layout.oneline, null, false);
                        break;
                    default:
                        convertView = mInflater.inflate(R.layout.twoline, null, false);
                        break;
                }
                convertView.setTag(holder);
            }else {
                holder = (ViewHolder) convertView.getTag();
            }
            switch (position) {
                case 2:
                    holder.title2 = (TextView) convertView.findViewById(R.id.title2);
                    holder.title2.setText((String) mData.get(position).get("title"));
                    break;

                default:
                    holder.title = (TextView) convertView.findViewById(R.id.title);
                    holder.info = (TextView) convertView.findViewById(R.id.info);
                    holder.title.setText((String) mData.get(position).get("title"));
                    holder.info.setText((String) mData.get(position).get("info"));
                    break;
            }
            return convertView;

        }

    }

    // 各个布局的控件资源
    class ViewHolder {
        public TextView title;
        public TextView info;
        public TextView title2;
    }
因为我有两个布局类型,所以需要两个viewholder,用两个是可以的,http://www.tuicool.com/articles/6N7jamq
jklwan 2015-09-18
  • 打赏
  • 举报
回复
用一个viewHolder,不要用两个。

public class MyAdapter extends BaseAdapter {

        private LayoutInflater mInflater;

        public MyAdapter(Context context) {
            this.mInflater = LayoutInflater.from(context);
        }

        @Override
        public int getCount() {
            if (mData == null) return 0;
            return mData.size();
        }

        @Override
        public Object getItem(int position) {
            return mData.get(position);

        }

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

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            ViewHolder holder = null;
            if (convertView == null) {
                holder = new ViewHolder();
                switch (position){
                    case 2:
                        convertView = mInflater.inflate(R.layout.oneline, null, false);
                        break;
                    default:
                        convertView = mInflater.inflate(R.layout.twoline, null, false);
                        break;
                }
                convertView.setTag(holder);
            }else {
                holder = (ViewHolder) convertView.getTag();
            }
            switch (position) {
                case 2:
                    holder.title2 = (TextView) convertView.findViewById(R.id.title2);
                    holder.title2.setText((String) mData.get(position).get("title"));
                    break;

                default:
                    holder.title = (TextView) convertView.findViewById(R.id.title);
                    holder.info = (TextView) convertView.findViewById(R.id.info);
                    holder.title.setText((String) mData.get(position).get("title"));
                    holder.info.setText((String) mData.get(position).get("info"));
                    break;
            }
            return convertView;

        }

    }

    // 各个布局的控件资源
    class ViewHolder {
        public TextView title;
        public TextView info;
        public TextView title2;
    }
joyment2010 2015-09-18
  • 打赏
  • 举报
回复
提示,不能将viewholder类型转化为viewholder2,定位在holder2=(VIewholder2)convertview.gettag()这一句
内容概要:本文针对无刷直流电机驱动的电子机械制动(EMB)执行器,建立了考虑Stribeck摩擦特性的非线性耦合动力学模型,并在Simulink环境中完成了系统级仿真分析。研究综合集成了电机动力学、齿轮传动机构与制动执行机构的动力学特性,构建了高保真的机电一体化系统模型。重点引入Stribeck摩擦模型以精确描述低速工况下执行器内部存在的静摩擦、粘滞摩擦与库仑摩擦之间的过渡行为,有效提升了系统在启停、反向运动等瞬态过程中的动态响应仿真精度。通过多工况仿真验证了模型的有效性,能够准确反映摩擦引起的爬行、滞后与定位误差等非线性现象,为EMB系统的高性能控制算法设计(如摩擦补偿、滑模控制)与结构优化提供了高可信度的仿真平台。; 适合人群:从事汽车电子制动系统、电机驱动控制、机电系统建模与仿真研究的研究生、科研人员及工程技术人员,需具备扎实的机械动力学、自动控制理论基础和MATLAB/Simulink仿真能力。; 使用场景及目标:①用于高精度电子机械制动系统的设计验证与性能预测;②为消除摩擦非线性影响的先进控制策略(如自适应控制、智能控制)提供精确的被控对象模型;③深入探究Stribeck摩擦等非线性因素对系统动态性能(如响应延迟、稳态误差)的作用机理; 阅读建议:读者应结合提供的Simulink模型文件,深入剖析Stribeck摩擦模块的数学实现与参数辨识方法,建议通过改变输入指令(如阶跃、正弦)和负载条件进行对比仿真,以直观理解非线性摩擦对系统动态特性的影响。

80,488

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧