Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/217.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视图持有者。何时使用,何时不使用_Android_Listview_Listviewitem - Fatal编程技术网

android listview视图持有者。何时使用,何时不使用

android listview视图持有者。何时使用,何时不使用,android,listview,listviewitem,Android,Listview,Listviewitem,我有一个带有自定义列表适配器的ListView。在getView()方法中,我使用ViewHolder“模式”,如ListView14.java的API演示所示。当我第一次呈现列表时,它似乎加载正确。然而,我遇到的问题是,当我滚动列表时,我看到列表的数据显示在错误的行中(例如,第10行中的TextView显示在第2行中)。但是,如果我不使用viewholder,而是每次调用findViewById(),则列表视图将正确呈现 然而,我遇到的问题是 当我滚动列表时,我 查看列表的数据显示 在错误的行

我有一个带有自定义列表适配器的ListView。在getView()方法中,我使用ViewHolder“模式”,如ListView14.java的API演示所示。当我第一次呈现列表时,它似乎加载正确。然而,我遇到的问题是,当我滚动列表时,我看到列表的数据显示在错误的行中(例如,第10行中的TextView显示在第2行中)。但是,如果我不使用viewholder,而是每次调用findViewById(),则列表视图将正确呈现

然而,我遇到的问题是 当我滚动列表时,我 查看列表的数据显示 在错误的行中(即文本视图 那应该在第10行出现了 例如,在第2行中)

最有可能的情况是,您不正确地循环使用了行,因此您正在处理的
视图持有者不适合返回的行


从我的一本书中,我们了解了更多关于行回收的知识——也许它能帮助你发现哪里出了问题。

所以我想我在这里发现了真正的问题。为每行动态设置布局参数时,需要确保在所有条件下都这样做。我的问题是,如果它是第一行,我设置了一个布局参数(如填充或边距等),但如果它是中间行,我没有明确设置这些参数,认为它只会使用视图充气器充气的内容。这就解释了为什么每次膨胀视图时它都会起作用。以下是一个前后对比:

之前:

if (position == 0) {

            layoutParams.topMargin = uiHelper.getDip(15.0f);
            layoutParams.addRule(RelativeLayout.ALIGN_PARENT_TOP,
                    RelativeLayout.TRUE);
            holder.actionMenu.setLayoutParams(layoutParams);

            holder.contentLayout.setBackgroundResource(R.drawable.top_row);

        } else if (position == posts.size() - 1) {
            holder.contentLayout
                    .setBackgroundResource(R.drawable.bottom_row);

            holder.contentLayout.setPadding(holder.contentLayout
                    .getPaddingLeft(),
                    holder.contentLayout.getPaddingTop(),
                    holder.contentLayout.getPaddingRight(),
                    holder.contentLayout.getPaddingBottom() +  uiHelper.getDip(10.0f));

        } else {
            holder.contentLayout
                    .setBackgroundResource(R.drawable.inner_row);
        }
之后:`

            layoutParams.topMargin = uiHelper.getDip(10.0f);
        holder.contentLayout.setPadding(holder.contentLayout
                .getPaddingLeft(),
                holder.contentLayout.getPaddingTop(),
                holder.contentLayout.getPaddingRight(),
                uiHelper.getDip(10.0f));
        if (position == 0) {

            layoutParams.topMargin = uiHelper.getDip(15.0f);
            layoutParams.addRule(RelativeLayout.ALIGN_PARENT_TOP,
                    RelativeLayout.TRUE);

            holder.contentLayout.setBackgroundResource(R.drawable.top_row);

        } else if (position == posts.size() - 1) {
            holder.contentLayout
                    .setBackgroundResource(R.drawable.bottom_row);

            holder.contentLayout.setPadding(holder.contentLayout
                    .getPaddingLeft(),
                    holder.contentLayout.getPaddingTop(),
                    holder.contentLayout.getPaddingRight(),
                    uiHelper.getDip(20.0f));

        } else {

            holder.contentLayout
                    .setBackgroundResource(R.drawable.inner_row);

        }

        holder.actionMenu.setLayoutParams(layoutParams);
  • 我也面临同样的问题
  • 使用以下技术解决
  • 原因:适配器未频繁加载
  • 在自定义适配器类中,使用访问说明符添加ViewHolder

    private static class ViewHolder {
    
            protected TextView itemName;
    
        }
    
获取视图方法中

    @Override

        public View getView(int position, View view, ViewGroup viewGroup) {

            // create a ViewHolder reference
            ViewHolder holder;

            //check to see if the reused view is null or not, if is not null then reuse it
            if (view == null) {
                holder = new ViewHolder();

                view = mLayoutInflater.inflate(R.layout.list_item, null);
                holder.itemName = (TextView) view.findViewById(R.id.list_item_text_view);

                // the setTag is used to store the data within this view
                view.setTag(holder);
            } else {
                // the getTag returns the viewHolder object set as a tag to the view
                holder = (ViewHolder)view.getTag();
            }
    // now Use Holder object toget Idss 

    holder.itemName.setText(" sample text based on position ");
    }
重要提示:我们不应该为视图对象设置任何标记,但Viewholder对象除外