【问题标题】:Android ViewHolder pattern with programmatically added views以编程方式添加视图的 Android ViewHolder 模式
【发布时间】:2014-04-17 09:21:43
【问题描述】:

我正在创建一个 FrameLayout,然后添加两个视图(一个 ImageView 和一个 TextView)。

我在 getView() 上的代码:

  public View getView(int position, View convertView, ViewGroup parent) {
    ImageView imageView;
    TextView textView1;

    int new_width = wid/2;
    int textview_id=0;

    FrameLayout frame_layout = new FrameLayout(mContext);  // Instantiate the parent
    frame_layout.setLayoutParams(new GridView.LayoutParams(android.widget.FrameLayout.LayoutParams.MATCH_PARENT, 
                    android.widget.FrameLayout.LayoutParams.MATCH_PARENT));

    textView1 = new TextView(mContext); textView1.setId(position); 
    textView1.setText("Set Wallpaper");
    textView1.setTextColor(mContext.getResources().getColor(R.color.set_wallpaper_colors));
    textView1.setVisibility(View.INVISIBLE);
    textView1.setTypeface(textView1.getTypeface(), Typeface.BOLD);


    FrameLayout.LayoutParams textview_params = new FrameLayout.LayoutParams(
            LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
    textview_params.gravity = Gravity.CENTER;


    FrameLayout.LayoutParams imageview_params = new FrameLayout.LayoutParams(
            new_width -5, new_width -5 );


        imageView = new ImageView(mContext);
        //imageView.setLayoutParams(new GridView.LayoutParams(new_width - 5, new_width -5));
        imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
        imageView.setPadding(0, 0, 0, 0);


    imageView.setImageResource(mThumbIds[position]);

    frame_layout.addView(imageView, imageview_params);
    frame_layout.addView(textView1, textview_params);

    return frame_layout;
}

我应该如何更改它以使用 ViewHolder 类。没有可膨胀的布局。

【问题讨论】:

  • 无论哪种方式都可以使用支架模式。您可以从 xml 膨胀或动态创建视图。发布您的整个 getView 方法,以便我们检查它。
  • @Tim 好的我已经发布了代码

标签: android


【解决方案1】:

你的代码应该是这样的

static class ViewHolder {
    TextView textView1;
    ImageView imageView1;
}

@Override
public View getView(final int row, View convertView, final ViewGroup parent) {
    ViewHolder holder = null;
    FrameLayout frame_layout = (FrameLayout) convertView;
    if (frame_layout == null) {
        holder = new ViewHolder();
        holder.textView1 = new  TextView(mContext);
        holder.imageView1 = new ImageView(mContext);

        frame_layout.setTag(holder);
    }
    else {
        holder = (ViewHolder) frame_layout.getTag();    
    }

    holder.textView1.setText("Set Wallpaper");
    holder.textView1.setTextColor(mContext.getResources().getColor(R.color.set_wallpaper_colors));
    holder.textView1.setVisibility(View.INVISIBLE);
    holder.textView1.setTypeface(holder.textView1.getTypeface(), Typeface.BOLD);

    FrameLayout.LayoutParams textview_params = new FrameLayout.LayoutParams(
            LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
    textview_params.gravity = Gravity.CENTER;

    FrameLayout.LayoutParams imageview_params = new FrameLayout.LayoutParams(
        new_width -5, new_width -5 );

    holder.imageView1.setScaleType(ImageView.ScaleType.CENTER_CROP);
    holder.imageView1.setPadding(0, 0, 0, 0);

    holder.imageView1.setImageResource(mThumbIds[position]);

    frame_layout.addView(holder.imageView1, imageview_params);
    frame_layout.addView(holder.textView1, textview_params);

    return frame_layout;
}

【讨论】:

  • 我正在处理您的代码。我对holder.imageview_paramsholder.textview_params 感到困惑。我已经编辑了我的答案并添加了我的代码你能详细说明一下吗?
  • 我刚刚从你的代码中复制的那些行,我已经更新了答案。
  • 为什么投反对票?这只是按照您的代码以正确方式执行此操作的指针,我不应该为您编写程序吗?
  • 在创建视图时不应该只在if() 语句中调用addView() 吗?否则,当convertView 被回收时,您将尝试重新添加视图,这将抛出IllegalStateException(指定的孩子已经有父母)。
猜你喜欢
  • 1970-01-01
  • 2012-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-13
  • 2014-08-27
  • 2023-03-20
  • 1970-01-01
相关资源
最近更新 更多