具有编程添加视图的Android ViewHolder模式

具有编程添加视图的Android ViewHolder模式,android,Android,我正在创建一个框架布局,然后添加两个视图(一个ImageView和一个TextView) getView()上的我的代码: 我应该如何更改它以使用ViewHolder类。没有可膨胀的布局。对于您的代码,应该是这样的 static class ViewHolder { TextView textView1; ImageView imageView1; } @Override public View getView(final int row, View convertView,

我正在创建一个框架布局,然后添加两个视图(一个ImageView和一个TextView)

getView()上的我的代码:


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

对于您的代码,应该是这样的

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;
}

您可以以任何一种方式使用保持架模式。您可以从xml膨胀或动态创建视图。发布您的整个getView方法,以便我们检查。@Tim好的,我已经发布了代码,我正在处理您的代码。我把
holder.imageview_参数
holder.textview_参数
搞混了。我已经编辑了我的答案并添加了我的代码。你能再详细一点吗?我刚从你的代码中复制的那些行,我已经更新了答案。为什么投否决票?这只是一个指针,按照您的代码进行操作,我不应该为您编写程序?在创建视图时,您不应该只在
if()
语句中调用
addView()
?否则,当回收
convertView
时,您将尝试重新添加视图,这将抛出
IllegalStateException
(指定的子级已经有父级)。
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;
}