Android 如果不充气,我应该在阵列适配器中使用convertView吗?

Android 如果不充气,我应该在阵列适配器中使用convertView吗?,android,android-arrayadapter,convertview,Android,Android Arrayadapter,Convertview,我看到很多关于在适配器中使用convertView有用性的帖子,比如,或(以及其他许多…) 我有一个ArrayAdapter,但我从头开始创建视图,使用一个简单的水平线性布局,在其中添加一些文本视图。文本视图的数量及其权重取决于列表中的位置。第一排可能有3台电视机,第二排7台,第三排25台,根据数据库的不同,每台电视机的重量不同 在这种情况下,由于我不能膨胀任何东西,convertView包含什么 我应该用它吗?如果是的话,我怎么能 编辑:这是我的代码: @Override public Vie

我看到很多关于在适配器中使用convertView有用性的帖子,比如,或(以及其他许多…)

我有一个ArrayAdapter,但我从头开始创建视图,使用一个简单的水平线性布局,在其中添加一些文本视图。文本视图的数量及其权重取决于列表中的位置。第一排可能有3台电视机,第二排7台,第三排25台,根据数据库的不同,每台电视机的重量不同

在这种情况下,由于我不能膨胀任何东西,convertView包含什么

我应该用它吗?如果是的话,我怎么能

编辑:这是我的代码:

