Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
224 views
in Technique[技术] by (71.8m points)

android - Why is my recycler view choppy/slightly stuttering when scrolling back up?

am having a bit of an issue with this activity, and it's weird because I am running the same code in another fragment and it's working just fine but for some reason on this activity it's really choppy when scrolling back up. at this point am not sure what to do then try to recode the activity to find the source of the problem. extending the layout manager to load 15 views in advance kind of help since I don't have to load it but its something with the adapter and the way its recycling the views

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_view_profile_posts);
    mHostId = getIntent().getStringExtra("hostId");
    mHostName = getIntent().getStringExtra("hostName");
    mGroupId = getIntent().getExtras().getString("groupId");

    mFirebaseStoragePosts = FirebaseStorage.getInstance("gs://enchanted-files");
    mFirebaseStorageUserImg = FirebaseStorage.getInstance();
    mFirebaseDatabase = FirebaseDatabase.getInstance();
    mFirebaseFireStore = FirebaseFirestore.getInstance();

    mTitle = (TextView) findViewById(R.id.ID_home_following_seePost_Title);
    mTitle.setText("Announcements");
    mGoBack = (ImageButton) findViewById(R.id.ID_home_following_seePost_goBack);
    mGoBack.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            finish();
        }
    });

    mLoadingLayout = (RelativeLayout) findViewById(R.id.ID_home_following_seePost_loadingView);
    mNothingToShowLayout = (RelativeLayout) findViewById(R.id.ID_home_following_seePost_nothingToShowLayout);
    mRecyclerView = (RecyclerView) findViewById(R.id.ID_seePost_recyclerView);
    LinearLayoutManager linearLayoutManager = new LinearLayoutManager(Group_Announcements_Activity.this);
    linearLayoutManager.setItemPrefetchEnabled(true);
    linearLayoutManager.setInitialPrefetchItemCount(15);
    mRecyclerView.setLayoutManager(linearLayoutManager);

    getGroupAnnouncements();
}

