Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/218.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使android listView只重绘新插入的行 我将listView与BaseAdapter一起使用 我在适配器里放了50个项目 然后,当列表向上滚动到第2行时,我会再加载50个 当我添加更多项目时,我执行adpater.notifyDatasetChanged() 然后我做listView.setSelection(50)_Android_Android Listview - Fatal编程技术网

如何使android listView只重绘新插入的行 我将listView与BaseAdapter一起使用 我在适配器里放了50个项目 然后,当列表向上滚动到第2行时,我会再加载50个 当我添加更多项目时,我执行adpater.notifyDatasetChanged() 然后我做listView.setSelection(50)

如何使android listView只重绘新插入的行 我将listView与BaseAdapter一起使用 我在适配器里放了50个项目 然后,当列表向上滚动到第2行时,我会再加载50个 当我添加更多项目时,我执行adpater.notifyDatasetChanged() 然后我做listView.setSelection(50),android,android-listview,Android,Android Listview,然而,我的问题是android正在为所有100行重新创建视图 但是我只希望从0-50绘制新的行 如果我有1000行,UI将非常慢 是否可以绘制部分行?您应该在适配器中实现视图保持器模式。下面是我的一个应用程序中实现此模式的Adapter.getView方法的示例: @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder viewHolder; if

然而,我的问题是android正在为所有100行重新创建视图

但是我只希望从0-50绘制新的

如果我有1000行,UI将非常慢


是否可以绘制部分行?

您应该在适配器中实现视图保持器模式。下面是我的一个应用程序中实现此模式的
Adapter.getView
方法的示例:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder viewHolder;

    if (convertView == null) {
        final LayoutInflater inflater = LayoutInflater.from(getContext());
        convertView = inflater.inflate(R.layout.list_item_feeling, parent, false);

        viewHolder = new ViewHolder();
        viewHolder.imageViewFeeling = (ImageView) convertView.findViewById(R.id.imageview_feeling);
        viewHolder.textViewFeeling = (TextView) convertView.findViewById(R.id.textview_feeling);

        convertView.setTag(viewHolder);
    } else {
        viewHolder = (ViewHolder) convertView.getTag();
    }

    final Feeling feeling = getItem(position);

    viewHolder.imageViewFeeling.setImageResource(feeling.getDrawable());
    viewHolder.textViewFeeling.setText(feeling.getLabel());

    return convertView;
}
ViewHolder类很简单,只包含对视图的引用:

private static class ViewHolder {
    ImageView imageViewFeeling;
    TextView textViewFeeling;
}
其思想是
inflate
findViewById
方法非常繁重,如果您已经拥有
视图
,则无需重新创建它


你也可以考虑替换<代码> ListVIEW ,它强制视图持有者模式。< /P>不应该只是重新绘制可见行吗?这些行是不是太细以至于一次可以看到50多行?不是只有7行可以同时容纳…但是当列表滚动并添加更多项目时,当我通过调试器断点查看时,会创建许多不可见的行…你能给我指一下描述如何创建行的文档吗?我可以删除这个问题。如果大多数情况下只绘制可见行,但真正的问题是如果你没有使用视图持有者模式(如我的回答中所述)您正在为屏幕上或即将出现在屏幕上的每个项目扩展布局,这可能会变得沉重并降低滚动的平滑度。@user2384694视图保持器模式的基本思想并不特定于Android。例如,我经常在C#WPF应用程序中使用它,尽管它在那里更简单,并且用了不同的名字,但想法是一样的。仅为屏幕上直接显示或即将显示的项目创建一个

视图
,然后在项目离开屏幕时重用该视图,而不是将其丢弃并创建一个新视图。