android - ViewHolder 在偶数和奇数位置膨胀布局

标签 android android-listview android-viewholder

我需要两个布局来使用 ViewHolder 根据 ListView 项的偶数和奇数位置进行膨胀。在偶数位置我需要一个不同的布局,在奇数位置我需要另一个具有相同元素但布局不同的布局。我实现了它,但是,它为我提供了不同位置的随机布局,而不管它们的位置如何。需要做什么来解决它。谢谢。

public SimpleAdapter(ArrayList<WishListData> wishDataList, Context context,
        ListView swipelistview) {
    super(context, android.R.layout.simple_list_item_1, wishDataList);
    notifyDataSetChanged();
    SimpleAdapter.wishListData = wishDataList;
    this.swipelistview = swipelistview;

    mPreferences = new Preferences(context);
    SCREEN_WIDTH = mPreferences.getScreenWidth();
    SCREEN_HEIGHT = mPreferences.getScreenHeight();
    mFunctions = new UserFunctions();
    this.context = context;
    imageloader1 = new ImageLoader1(context);
    userImageLoader = new UserImageLoader(context); 

}

@Override
public View getView(final int position, View convertView, ViewGroup parent) {

    ViewHolder viewHolder = null;
    View row = convertView;
    if (row == null) {
        LayoutInflater inflater = ((Activity) context).getLayoutInflater();
        System.out.println("position "+ position);
        if ((position % 2) == 0) {

            row = inflater.inflate(R.layout.single_wish_view_right, parent,
                    false);

        } else if ((position % 2) == 1){
            row = inflater
                    .inflate(R.layout.single_wish_view, parent, false);

        }
        viewHolder = new ViewHolder();
        viewHolder.back = (LinearLayout) row
                .findViewById(R.id.back);
        viewHolder.lenear = (LinearLayout) row
                .findViewById(R.id.linear);

        viewHolder.front = (RelativeLayout) row
                .findViewById(R.id.front);
        viewHolder.likeButton = (ImageButton) row
                .findViewById(R.id.likemain);
        viewHolder.deathWish = (TextView) row
                .findViewById(R.id.death_wish);
        viewHolder.time = (TextView) row
                .findViewById(R.id.time_wish);
        viewHolder.name = (TextView) row.findViewById(R.id.name1);
        viewHolder.commentButton = (ImageButton) row
                .findViewById(R.id.comment);
        viewHolder.shareButton = (ImageButton) row
                .findViewById(R.id.sharemain);
        viewHolder.helpButton = (ImageButton) row
                .findViewById(R.id.help);

        viewHolder.profilePic = (ImageView) row
                .findViewById(R.id.profile_image);
        viewHolder.likecount = (TextView) row
                .findViewById(R.id.likecountadapter);
        commentcount = (TextView) row
                .findViewById(R.id.commentcountadapter);
        viewHolder.tagImg = (ImageView) row
                .findViewById(R.id.tag_arrow);
        viewHolder.image1 = (ImageView) row
                .findViewById(R.id.image1);
        viewHolder.image2 = (ImageView) row
                .findViewById(R.id.image2);
        row.setTag(viewHolder);
    } else {
        viewHolder = (ViewHolder) row.getTag();
    }
    mWishesData = wishListData.get(position);
    viewHolder.wishlikecount = mWishesData.getDeathWishLike();


    if ((position % 4) == 0) {
        viewHolder.lenear.setBackgroundColor(Color.rgb(255, 168, 0));
        viewHolder.back.setBackgroundResource(R.drawable.a2bg);
        viewHolder.tagImg.setBackgroundResource(R.drawable.a11);
        viewHolder.front.setBackgroundColor(Color.rgb(255, 168, 0));

    } else if ((position % 4) == 1) {
        viewHolder.lenear.setBackgroundColor(Color.rgb(253, 81, 43));
        viewHolder.back.setBackgroundResource(R.drawable.a3bg);
        viewHolder.tagImg.setBackgroundResource(R.drawable.a21);
        viewHolder.front.setBackgroundColor(Color.rgb(253, 81, 43));

        // viewHolder.Adlayout.invalidate();
        // viewHolder.Adlayout.setVisibility(View.GONE);
    } else if ((position % 4) == 2) {
        viewHolder.lenear.setBackgroundColor(Color.rgb(155, 89, 182));
        viewHolder.back.setBackgroundResource(R.drawable.a4bg);
        viewHolder.tagImg.setBackgroundResource(R.drawable.a31);
        viewHolder.front.setBackgroundColor(Color.rgb(155, 89, 182));

    } else if ((position % 4) == 3) {
        viewHolder.lenear.setBackgroundColor(Color.rgb(46, 204, 113));
        viewHolder.back.setBackgroundResource(R.drawable.a1bg);
        viewHolder.tagImg.setBackgroundResource(R.drawable.a41);
        viewHolder.front.setBackgroundColor(Color.rgb(46, 204, 113));
    }

View 持有者:

public static class ViewHolder {
    public int wishlikecount;
    public int wishcommentcount;
    LinearLayout back, lenear;
    RelativeLayout front;
    TextView deathWish;
    ImageButton likeButton, commentButton, shareButton, helpButton;
    TextView time, name, likecount;
    ImageView tagImg, image1, image2, profilePic;
}

最佳答案

问题是当 View 被回收时,ListView 可以在您期望“左”布局时返回“右”布局。你应该覆盖 getItemViewType()getViewTypeCount()在您的适配器实现中;这些方法确保 ListView 在向 getView()

提供回收 View 时为您提供适当的 View 类型
@Override
public int getViewTypeCount() {
    // return the total number of view types. this value should never change at runtime
    return 2;
}

@Override
public int getItemViewType(int position) {
    // return a value between 0 and (getViewTypeCount - 1)
    return position % 2;
}

@Override
public View getView(int position, View convertView, ViewGroup container) {
    int layoutResource; // determined by view type
    int viewType = getItemViewType(position);
    switch(viewType) {
    case 0:
        layoutResource = R.layout.list_item_even; break;
    case 1:
        layoutResource = R.layout.list_item_odd; break;
    }

    ViewHolder holder;
    if (convertView != null) {
        holder = (ViewHolder) convertView.getTag();
    } else {
        convertView = inflater.inflate(layoutResource, container, false);
        holder = new ViewHolder();
        ...
        convertView.setTag(holder);
    }
    ...
    return convertView;
}

关于android - ViewHolder 在偶数和奇数位置膨胀布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26480433/

相关文章:

android - 如何从 Recyclerview.ViewHolder 调用后端

Android Viewholder 实现

android - 设置状态栏时 View 隐藏

android - 具有 20 种不同类型的行的 ListView( Activity 提要),每行有 20 个不同的 View

android - 将数据添加到 fragment 的 ListView

java - 将 HashMap 中的字符串传递给另一个 Activity

android - android中 "ViewHolder"类的问题

java - Android:如何防止开发人员选项在下次启动时重置?

android - API级别14的Firebase云依赖关系

android - Flutter Gridview 不更新来自 firebase 的值