【问题标题】:Inflating layout a child view to view of custom adapter is repeating in Android在 Android 中重复将子视图的布局膨胀到自定义适配器的视图
【发布时间】:2016-03-25 21:51:03
【问题描述】:

我正在开发一个安卓应用程序。在我的应用程序中。我必须使用自定义适配器使用 Listview。即使在适配器中,我也需要扩展子视图以查看自定义适配器。但是我像寻呼机一样逐段将项目加载到列表视图中。但是当加载新的项目段时,子视图会再次添加到现有的行视图中。

这是listview的初始状态:

但是当我在滚动时将新项目绑定到列表视图时,子视图是这样添加的:

这是我的自定义适配器视图:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/user_timeline_main_layout"
    android:orientation="horizontal" android:layout_width="match_parent"
    android:layout_height="match_parent">
    <LinearLayout
        android:gravity="center"
        android:orientation="vertical"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">
        <de.hdodenhof.circleimageview.CircleImageView
            android:id="@+id/civ_timeline_profile"
            android:layout_width="50dp"
            android:layout_height="50dp" />
    </LinearLayout>
    <LinearLayout
        android:orientation="vertical"
        android:layout_weight="1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">
        <LinearLayout
            android:orientation="horizontal"
            android:id="@+id/timeline_reason_container"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
            <TextView
                android:id="@+id/tv_timeline_username"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />
            <TextView
                android:id="@+id/tv_timeline_reason"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />
            <TextView
                android:id="@+id/tv_timeline_datetime"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />
        </LinearLayout>
        <LinearLayout
            android:id="@+id/timeline_action_content_container"
            android:orientation="vertical"
            android:layout_width="match_parent"
            android:layout_height="match_parent">

        </LinearLayout>
    </LinearLayout>
</LinearLayout>

这是timeline_item.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TextView
        android:text="This is item"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
</LinearLayout>

timeline_designer.xml 与timeline_item.xml 相同。

这是我的自定义适配器:

public class UserTimelineAdapter extends ArrayAdapter<TimelineItem> {

    private Context context;
    private ArrayList<TimelineItem> values;

    static class ViewHolder{
        public CircleImageView civProfile;
        public TextView tvUsername;
        public TextView tvReason;
        public TextView tvDatetime;
        public LinearLayout actionContentContainer;
        public LinearLayout mainLayout;
    }

    public UserTimelineAdapter(Context contextParam,ArrayList<TimelineItem> valuesParam)
    {
        super(contextParam,-1,valuesParam);
        this.context = contextParam;
        this.values = valuesParam;
    }
    @Override
    public View getView(final int position,View convertView,ViewGroup parent)
    {
        LayoutInflater layoutInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View rowView = convertView;
        final ViewHolder viewHolder;
        if(rowView==null)
        {
            rowView = layoutInflater.inflate(R.layout.user_timeline_row,null);

            viewHolder = new ViewHolder();
            viewHolder.mainLayout = (LinearLayout)rowView.findViewById(R.id.user_timeline_main_layout);
            viewHolder.civProfile = (CircleImageView)rowView.findViewById(R.id.civ_timeline_profile);
            viewHolder.tvUsername = (TextView)rowView.findViewById(R.id.tv_timeline_username);
            viewHolder.tvReason = (TextView)rowView.findViewById(R.id.tv_timeline_reason);
            viewHolder.tvDatetime = (TextView)rowView.findViewById(R.id.tv_timeline_datetime);
            viewHolder.actionContentContainer = (LinearLayout)rowView.findViewById(R.id.timeline_action_content_container);
            rowView.setTag(viewHolder);
        }
        else{
            viewHolder  = (ViewHolder) rowView.getTag();
        }

        if(values.get(position).getProfileImagePath().isEmpty())
        {
            viewHolder.civProfile.setImageResource(R.drawable.default_designer_profile);
        }
        else{
            Picasso.with(context).load(values.get(position).getProfileImagePath()).into(viewHolder.civProfile);
        }

        viewHolder.tvUsername.setText(values.get(position).getUsername());
        viewHolder.tvReason.setText(values.get(position).getReason());
        viewHolder.tvDatetime.setText(values.get(position).getDatetime());

        if(values.get(position).getItemId()>0)
        {
            View view = layoutInflater.inflate(R.layout.timeline_item,viewHolder.mainLayout,false);
            viewHolder.actionContentContainer.addView(view);
        }
        else{
            //designer
            View view = layoutInflater.inflate(R.layout.timeline_designer,viewHolder.mainLayout,false);
            viewHolder.actionContentContainer.addView(view);
        }

        return rowView;
    }

}

为什么会这样?如何修复我的代码?

【问题讨论】:

    标签: android listview android-adapter


    【解决方案1】:

    我认为你通过使用视图标签的模式来重用主视图,但是在重用的视图上你仍然每次都膨胀并添加另一个视图:

    if(values.get(position).getItemId()>0)
    {
        View view = layoutInflater.inflate(R.layout.timeline_item,viewHolder.mainLayout,false);
        viewHolder.actionContentContainer.addView(view);
    }
    

    因此,不要在重复使用的视图上膨胀此项目(即当rowView != null 时),如果您需要更新它的文本,或者无论如何更改它,请尝试通过rowView.findViewById(R.id.timeline_item_id); 之类的方式查找此视图。

    如果您不需要更改它,只需不要查找它并且不要膨胀和添加。

    【讨论】:

    • 我很快就会给出答案。
    猜你喜欢
    • 2013-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多