@Override
public View getView(final int position, View convertView, ViewGroup parent){
    LinearLayout layout = new LinearLayout(context);
    for (int i = 0; i < totalTVNumber; i++) {
        LifeEvent event = getEventFromDB(cost, position);
        if (event != null) {
            TextView eventTV = event.getTextView(getContext());
            eventTV.setLayoutParams(new LinearLayout.LayoutParams(0, 100, weight));//0 en width sinon weight n'est pas pris en compte !!
            layout.addView(eventTV);
        }
    }
}
@覆盖
公共视图getView(最终整数位置、视图转换视图、视图组父视图){
LinearLayout布局=新的LinearLayout(上下文);
对于(int i=0;i
ArrayAdapter会自动为您回收视图。因此,在使用阵列适配器的情况下,您不需要自行处理。请参考我从ArrayAdapter.java中提取的以下代码。你可能会从中得到澄清

public View getView(int position, View convertView, ViewGroup parent) {
        return createViewFromResource(mInflater, position, convertView, parent, mResource);
    }

    private View createViewFromResource(LayoutInflater inflater, int position, View convertView,
            ViewGroup parent, int resource) {
        View view;
        TextView text;

        if (convertView == null) {
            view = inflater.inflate(resource, parent, false);
        } else {
            view = convertView;
        }

        try {
            if (mFieldId == 0) {
                //  If no custom field is assigned, assume the whole resource is a TextView
                text = (TextView) view;
            } else {
                //  Otherwise, find the TextView field within the layout
                text = (TextView) view.findViewById(mFieldId);
            }
        } catch (ClassCastException e) {
            Log.e("ArrayAdapter", "You must supply a resource ID for a TextView");
            throw new IllegalStateException(
                    "ArrayAdapter requires the resource ID to be a TextView", e);
        }

        T item = getItem(position);
        if (item instanceof CharSequence) {
            text.setText((CharSequence)item);
        } else {
            text.setText(item.toString());
        }

        return view;
    }

ArrayAdapter会自动为您循环使用视图。因此,在使用阵列适配器的情况下,您不需要自行处理。请参考我从ArrayAdapter.java中提取的以下代码。你可能会从中得到澄清

public View getView(int position, View convertView, ViewGroup parent) {
        return createViewFromResource(mInflater, position, convertView, parent, mResource);
    }

    private View createViewFromResource(LayoutInflater inflater, int position, View convertView,
            ViewGroup parent, int resource) {
        View view;
        TextView text;

        if (convertView == null) {
            view = inflater.inflate(resource, parent, false);
        } else {
            view = convertView;
        }

        try {
            if (mFieldId == 0) {
                //  If no custom field is assigned, assume the whole resource is a TextView
                text = (TextView) view;
            } else {
                //  Otherwise, find the TextView field within the layout
                text = (TextView) view.findViewById(mFieldId);
            }
        } catch (ClassCastException e) {
            Log.e("ArrayAdapter", "You must supply a resource ID for a TextView");
            throw new IllegalStateException(
                    "ArrayAdapter requires the resource ID to be a TextView", e);
        }

        T item = getItem(position);
        if (item instanceof CharSequence) {
            text.setText((CharSequence)item);
        } else {
            text.setText(item.toString());
        }

        return view;
    }
convertView包含哪些内容

它包含一个过去的
视图
,该视图是您从头开始创建的,已从屏幕上滚动下来,可以循环使用

我应该用它吗

好的,谢谢

如果是的话,我怎么能

和其他人一样。您直接创建视图而不是通过通货膨胀创建视图这一事实并不重要

所以,你可以这样做:

class YourAdapter extends ArrayAdapter<Whatever> {
    @Override
    public View getView(int position, View convertView,
                          ViewGroup parent) {
      if (convertView==null) {
        convertView=newView(parent);
      }

      bindView(position, convertView);

      return(convertView);
    }

    private View newView(ViewGroup parent) {
      // create and return your new View
    }

    private void bindView(int position, View row) {
      // populate the widgets of your new or recycled view
    }
  }
class YourAdapter扩展了ArrayAdapter{
@凌驾
公共视图getView(int位置,视图转换视图,
视图组(父级){
if(convertView==null){
convertView=newView(父级);
}
bindView(位置,转换视图);
返回(转换视图);
}
私有视图新建视图(视图组父视图){
//创建并返回新视图
}
私有void bindView(int位置,视图行){
//填充新视图或回收视图的小部件
}
}
convertView包含哪些内容

它包含一个过去的
视图
,该视图是您从头开始创建的,已从屏幕上滚动下来,可以循环使用

我应该用它吗

好的,谢谢

如果是的话,我怎么能

和其他人一样。您直接创建视图而不是通过通货膨胀创建视图这一事实并不重要

所以,你可以这样做:

class YourAdapter extends ArrayAdapter<Whatever> {
    @Override
    public View getView(int position, View convertView,
                          ViewGroup parent) {
      if (convertView==null) {
        convertView=newView(parent);
      }

      bindView(position, convertView);

      return(convertView);
    }

    private View newView(ViewGroup parent) {
      // create and return your new View
    }

    private void bindView(int position, View row) {
      // populate the widgets of your new or recycled view
    }
  }
class YourAdapter扩展了ArrayAdapter{
@凌驾
公共视图getView(int位置,视图转换视图,
视图组(父级){
if(convertView==null){
convertView=newView(父级);
}
bindView(位置,转换视图);
返回(转换视图);
}
私有视图新建视图(视图组父视图){
//创建并返回新视图
}
私有void bindView(int位置,视图行){
//填充新视图或回收视图的小部件
}
}

您是否会夸大您从头创建的这个视图?不,电视的数量和重量取决于数据库和列表中的位置为什么代码中没有返回视图语句?这是一个编译错误,对吗?你不会夸大你从头创建的这个视图吗?不,tv的数量和重量取决于数据库和列表中的位置为什么你的代码中没有returnview语句?这是一个编译错误,对吗?好的,那么convertview包含一个带有TextView的linearlayout。使用convertView就像获取布局、删除文本视图并添加其他视图,这有什么价值?(或者可能我没有得到什么:s)@DanChaltiel:“使用convertView就像获取布局,删除文本视图并添加其他视图”--不。您检索
textView
,并对其调用
setText()
,用您希望的新文本替换现有文本。在我的答案中的代码框架中,您可以在
bindView()
中完成这项工作,无论
是来自通货膨胀、回收还是全新的东西。如果您希望简化对
文本视图
小部件的访问,请随意使用。糟糕的是,我没有添加足够的详细信息,但正如我所说的@Farbod,我的文本视图的数量和权重取决于列表中的位置。如果这和我对你文章的理解一样,那么最好从XML中膨胀出来,不是吗?如果你想的话,我添加了一些代码check@DanChaltiel:“我的文本视图的数量和权重取决于列表中的位置”--它需要取决于通过
getItemViewType()返回的
ListAdapter
的视图类型。否则,回收利用将不起作用。而且,如果您不打算回收行,则不清楚使用
ListView
是否是合适的解决方案。我习惯于使用ListView,并且
getView()
对于思考视图很方便,但不知怎的,您是对的,我可以使用带有嵌套布局的垂直滚动视图。。。不过,作为最后一个答案,我不能在我的情况下使用convertView,对吗?好的,所以convertView包含一个带有文本视图的线性布局。使用convertView就像获取布局、删除文本视图并添加其他视图,这有什么价值?(或者可能我没有得到什么:s)@DanChaltiel:“使用convertView就像得到t