listview嵌套

来源:互联网 发布:linux init 服务 启动 编辑:程序博客网 时间:2024/05/21 01:49

试例代码

publicclass ListNestGridViewextends BaseAdapterimplements

OnItemClickListener {

   

   

       publicstaticfinalintItemHeight = 48;// 每项的高度  

           publicstaticfinalintPaddingLeft = 36;// 每项的高度  

           privateintmyPaddingLeft = 0; 

           private MyGridViewtoolbarGrid

           private List<Tag>listTag;

       //   private String[] categoryTitles={"租房租凭","二手车/拼车","婚庆/婚介"};

     

 

       private ContextparentContext;

 

       private LayoutInflaterlayoutInflater;

       private List<Category> listcategory;

        public ListNestGridView(Context context, List<Category> listcategory)

       {

           parentContext=context;

           this.listcategory=listcategory;

      

          

       }

       @Override

       publicvoid onItemClick(AdapterView<?> parent, View view,int position,

              long id)

       {

           Toast.makeText(parentContext,"当前选中的是:" + position, Toast.LENGTH_SHORT)

                  .show();

 

       }

       private TextViewcategroyTit;

       private GridViewgridview;

       privateintcurent=0;

    

       @Override

       publicint getCount() {

           //TODO Auto-generated method stub

           Log.i("listcategorysize",listcategory.size()+"====");

           returnlistcategory.size();

       }

 

       @Override

       public Object getItem(int position) {

           //TODO Auto-generated method stub

           returnlistcategory.get(position);

       }

 

       @Override

       publiclong 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

           Log.i("tagList","=7777=");

            Category category=(Category) getItem(position);

      

            if(convertView!=null){

               position++;

               categroyTit.setText(category.getTitle());

                  /*Log.i("categoryTitles", categoryTitles[position]+"===");*/

                  Log.i("current", position+"===");

                  Log.i("tagList333","=55==");

                  Log.i("listcategorytags", category.getTags().size()+"==");

                  gridview.setAdapter(new GridViewAdapter(parentContext, category.getTags()));

                  gridview.setOnItemClickListener(this);

            }else{

              convertView=layoutInflater.from(parentContext).inflate(R.layout.gridview,null);

              categroyTit=(TextView) convertView.findViewById(R.id.gridview_category_title);

              gridview=(GridView)convertView.findViewById(R.id.GridView_toolbar);

              Log.i("tagList","==44= "+category.getTitle());     

                

                  categroyTit.setText(category.getTitle());

              /* Log.i("categoryTitles", categoryTitles[position]+"===");*/

                  Log.i("current", position+"===");

                  Log.i("tagList333","=55==");

                  Log.i("listcategorytags", category.getTags().size()+"==");

                  gridview.setAdapter(new GridViewAdapter(parentContext, category.getTags()));

                  gridview.setOnItemClickListener(this);

            }

      

        Log.i("tagList","==44= really comeback==");   

           return convertView;

       }

       private TextViewtv;

       class GridViewAdapterextends BaseAdapter {

            

          private List<Tag>tags;

          private Contextcontext;

          public GridViewAdapter(Context context,List<Tag> tag){

              this.tags=tag;

              this.context=context;

          }

       @Override

       publicint getCount() {

           //TODO Auto-generated method stub

           Log.i("tags",tags.size()+"===");

           returntags.size();

       }

 

       @Override

       public Tag getItem(int position) {

           //TODO Auto-generated method stub

           returntags.get(position);

       }

 

       @Override

       publiclong getItemId(int position) {

           //TODO Auto-generated method stub

           returntags.get(position).getId();

       }

 

       @Override

       public View getView(int position, View convertView, ViewGroup parent) {

           //TODO Auto-generated method stub

           convertView=layoutInflater.from(context).inflate(R.layout.gridview_item,null);

           tv=(TextView) convertView.findViewById(R.id.item_text);

           Tag tag=getItem(position);

           Log.i("tv_name",tag.getName() );

           tv.setText(tag.getName());

           Log.i("tv_name","comeback assignment complete" );

           return convertView;

       }

         

       }

   

      

    }

 

对于listview中嵌套的对象添加item点击事件需要将外面的那个类继承 onitemListener这个接口

在外边的适配器中实现监听方法在这样做的同时会遇到一个问题就是listAdapter本身不是activity它没有上下文对象所以listAdapteractivity在在同一个.class文件中这样context可以用activity中的监听也可以做到同在一个activity不会出现ui更新等其他问题

 

它的实现远离跟单个适配器是一样的

很多问题都是出在传递数据这方面 所以只要把数据部分整理好传过来实现是没有问题的

值得一提的是通过log文件可以看到  return contentview他是根据每次匹配得到一个view它就返回一次  但父类的视图只一次  所以不必担心

 

 

在显示gridview中的内容还是会出现很多问题 比如只能显示很少的一部分  滑动的时候对同一个item对象内容会总是在变换

1 显示的长度问题因为listview  gridview都为继承了scrollview都继承了滑动属性,当两个默认出现两个滑动控件在滑动时里面哪个是默认不响应  但有具有所以应该显示的屏蔽掉。一般的处理方式是将gridview 控件自己重写 重写主要就是重写publicvoid onMeasure(int widthMeasureSpec,int heightMeasureSpec)

    {

       int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >>

              MeasureSpec.AT_MOST);

       expandSpec=expandSpec+15;

       super.onMeasure(widthMeasureSpec, expandSpec);

    }

gridview中的高度设到文本高度这样就可以完整显示了

 

 

2 文字变化

主要用到的是 建一个内部类 将adapter中要显示的控件添加到这个类中  在getview中new这个类  将布局文件中得到的控件赋给新类的成员函数 再将contentview。setTag(新类)

将值赋给类的成员  ,这样子再显示的时候就不会变了

 

试例代码

    @Override

           public View getView(int position, View convertView, ViewGroup parent) {

              //TODO Auto-generated method stub

                holder=new GridHolder();

               convertView=layoutInflater.from(context).inflate(R.layout.gridview_item,null);

               holder.txt_name=(TextView) convertView.findViewById(R.id.item_text);

              Tag tag=getItem(position);

          

             

              convertView.setTag(holder);//holder  添加到动态生成的View里面

               holder.txt_name.setText(tag.getName());

          

              return convertView;

           }

             

            privateclass GridHolder{

                

                    TextView txt_name;

            }