Android recyclerview在每次活动创建时添加重复元素

戴维·帕克斯

当我从导航抽屉中启动一个新片段时,它意味着将我带到具有匹配配置文件的cardView的主页。第一次效果很好,我想显示的每个个人资料都在那里。但是,当我离开该片段,然后再次单击它时,将重复这些元素,并且每次以后刷新页面时,这些项目都会再次重复。我相信这个问题位于我的RecyclerView适配器中的某个位置,该适配器未在创建活动时清除,但我无法查明。这是我的片段课

public class HomeFragment extends Fragment {
    private CustomListAdapter listAdapter;
    private static final String profileUrl = "http://10.0.2.2:3000/apip/buyers/profiles";
    private static final String TAG = selectBuyerProfile.class.getSimpleName();
    private ProgressDialog pDialog;
    private ListView listView;
    private List<BuyerProfile> buyersProfiles = new ArrayList<BuyerProfile>();
    private View root;
    //private RVAdapter recyclerAdapter;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        root = inflater.inflate(R.layout.fragment_home, container, false);
        return root;
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        RecyclerView rv = (RecyclerView) getActivity().findViewById(R.id.rv);
        //rv.addItemDecoration(new DividerItemDecoration(getActivity(), DividerItemDecoration.VERTICAL_LIST));
        rv.setHasFixedSize(true);
        LinearLayoutManager llm = new LinearLayoutManager(getActivity());
        rv.setLayoutManager(llm);
        rv.setItemAnimator(new DefaultItemAnimator());
        final RVAdapter recyclerAdapter = new RVAdapter(buyersProfiles);
        rv.setAdapter(recyclerAdapter);

        RequestQueue mRequestQueue;

        Cache cache = new DiskBasedCache(getActivity().getCacheDir(), 1024 * 1024);

        Network network = new BasicNetwork(new HurlStack());
        mRequestQueue = new RequestQueue(cache, network);
        mRequestQueue.start();


        JsonArrayRequest profileRequest = new JsonArrayRequest(profileUrl,
                new Response.Listener<JSONArray>() {
                    @Override
                    public void onResponse(JSONArray response) {
                        // Parsing json
                        for(int i = 0; i < response.length(); i++) {
                            try {
                                JSONObject obj = response.getJSONObject(i);
                                BuyerProfile parsedProfile = new BuyerProfile();
                                parsedProfile.setBuyerProfTitle(obj.getString("title"));
                                parsedProfile.setDescription(obj.getString("description"));
                                parsedProfile.setLocations(obj.getString("locations"));
                                parsedProfile.setAssetTypes(obj.getString("asset_type"));
                                parsedProfile.setPropertyStatuses(obj.getString("property_status"));
                                //parsedProfile.setBuyerId("Select");
                                buyersProfiles.add(parsedProfile);
                            } catch (Exception e) {
                                e.printStackTrace();
                            }
                        }
                        recyclerAdapter.notifyDataSetChanged();
                        // notifying list adapter about data changes
                        // so that it renders the list view with updated data
                        //hidePDialog();
                    }
                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                //Toast.makeText(selectBuyerProfile.this,"Error",Toast.LENGTH_LONG).show();

            }
        });
        mRequestQueue.add(profileRequest);

    }
}

这是我的RVAdapter类

public class RVAdapter extends RecyclerView.Adapter<RVAdapter.PersonViewHolder> {

    private Activity activity;
    private LayoutInflater inflater;
    private List<BuyerProfile> profileItems;
    private static boolean itemFavorited;

    RVAdapter(List<BuyerProfile> profiles) {
        this.profileItems = profiles;
    }

