Android 如何使用动态添加的TextView覆盖ArrayAdaptor中的getView方法?

Android 如何使用动态添加的TextView覆盖ArrayAdaptor中的getView方法?,android,android-listview,android-arrayadapter,Android,Android Listview,Android Arrayadapter,如何使用动态添加的TextView在ArrayAdaptor中覆盖getView方法 以下是我到目前为止的情况: @Override public View getView(int position, View convertView, ViewGroup parent) { View view = null; final ViewHolder holder; if (convertView == null) {

如何使用动态添加的TextView在
ArrayAdaptor
中覆盖
getView
方法

以下是我到目前为止的情况:

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

        if (convertView == null) {
            holder = new ViewHolder();
            LayoutInflater inflator = context.getLayoutInflater();
            view = inflator.inflate(R.layout.numbergenerationitemlayout,
                    parent, false);
            holder.FL = (FlowLayout) view.findViewById(R.id.itemFlowLayout);
            holder.FL.setTag(list.get(position));
            view.setTag(holder);

            GameSet GS = (GameSet) list.get(position);
            ArrayList<Element> normal = GS.getNormalNum();
            if (normal != null) {
                for (int x = 0; x < normal.size(); x++) {
                    BallTextView BT = new BallTextView(context, "BLUE_BALL");
                    String text = "" + normal.get(x).getElement();
                    BT.setText(text);
                    holder.FL.addView(BT);
                }
            }

            ArrayList<Element> special = GS.getSpecialNum();
            if (special != null) {
                for (int x = 0; x < special.size(); x++) {
                    BallTextView BT = new BallTextView(context, "ORANGE_BALL");
                    String text = "" + special.get(x).getElement();
                    BT.setText(text);
                    holder.FL.addView(BT);
                }
            }
        } else {
            view = convertView;
            // ((ViewHolder) view.getTag()).FL.setTag(list.get(position));
        }
        ViewHolder currentHolder = (ViewHolder) view.getTag();
        currentHolder.position = position;


        return view;
    }
@覆盖
公共视图getView(int位置、视图转换视图、视图组父视图){
视图=空;
最终持票人;
if(convertView==null){
holder=新的ViewHolder();
LayoutInflater充气器=上下文。getLayoutInflater();
视图=充气机。充气(R.layout.numbergenerationitemlayout,
父母,假);
holder.FL=(FlowLayout)view.findViewById(R.id.itemFlowLayout);
holder.FL.setTag(list.get(position));
视图.设置标签(支架);
游戏集GS=(游戏集)列表。获取(位置);
ArrayList normal=GS.getNormalNum();
如果(正常!=null){
对于(int x=0;x
我现在面临的问题是,当我向数组中添加新数据并调用
notifyDataSetChanged()
;在
arrayAdaptor
上,没有添加新项。

我会尝试添加

  GameSet GS = (GameSet) list.get(position);

  if (convertView == null) {}

例如在
getView()
方法的开始处,因为在使用列表一段时间后
convertView
可能不再是
null

需要更改getView方法,以下是解决方案:

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

        if (convertView == null) {
            holder = new ViewHolder();
            LayoutInflater inflator = context.getLayoutInflater();
            view = inflator.inflate(R.layout.numbergenerationitemlayout,
                    parent, false);
            holder.FL = (FlowLayout) view.findViewById(R.id.itemFlowLayout);
            holder.FL.setTag(list.get(position));
            view.setTag(holder);

            GameSet GS = (GameSet) list.get(position);
            ArrayList<Element> normal = GS.getNormalNum();
            if (normal != null) {
                for (int x = 0; x < normal.size(); x++) {
                    BallTextView BT = new BallTextView(context, "BLUE_BALL");
                    holder.FL.addView(BT);
                  //here only add the view that holds the content.
                }
            }

            ArrayList<Element> special = GS.getSpecialNum();
            if (special != null) {
                for (int x = 0; x < special.size(); x++) {
                    BallTextView BT = new BallTextView(context, "ORANGE_BALL");
                   //here only add the view that holds the content.
                    holder.FL.addView(BT);
                }
            }
        } else {
            view = convertView;
            // ((ViewHolder) view.getTag()).FL.setTag(list.get(position));
        }
        ViewHolder currentHolder = (ViewHolder) view.getTag();
        currentHolder.position = position;


       //Now do the set text part over here.

        return view;
    }
@覆盖
公共视图getView(int位置、视图转换视图、视图组父视图){
视图=空;
最终持票人;
if(convertView==null){
holder=新的ViewHolder();
LayoutInflater充气器=上下文。getLayoutInflater();
视图=充气机。充气(R.layout.numbergenerationitemlayout,
父母,假);
holder.FL=(FlowLayout)view.findViewById(R.id.itemFlowLayout);
holder.FL.setTag(list.get(position));
视图.设置标签(支架);
游戏集GS=(游戏集)列表。获取(位置);
ArrayList normal=GS.getNormalNum();
如果(正常!=null){
对于(int x=0;x
基本上只在if(convertView==null)下添加视图内容持有者,然后在条件之外执行setText数据部分

@Override
public int getCount() {
    if (hasMore) {
        return (int) (Math.ceil((mData.length / 4.0))) + 1;
    } else {
        return (int) (Math.ceil((mData.length / 4.0)));
    }
}

 @Override
public View getView(int position, View convertView, ViewGroup viewGroup) {
    if (position == getCount() - 1 && hasMore) {
        convertView = new LinearLayout(context);
        ProgressBar progressBar = new ProgressBar(context);
        progressBar.setIndeterminateDrawable(context.getResources().getDrawable(R.anim.progress_view_grey_anim));
        ((LinearLayout) convertView).addView(progressBar);

    } else {
    }
    return convertView;
}

以下是我通常添加的进度视图。

将新数据添加到什么数组?公共游戏集ArrayAdapter(活动上下文,列表)这是适配器的构造函数。我将新数据添加到从构造函数传入的列表中。您应该直接在适配器上调用add,而不必手动调用NotifyDataSetChanged。这可能是一个选项,但这样做是否有效?为什么您的数据如此巨大?如果是这样,这意味着该适配器下的代码也需要在外部。(我添加了textview)@Ascorbin是对的,convertView是一个重用的视图,因此您的病情应该只包含充气和设置标签。您还应该注意,如果使用convertView,它将已经包含许多BallTextView,您可以重用或清理这些BallTextView。问题是,如果我向列表中添加新数据,还需要添加新的BallTextView。