android listview视图。 何时使用它,何时不使用

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

Related of "android listview视图。 何时使用它,何时不使用"

不过,我遇到的问题是,当我滚动列表,我看到列表中的数据显示在错误的行(即一个TextView,应该在第10行显示在第2行为例)。

最有可能的是,你不正确地回收你的行, ViewHolders你正在操作的ViewHolders不适合你正在返回的行。

这里是我的一本书的免费摘录 ,它更多地介绍了行回收 – 也许它会帮助您识别出现问题的地方。

  • 我面临同样的问题
  • 使用下面的技术解决
  • 原因:适配器没有加载频繁。
  • 在您的自定义适配器类中添加使用访问说明符的ViewHolder

     private static class ViewHolder { protected TextView itemName; } 

Get View方法中

  @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对象外,我们不应该为视图对象设置任何标签

所以我想我在这里发现了真正的问题。 当您为每一行设置布局参数时,您需要确保您在所有情况下都能执行此操作。 我的问题是,如果它是第一行,我设置一个布局参数(如填充或边距等),但如果这是一个中间行,我没有明确设置这些参数,认为它会使用什么是充气由视图inflater。 这就解释了为什么当我每次膨胀视图的时候都有效。 这是一个前后:

之前:

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

AFTER:`

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