    public static class PersonViewHolder extends RecyclerView.ViewHolder {
        TextView name;
        TextView description;
        TextView locations;
        TextView id;
        TextView investmentRangeMin;
        TextView investmentRangeMax;
        TextView assetTypes;
        TextView propertyStatuses;
        ImageView favoriteButton;
        CardView cardView;
        PersonViewHolder(View itemView) {
            super(itemView);
            name = (TextView) itemView.findViewById(R.id.titleText);
            description = (TextView) itemView.findViewById(R.id.descriptionText);
            investmentRangeMin = (TextView) itemView.findViewById(R.id.investmentRangeMin);
            investmentRangeMax = (TextView) itemView.findViewById(R.id.investmentRangeMax);
            locations = (TextView) itemView.findViewById(R.id.locations);
            id = (TextView) itemView.findViewById(R.id.profileNumber);
            assetTypes = (TextView) itemView.findViewById(R.id.assetTypes);
            propertyStatuses = (TextView) itemView.findViewById(R.id.propertyStatuses);
            favoriteButton = (ImageView) itemView.findViewById(R.id.favorite_select);
            cardView = (CardView) itemView.findViewById(R.id.cv);
            //User selects favorite on a matched profile
            itemFavorited = false;
            favoriteButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if(!itemFavorited) {
                        favoriteButton.setImageResource(R.drawable.ic_favorite);
                        //cardView.setCardBackgroundColor(R.color.colorPrimary);
                        itemFavorited = true;
                    } else {
                        favoriteButton.setImageResource(R.drawable.ic_favorite_border);
                        itemFavorited = false;
                    }
                }
            });
        }
    }

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

    @Override
    public PersonViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item, viewGroup, false);
        PersonViewHolder pvh = new PersonViewHolder(v);
        return pvh;
    }

    @Override
    public void onBindViewHolder(PersonViewHolder personViewHolder, int i) {
        personViewHolder.name.setText(profileItems.get(i).getBuyerProfTitle());
        personViewHolder.description.setText(profileItems.get(i).getDescription());
        personViewHolder.locations.setText(profileItems.get(i).getLocations());
        personViewHolder.assetTypes.setText(profileItems.get(i).getAssetTypes());
        personViewHolder.propertyStatuses.setText(profileItems.get(i).getPropertyStatuses());
    }

    @Override
    public void onAttachedToRecyclerView(RecyclerView recyclerView) {
        super.onAttachedToRecyclerView(recyclerView);
    }

    /*
    @Override
    public Object getItem(int location) {
        return profileItems.get(location);
    }
    */

    @Override
    public long getItemId(int position) {
        return position;
    }

}

最后是我的片段XML

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="wrap_content"
              xmlns:card_view="http://schemas.android.com/apk/res-auto"
              android:padding="0dp"
    >
            <RelativeLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:padding="8dp"
                >
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="Matches"
                    android:layout_alignParentTop="true"
                    android:layout_alignParentEnd="false"
                    android:id="@+id/matchesText"
                    android:textAlignment="center"
                    android:textSize="20dp"
                    android:textColor="@color/navigationBarColor"
                    android:layout_alignParentStart="false"
                    android:layout_alignParentBottom="false"
                    android:layout_alignParentLeft="false"
                    android:layout_alignParentRight="true"/>

                    <android.support.v7.widget.RecyclerView
                        android:layout_width="match_parent"
                        android:layout_height="match_parent"
                        android:id="@+id/rv"
                        android:layout_below="@id/matchesText"
                        />
                        <!-- Thumbnail Image -->
                        <ImageView
                            android:id="@+id/imgBillionaire"
                            android:src="@drawable/ic_perm_identity"
                            android:layout_width="80dp"
                            android:layout_height="80dp"
                            android:layout_alignParentLeft="true"
                            android:layout_marginRight="8dp"
                            android:layout_alignParentEnd="false"
                            android:layout_alignParentStart="true"
                            android:nestedScrollingEnabled="false"
                            android:visibility="invisible"/>

                        <!-- Name of Asset -->
                        <TextView
                            android:id="@+id/titleText"
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_alignTop="@+id/imgBillionaire"
                            android:layout_toRightOf="@+id/imgBillionaire"
                            android:textSize="@dimen/Title"
                            android:textStyle="bold" />

                        <!-- Description -->
                        <TextView
                            android:id="@+id/descriptionText"
                            android:layout_width="fill_parent"
                            android:layout_height="wrap_content"
                            android:layout_below="@id/titleText"
                            android:layout_marginTop="1dip"
                            android:layout_toRightOf="@+id/imgBillionaire"
                            android:textSize="@dimen/Description" />

                        <!-- Source -->
                        <TextView
                            android:id="@+id/locations"
                            android:layout_width="fill_parent"
                            android:layout_height="wrap_content"
                            android:layout_below="@id/descriptionText"
                            android:layout_marginTop="5dp"
                            android:layout_toRightOf="@+id/imgBillionaire"
                            android:textColor="@color/wealthsource"
                            android:textSize="@dimen/InvestmentRange" />

                        <!-- Source -->
                        <TextView
                            android:id="@+id/assetTypes"
                            android:layout_width="fill_parent"
                            android:layout_height="wrap_content"
                            android:layout_below="@id/locations"
                            android:layout_marginTop="5dp"
                            android:layout_toRightOf="@+id/imgBillionaire"
                            android:textColor="@color/wealthsource"
                            android:textSize="@dimen/InvestmentRange" />

                        <!-- Source -->
                        <TextView
                            android:id="@+id/propertyStatuses"
                            android:layout_width="fill_parent"
                            android:layout_height="wrap_content"
                            android:layout_below="@id/assetTypes"
                            android:layout_marginTop="5dp"
                            android:layout_toRightOf="@+id/imgBillionaire"
                            android:textColor="@color/wealthsource"
                            android:textSize="@dimen/InvestmentRange" />

                        <!-- Year -->
                        <TextView
                            android:id="@+id/profileNumber"
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_alignParentBottom="false"
                            android:layout_alignParentRight="true"
                            android:textColor="@color/year"
                            android:textSize="@dimen/Date" />
            </RelativeLayout>