`

    public class AnnouncementAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    Context mContext;
    List<Post> listOfPost;
    LayoutInflater mInflater;

    public static final int withPic = 1;
    public static final int withNoPic = 2;
    public static final int withNoPic_byHost = 3;
    public static final int withPic_byHost = 4;
    private static final int withVideo = 5;
    private static final int withVideoByHost = 6;

    public AnnouncementAdapter(Context context, List<Post> list) {
        mContext = context;
        mInflater = LayoutInflater.from(mContext);
        listOfPost = new ArrayList<>(list);
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        switch (viewType) {

            case withPic:
                View viewWithPic = mInflater.inflate(R.layout.recyclerview_item_post_with_pic, parent, false);
                return new PostWithPicViewHolder(viewWithPic);

            case withNoPic:
                View viewWithNoPic = mInflater.inflate(R.layout.recyclerview_item_post_with_no_pic, parent, false);
                return new PlainTextViewHolder(viewWithNoPic);

            case withPic_byHost:
                View viewWithPicByHost = mInflater.inflate(R.layout.recyclerview_item_post_with_pic_by_host, parent, false);
                return new PostWithPicByHostViewHolder(viewWithPicByHost);

            case withNoPic_byHost:
                View viewWithNoPicByHost = mInflater.inflate(R.layout.recyclerview_item_post_with_no_pic_by_host, parent, false);
                return new PlainTextByHostViewHolder(viewWithNoPicByHost);

        }

        return null;
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        holder.setIsRecyclable(false);
        switch (holder.getItemViewType()) {

            case withPic:
                PostWithPicViewHolder holderWithPic = (PostWithPicViewHolder) holder;
                holderWithPic.onBind(listOfPost.get(position));
                break;

            case withNoPic:
                PlainTextViewHolder holderWithNoPic = (PlainTextViewHolder) holder;
                holderWithNoPic.onBind(listOfPost.get(position));
                break;

            case withPic_byHost:
                PostWithPicByHostViewHolder holderWithPicByHost = (PostWithPicByHostViewHolder) holder;
                holderWithPicByHost.onBind(listOfPost.get(position));
                break;

            case withNoPic_byHost:
                PlainTextByHostViewHolder holderWithNoPicByHost = (PlainTextByHostViewHolder) holder;
                holderWithNoPicByHost.onBind(listOfPost.get(position));
                break;

        }

    }

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

    public void removePost(int pos) {
        listOfPost.remove(pos);
        notifyItemRemoved(pos);
    }

    @Override
    public int getItemViewType(int position) {
        //if (position % 10 = 0 ) show AD
        String type = listOfPost.get(position).getType();

        switch (type) {

            case "withPic":
                return withPic;

            case "withNoPic":
                return withNoPic;

            case "withNoPic_byHost":
                return withNoPic_byHost;

            case "withPic_byHost":
                return withPic_byHost;

        }

        return 0;

    }

}


 public class PostWithPicByHostViewHolder extends RecyclerView.ViewHolder {
    //user info
    private String postedBy;
    private ImageView profileImg;
    private TextView profileName;
    //post
    private String postId;
    private TextView postedOn;
    private String postText;
    private TextView postTextView;
    private String postImgPath;
    private ImageView postImg;
    private TextView likedCount;
    private ImageButton commentImg;
    private TextView commentCount;
    private ImageView optionsBtn;
    private long CommentsCount;
    private Options_Group_Announcement_Post_ByHost_Dialog dialog;


    public PostWithPicByHostViewHolder(View itemView) {
        super(itemView);

        postedOn = (TextView) itemView.findViewById(R.id.ID_recyclerView_postWithPic_timeStamp_by_host);

        profileImg = (ImageView) itemView.findViewById(R.id.ID_recyclerView_postWithPic_hostImage_by_host);
        profileImg.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                UserProfile_Dialog dialog = UserProfile_Dialog.getDialogFragment(mHostId, mHostName, postedBy);
                dialog.show(getSupportFragmentManager(), "");
            }
        });

        profileName = (TextView) itemView.findViewById(R.id.ID_recyclerView_postWithPic_hostName_by_host);
        profileName.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                UserProfile_Dialog dialog = UserProfile_Dialog.getDialogFragment(mHostId, mHostName, postedBy);
                dialog.show(getSupportFragmentManager(), "");
            }
        });

        postTextView = (TextView) itemView.findViewById(R.id.ID_recyclerView_postWithPic_postText_by_host);
        postImg = (ImageView) itemView.findViewById(R.id.ID_recyclerView_postWithPic_postImage_by_host);

        optionsBtn = (ImageView) itemView.findViewById(R.id.ID_recyclerView_postWitPic_postOptions_by_host);
        optionsBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                dialog.show(getSupportFragmentManager(), "");
            }
        });

        likedCount = (TextView) itemView.findViewById(R.id.ID_recyclerView_postWithPic_likeCount_TextView_by_host);

        commentCount = (TextView) itemView.findViewById(R.id.ID_recyclerView_postWithPic_commentCount_textView_by_host);

        commentImg = (ImageButton) itemView.findViewById(R.id.ID_recyclerView_postWithPic_commentImgView_by_host);
        commentImg.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(Group_Announcements_Activity.this, Group_Announcement_Comments_Activity.class);
                intent.putExtra("hostId", mHostId);
                intent.putExtra("hostName", mHostName);
                intent.putExtra("groupId", mGroupId);
                intent.putExtra("postId", postId);
                startActivity(intent);
            }
        });

    }

    public void onBind(Post post) {
        String nameStr = post.getPostProfileName();
        String name = nameStr.substring(0, 1).toUpperCase() + nameStr.substring(1);
        profileName.setText(name);

        postId = post.getPostId();
        postedOn.setText(post.getPostedDate());
        postedBy = post.getPostedBy();
        postTextView.setText(post.getPostText());
        postImgPath = post.getPostImagePath();
        likedCount.setText(Integer.toString(post.getLikedCount()));

        String postString = post.getPostText();
        if (postString != null) {
            postText = postString;
        } else {
            postText = "";
        }

        getPostLikes(new FireBaseCallback() {
            @Override
            public void callBack(Map map) {
                likedCount.setText(CompactNumberConverter.formatValue((long) map.get("likesCount")));

            }
        });

        getCommentsCount(new FireBaseCallback() {
            @Override
            public void callBack(Map map) {
                commentCount.setText(CompactNumberConverter.formatValue((long) map.get("totalComments")));
            }
        });

        getImages();

        dialog = Options_Group_Announcement_Post_ByHost_Dialog.getDialogFragment(mHostId, mGroupId, postId, postImgPath, postText, "imagePost");
        dialog.setDismissListener(new Dialog_Dismiss_Listener() {
            @Override
            public void simpleClose() {

            }

            @Override
            public void updateList_and_Close() {
                mAdapter.removePost(getAdapterPosition());
                Toast.makeText(Group_Announcements_Activity.this, "Post was removed", Toast.LENGTH_LONG).show();
            }

            @Override
            public void updateText_and_Close(String newText) {
                if (newText != null && !newText.isEmpty()) {
                    Toast.makeText(Group_Announcements_Activity.this, "Post Updated", Toast.LENGTH_LONG).show();
                    postTextView.setVisibility(View.VISIBLE);
                    postTextView.setText(newText);
                    reConfigureEditDialog(newText);
                } else {
                    Toast.makeText(Group_Announcements_Activity.this, "Post Updated", Toast.LENGTH_LONG).show();
                    postTextView.setVisibility(View.GONE);
                    reConfigureEditDialog(newText);
                }
            }
        });
    }

    private void reConfigureEditDialog(String newText2) {
        dialog = null;
        dialog = Options_Group_Announcement_Post_ByHost_Dialog.getDialogFragment(mHostId, mGroupId, postId, postImgPath, newText2, "imagePost");
        dialog.setDismissListener(new Dialog_Dismiss_Listene

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)
Waitting for answers

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...