RecyclerView滚动进行更改

问题描述 投票:-1回答:1

我有一个RecyclerView,它有一个自定义适配器,可以扩展rowLayout。每行包含一个CardView,其中包含一些文本和图像作为按钮。特别是我有一个“喜欢”按钮(ImageView),因为现在只应该点击更改imageResource。

我能够在onClicklistener方法中设置onBindViewHolder(),它确实在我点击按钮时注册,但它不仅更改了按钮图像,而且还改变了其他一些按钮,当我向下滚动然后再向上第一个像按钮有时会被重置。

这是我的适配器代码。

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> implements View.OnClickListener {

    private ArrayList<WallPost> wallPosts;
    @Override
    public void onClick(View v) {

    }
    public static class ViewHolder extends RecyclerView.ViewHolder {
        public View view;
        public ViewHolder(View v) {
            super(v);
            view = v;
        }
    }
    public MyAdapter(ArrayList<WallPost> wallPosts) {
        this.wallPosts = wallPosts;
    }
    @Override
    public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,
                                                   int viewType) {
        View v = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.item_layout, parent, false);
        ViewHolder vh = new ViewHolder(v);
        return vh;
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, final int position) {
        TextView name = (TextView) holder.view.findViewById(R.id.person_name);
        TextView age = (TextView) holder.view.findViewById(R.id.person_age);
        ImageView profile = (ImageView) holder.view.findViewById(R.id.person_photo);

        TextView description = (TextView) holder.view.findViewById(R.id.description_text);
        AppCompatImageView mainImage = (AppCompatImageView) holder.view.findViewById(R.id.main_image);

        final ImageView likeButton = (ImageView) holder.view.findViewById(R.id.like_button);

        name.setText(wallPosts.get(position).getName());
        age.setText(wallPosts.get(position).getAge());
        profile.setImageResource(wallPosts.get(position).getPhotoId());

        description.setText(wallPosts.get(position).getDescription());
        mainImage.setImageResource(wallPosts.get(position).getMainPhotoId());

        likeButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                likeButton.setImageResource(R.drawable.favourite_red);
            }
        });
    }

    @Override
    public int getItemCount() {
        return wallPosts.size();
    }
}

这是项目布局

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView xmlns:card_view="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/cv"
    android:layout_marginLeft="8dp"
    android:layout_marginRight="8dp"
    android:layout_marginBottom="10dp"
    card_view:cardCornerRadius="5dp">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="8dp"
        >

        <de.hdodenhof.circleimageview.CircleImageView
            android:layout_width="48dp"
            android:layout_height="48dp"
            android:id="@+id/person_photo"
            android:layout_alignParentLeft="true"
            android:layout_alignParentTop="true"
            android:layout_marginRight="16dp"
            android:src="@drawable/placeholderprofilepic"
            />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/person_name"
            android:text="Name"
            android:layout_toRightOf="@+id/person_photo"
            android:layout_alignParentTop="true"
            android:textSize="30sp"
            />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/person_age"
            android:text="19"
            android:layout_toRightOf="@+id/person_photo"
            android:layout_below="@+id/person_name"
            />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/description_text"
            android:text="This is the description of the image"
            android:layout_below="@id/person_age"/>


        <android.support.v7.widget.AppCompatImageView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/main_image"
            android:src="@drawable/placeholderfoodimage"
            android:layout_below="@+id/description_text"
            android:elevation="4dp"/>


        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/like_button"
            android:src="@drawable/favoruite_hollow"
            android:layout_marginTop="10dp"
            android:layout_below="@+id/main_image"
            />

    </RelativeLayout>

</android.support.v7.widget.CardView>
java android xml android-recyclerview onclicklistener
1个回答
0
投票

这是由于回收意见。你需要修改你的getView()方法并做这两件事 -

  1. 修改你的WallPost类,让它有一个标志来设置like标志。在onClickListener中设置此标志并更新您的wallPosts数据集。 wallPosts.get(position).setLike(true);
  2. 根据您在列表对象中拥有的类似标志,每次设置喜欢/不喜欢的图像资源 - if(wallPosts.get(position).isLiked()){ likeButton.setImageResource(R.drawable.favourite_red); } else{ likeButton.setImageResource(R.drawable.favoruite_hollow); }
© www.soinside.com 2019 - 2024. All rights reserved.