</LinearLayout>

有什么想法为什么我的recyclerview中的项目会在每个页面上不断重复刷新?

埃里克

可能发生的情况是,每次网络请求返回时,它都会尝试将每个新项目添加到该片段内已存在的列表中。

根据您实现导航逻辑的方式,一旦您离开该片段,它就不会被系统破坏,而是调用一系列生命周期回调:

onPause() -> onStop() -> onDestroyView()

当您返回到片段时,所有必需的生命周期回调将被调用,直到达到活动状态为止。

onCreateView() -> onActivityCreated() -> onStart() -> onResume()

有关片段生命周期工作的更多信息,请参见:https//developer.android.com/guide/components/fragments.html

由于您的片段不会被销毁和重新创建,因此buyersProfiles返回时引用可能包含先前的数据。由于网络调用不会覆盖原始列表,因此每次调用onResponse回调时,它将将从网络获取的新数据附加到现有数据旁边

这也可能会影响您实现某些类型的“按需刷新”逻辑或“刷新”按钮的用例,因为新的网络调用不会清除该列表。

您可以尝试避免重复的一件事是添加

buyersProfiles = new ArrayList<BuyerProfile>();

onResponse()回调的顶部

希望能帮助到你。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用重复元素创建列表

Truetime Android API,如何在每次打开活动时自动获取GMT,PST,设备时间值?

当我向HashSet中添加重复元素时会发生什么?旧元素是否被覆盖?

在向Android应用中的活动添加新片段时出错

每次新实例时,Android活动方向更改

如何在Android中创建可重复使用的活动?

在Android中创建活动时如何获取键盘高度

添加重复项时从集合中获取原始元素

用重复元素创建元组

Android Manifest活动重复注册

关闭活动时如何清除android viewholder缓存(图像重复)

Android片段在使用recyclerview时滚动所有元素

RecyclerView Adapter仅在滚动时添加重复的TEXTVIEW

如何使用JavaScript添加具有不同元素的数组并添加重复元素值

如何在添加重复元素的同时添加列表中的“系数”?

Dataweave:创建重复元素的数组

jQuery添加重复元素

Android导航抽屉在活动创建时打开

Android片段:创建活动时

在XML文件中添加重复元素

恢复时,Android活动会自动创建新的片段实例

在Android Studio中创建新活动时出错

如何向当前的开放活动Android添加元素

Android:在RecyclerView中添加视图时的怪异反应

Android-每次启动活动时,SwitchCompat OnCheckedChangeListener操作都会运行

在android中创建聊天活动

在Word中创建可重复元素

Android-RecyclerView重复以编程方式添加的imageviews

Android:每次将新对象添加到列表时,都会重置由列表填充的RecyclerView

TOP 榜单

  1. 1

    来自Microsoft Office加载项taskpane.js的MySQL驱动程序模块的空引用

  2. 2

    使用AWS Cognito和React的仅限Facebook / Google的登录名(无用户名/密码)

  3. 3

    创建Windows Phone 8应用并将其连接到数据库的最佳方法(最好是SQL Server)

  4. 4

    为什么Java中的System.out.println()打印到控制台?

  5. 5

    卷曲函数无法解析来自bash中变量的代理

  6. 6

    是什么在Android的consumer-rules.pro和proguard-rules.pro之间的区别?

  7. 7

    设置与Apache POI Excel表散点图标记图标的颜色

  8. 8

    将Qt Pyside2与asyncio await语法一起使用?

  9. 9

    崇高的文字+蟒蛇的蟒蛇

  10. 10

    任务':app:minifyReleaseWithR8'.java.lang.NullPointerException的执行失败(无错误消息)

  11. 11

    OpenJDK的和AdoptOpenJDK的区别

  12. 12

    大型数据集缓存到Spark内存中时,“超出了GC开销限制”(通过sparklyr和RStudio)

  13. 13

    “执行测试CMAKE_HAVE_LIBC_PTHREAD”失败实际上是什么意思?

  14. 14

    使用Core 2.2中的Identity,如何在关闭浏览器15分钟后保持会话活动?

  15. 15

    React中的ForwardRefExoticComponent和ForwardRefRenderFunction有什么区别?

  16. 16

    猫鼬查找结果,然后将字段替换为findOne

  17. 17

    如何降级Google Colab的Torch版本

  18. 18

    Keras提前停止回调错误,val_loss指标不可用

  19. 19

    如何避免VSCode中的“导入路径不能以.ts扩展名结尾”错误?

  20. 20

    Nuxt.JS:如何在页面中获取路由URL参数

  21. 21

    是否有为什么会AccessibilityManager.sInstance导致内存泄漏的一个原因?

热门标签

归档