【问题标题】:dynamically add layout into getview method of adaptor in android在android中将布局动态添加到适配器的getview方法中
【发布时间】:2013-06-28 22:57:03
【问题描述】:

我想在列表视图的每一行中显示 N 个图像视图。 imageview 的数量取决于 json 解析值。每次我从服务器获取 json 时,它可以是 2 或 3 或 4。

所以我不能通过使用 inflate 来使用静态 xml。所以我决定在 getview 方法中创建动态视图并将 N 个图像视图添加到视图中

我编写了以下代码,但它仍然只显示一个图像视图,并且水平滚动根本不起作用..

感谢任何帮助

public class MyAdapter extends BaseAdapter{
private LayoutInflater inflater;
private ArrayList<String> data;
Context con;

public MyAdapter(Context context, ArrayList<String> data1){
// Caches the LayoutInflater for quicker use
      inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
// Sets the events data
data= data1;
con=context;
}

public View getView(int position, View view, ViewGroup viewgroup) {
    ViewHolder holder=new ViewHolder(); //our view holder of the row
    if (view == null) {

        HorizontalScrollView hr=new HorizontalScrollView(con);
        LinearLayout layout=new LinearLayout(con);
        layout.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT));

           //layout set some properties
           for(int i=1;i<2;i++)
           {
            holder.image =new ImageView(con);
            LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(100*i, 100*i);
            holder.image.setLayoutParams(layoutParams);
            layout.addView(holder.image);
           }
           //subtitle set some properties

       //CREATING THE LAYOUT THROUGH CODE
           hr.addView(layout);

       view = hr; //INSTEAD OF INFLATING A LAYOUT FOR THE ROW I JUST BINDED IT TO THE RECENTLY CREATED LAYOUT 
       //bind the views of the holder to the views of the layout
           view.setTag(holder);
           Log.w("myapp", "new view");
    } 
    else 
    {
       holder = (ViewHolder) view.getTag();
       Log.w("myapp", "in reuse");
    }
        //rest of implementation of the View
    for(int i=0;i<2;i++)
    {
    holder.image.setImageResource(R.drawable.ic_launcher);
    }
        return view;
    }

static class ViewHolder {
    ImageView image;
 TextView title;
 TextView type;
 HorizontalScrollView hr;
}

@Override
public int getCount() {
    // TODO Auto-generated method stub
    return 4;
}

@Override
public Object getItem(int position) {
    // TODO Auto-generated method stub
    return null;
}

@Override
public long getItemId(int position) {
    // TODO Auto-generated method stub
    return 1;
}
 }

【问题讨论】:

    标签: android imageview android-arrayadapter


    【解决方案1】:

    检查这是我猜你想要的。只需为图像中的每一行设置随机值

        public class MyAdapter extends BaseAdapter {
        private LayoutInflater inflater;
        private ArrayList<String> data;
        Context con;
    
        public MyAdapter(Context context, ArrayList<String> data1) {
    
            inflater = (LayoutInflater) context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    
            data = data1;
            con = context;
        }
    
        public View getView(int position, View view, ViewGroup viewgroup) {
            ViewHolder holder = new ViewHolder(); // our view holder of the row
            if (view == null) {
    
                HorizontalScrollView hr = new HorizontalScrollView(con);
                LinearLayout layout = new LinearLayout(con);
                layout.setLayoutParams(new LinearLayout.LayoutParams(
                        LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
                for (int i = 0; i < data.size(); i++) {
                    holder.image = new ImageView(con);
                    layout.addView(holder.image);
                    holder.image.setImageResource(R.drawable.ic_launcher);
                }
                hr.addView(layout);
                view = hr;
    
                view.setTag(holder);
    
            }
            holder = (ViewHolder) view.getTag();
    
            return view;
    
        }
    
        @Override
        public int getCount() {
            // TODO Auto-generated method stub
            return data.size();
        }
    
        @Override
        public Object getItem(int position) {
            // TODO Auto-generated method stub
            return null;
        }
    
        @Override
        public long getItemId(int position) {
            // TODO Auto-generated method stub
            return 1;
        }
    }
    
    class ViewHolder {
        ImageView image;
        TextView title;
        TextView type;
        HorizontalScrollView hr;
    }
    

    【讨论】:

    • @WarrenFaith 我知道……但我是故意的……只是为了让“o”变得糟糕到令人愉悦……
    • 我不愿意给那些可能不太了解的初学者提供糟糕的编码风格提示......
    • @WarrenFaith 对不起亲爱的......我不是那个意思......要交换请不要使用“o”
    【解决方案2】:
    for(int i=1;i<2;i++)
    

    这意味着它只运行一次,因为 i = 1 因为在下一个循环中 i == 2,因此 i

    【讨论】:

      【解决方案3】:

      嗯,与从 xml 布局中扩展视图项的方式相同,您可以像往常一样以编程方式创建这些项。只需要确保指定布局参数并将它们添加到布局中以便它们可见:

      例如,获取在 ViewHolder 初始化时链接的视图:

      //That's a view taken from the xml
      EditText editText = (EditText) view.findViewById(R.id.YOUR_EditText1);
      

      同样,如果您想动态地将视图添加到布局中,请在 getView() 方法中:

      ImageView image1 = new ImageView();
      ...
      ...
      view.addView(image1);
      

      有关以编程方式添加视图的更多信息,请查看Android: Add two text views programmatically

      【讨论】:

      • 我不想静态添加..看看我写的问题和代码,我想动态创建图像视图,为此我使用 for 循环进行图像视图..我不想静态添加图像视图
      • 好吧,你在方法结束时返回的就是显示的内容。通过三次返回视图,您不会将 3 个图像绘制在一起,而是按顺序绘制其中 3 个图像,显然您最终会看到最后一个。最重要的是,我不会使用那种 viewHolder 方法。 viewHolder 应该是整个视图,在里面可以放其余的内容。您当前的方式对回收没有太大帮助。检查sriramramani.wordpress.com/2012/07/25/…。最后,图像视图不是静态添加的,它只是每行一个实例
      猜你喜欢
      • 1970-01-01
      • 2022-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-29
      相关资源
      最近更新 更多