使用多种视图类型在recyclerview中滚动到底部

时间:2017-04-27 19:28:43

标签: java android android-recyclerview admob recycler-adapter

我有一个包含多个项目的recyclerview。和recyclerview有不同的视图类型和不同的高度..

所以这些是我试过的

recyclerview.scrollToPosition(adapterWrapper.getAdapter().getItemCount()-1);

app:layoutManager="LinearLayoutManager"
app:stackFromEnd="true"

当我仅在单一视图类型上应用它们时,它们对我很有用..但在多视图类型中。它没有滚动到底部。它被困在底部之前的9个项目中。

之前我在listview中使用stackFromBottom并且工作正常......

那么在recyclerview中它的解决方案是什么?

它实际上是一个聊天应用程序,具有不同类型的布局,包括图像,GIF等。

RecyclerAdapter代码,

package com.buckydroid.anonchat.Adapters;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.URLUtil;
import android.widget.ImageView;
import android.widget.PopupMenu;
import android.widget.TextView;
import android.widget.Toast;

import com.buckydroid.anonchat.Async.DownloadManager;
import com.buckydroid.anonchat.Chatroom.ChatRoom;
import com.buckydroid.anonchat.Pages.FullScreenImageView;
import com.buckydroid.anonchat.Pages.Profile;
import com.buckydroid.anonchat.Pages.VideoPlayer;
import com.buckydroid.anonchat.R;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.bumptech.glide.load.resource.drawable.GlideDrawable;
import com.bumptech.glide.load.resource.gif.GifDrawable;
import com.bumptech.glide.request.RequestListener;
import com.bumptech.glide.request.target.GlideDrawableImageViewTarget;
import com.bumptech.glide.request.target.Target;
import com.firebase.client.DataSnapshot;
import com.firebase.client.Firebase;
import com.firebase.client.FirebaseError;
import com.firebase.client.ValueEventListener;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.FirebaseDatabase;
import com.vanniktech.emoji.EmojiTextView;

import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.List;

import de.hdodenhof.circleimageview.CircleImageView;

/**
 * Created by buckydroid on 27/04/17.
 */

public class ChatRecyclerAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{
    List<String> message = new ArrayList<>();
    List<Integer> image = new ArrayList<>();
    List<String> usernames = new ArrayList<>();
    List<String> keys = new ArrayList<>();
    ChatRoom chatroom = new ChatRoom();
    String name;
    Context c;
    String username;
    String otherusername;
    String groupName;
    public GifDrawable gifDrawable;
    List<Integer> type = new ArrayList<>();
    String id;
    ArrayList<String> zcode = new ArrayList<>();

    public ChatRecyclerAdapter(String id, String s, List<String> message, List<Integer> image, Context c, String username, String otherusername, List<Integer> type, List<String> usernames, String j, ArrayList<String> zcode) {
        this.message = message;
        this.image = image;
        this.c = c;
        this.username = username;
        this.otherusername = otherusername;
        this.type = type;
        this.usernames = usernames;
        this.groupName = j;
        this.name = s;
        this.id = id;
        this.zcode = zcode;

    }


    class ViewHolder extends  RecyclerView.ViewHolder{
        ImageView imageView;
        EmojiTextView messageView;
        CircleImageView profileImage;
        ImageView gif;
        TextView groupactionmessage;
        ImageView thumbnail;
        TextView filename;
        TextView filesize;
        TextView morevert;
        public ViewHolder(View itemView) {
            super(itemView);
            messageView = (EmojiTextView) itemView.findViewById(R.id.message_view);
            imageView = (ImageView) itemView.findViewById(R.id.imageMessage);
            profileImage = (CircleImageView) itemView.findViewById(R.id.profile_image);
            thumbnail = (ImageView) itemView.findViewById(R.id.thumbnail);
            filename = (TextView) itemView.findViewById(R.id.filename);
            gif = (ImageView) itemView.findViewById(R.id.gifmessage);
            groupactionmessage = (TextView) itemView.findViewById(R.id.group_action_message);


        }
    }



    @Override
    public int getItemViewType(int position) {
        if (username.equals(usernames.get(position))) {
            Log.i("type", String.valueOf(type.get(position)));
            return type.get(position);
        }
        else
            return type.get(position)+7;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = null;
        switch (viewType){

            case 0:
                v = LayoutInflater.from (parent.getContext ()).inflate (R.layout.sender_message_bubble, parent, false);
                System.out.println("Type 0");
                return new ViewHolder(v);


            case 7:
                v = LayoutInflater.from (parent.getContext ()).inflate (R.layout.message_item, parent, false);;
                System.out.println("Type 7");
                return new ViewHolder(v);


            case 1:
                v = LayoutInflater.from (parent.getContext ()).inflate (R.layout.sender_image_layout, parent, false);
                System.out.println("Type 1");
                return new ViewHolder(v);


            case 8:
                v = LayoutInflater.from (parent.getContext ()).inflate (R.layout.chatroom_image, parent, false);
                System.out.println("Type 8");
                return new ViewHolder(v);
            case 2:
                v = LayoutInflater.from (parent.getContext ()).inflate (R.layout.sender_gif, parent, false);
                System.out.println("Type 2");
                return new ViewHolder(v);


            case 9:
                v = LayoutInflater.from (parent.getContext ()).inflate (R.layout.chatroom_gif, parent, false);
                System.out.println("Type 9");

            case 3:
                v = LayoutInflater.from (parent.getContext ()).inflate (R.layout.group_actions_list, parent, false);
                System.out.println("Type 3");
                return new ViewHolder(v);


            case 10:
                v = LayoutInflater.from (parent.getContext ()).inflate (R.layout.group_actions_list, parent, false);
                System.out.println("Type 10");
                return new ViewHolder(v);


            case 4:
                v = LayoutInflater.from (parent.getContext ()).inflate (R.layout.video_thumbnail_message, parent, false);
                System.out.println("Type 4");
                return new ViewHolder(v);

            case 11:
                v = LayoutInflater.from (parent.getContext ()).inflate (R.layout.video_thumbnail_message2, parent, false);
                System.out.println("Type 11");
                return new ViewHolder(v);

            case 5:
                v = LayoutInflater.from (parent.getContext ()).inflate (R.layout.file_layout, parent, false);
                System.out.println("Type 5");
                return new ViewHolder(v);

            case 12:
                v = LayoutInflater.from (parent.getContext ()).inflate (R.layout.sender_file_layout, parent, false);
                System.out.println("Type 12");
                return new ViewHolder(v);

            default:
                v = LayoutInflater.from (parent.getContext ()).inflate (R.layout.message_item, parent, false);
                return new ViewHolder(v);

        }




    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        switch (holder.getItemViewType()){
            case 0:
            case 7:

                Log.i("Type on message", String.valueOf(type.get(position)) + "  " +message.get(position) + "   "+holder.getItemViewType());

                ViewHolder messageHolder = (ViewHolder)holder;
                if (!username.equals(usernames.get(position)))
                    messageHolder.profileImage.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            Intent i = new Intent(c, Profile.class);
                            i.putExtra("username",usernames.get(position));
                            i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                            c.startActivity(i);
                        }
                    });
                Firebase userdata = new Firebase("https://droidchatz.firebaseio.com/userdata/"+usernames.get(position));
                userdata.addValueEventListener(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {
                        if (!usernames.get(position).equals(username))
                            Glide.with (c.getApplicationContext())
                                    .load (dataSnapshot.child("pic").getValue(String.class))
                                    .diskCacheStrategy(DiskCacheStrategy.ALL)

                                    .error (R.drawable.dog)
                                    .into (messageHolder.profileImage);

                    }

                    @Override
                    public void onCancelled(FirebaseError firebaseError) {

                    }
                });

               messageHolder.messageView.setText(message.get(position));




                messageHolder.messageView.setOnLongClickListener(new View.OnLongClickListener() {
                    @Override
                    public boolean onLongClick(View v) {
                        PopupMenu popupMenu = new PopupMenu(c, messageHolder.messageView);
                        popupMenu.getMenuInflater().inflate(R.menu.messsage_popup_menu, popupMenu.getMenu());
                        popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
                            @Override
                            public boolean onMenuItemClick(MenuItem item) {
                                switch (item.getItemId()) {
                                    case R.id.action_reply:
                                        String te = usernames.get(position) + " : " + messageHolder.messageView.getText() + "\n\n\n";
                                        ChatRoom.input.setText(te);
                                        ChatRoom.input.setSelection(te.length());
                                        break;
                                    case R.id.action_copy:
                                        android.content.ClipboardManager clipboard = (android.content.ClipboardManager) c.getSystemService(Context.CLIPBOARD_SERVICE);
                                        android.content.ClipData clip = android.content.ClipData.newPlainText(messageHolder.messageView.getText(), messageHolder.messageView.getText());
                                        clipboard.setPrimaryClip(clip);
                                        Toast.makeText(c, "Text Copied...", Toast.LENGTH_SHORT).show();
                                        break;
                                    case R.id.action_report:
                                        new Firebase("https://droidchatz.firebaseio.com/groupchat/" + name).child("report").child(usernames.get(position)).child(FirebaseAuth.getInstance().getCurrentUser().getUid()).setValue(true);

                                        break;

                                }
                                return false;
                            }
                        });
                        popupMenu.show();
                        return false;
                    }
                });

                break;





            case 1:
            case 8:
                ViewHolder imageHolder = (ViewHolder)holder;

                Log.i("Type on image", String.valueOf(type.get(position)) + "  " +message.get(position)+"   "+holder.getItemViewType());

                imageHolder.imageView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Intent i = new Intent(c, FullScreenImageView.class);
                        i.putExtra("uri", message.get(position));
                        i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                        c.startActivity(i);
                    }
                });



                imageHolder.imageView.setAdjustViewBounds(true);
                GlideDrawableImageViewTarget imageViewPreview = new GlideDrawableImageViewTarget(imageHolder.imageView);
                Glide
                        .with(c)
                        .load(message.get(position))
                        .centerCrop()
                        .listener(new RequestListener<String, GlideDrawable>() {
                            @Override
                            public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) {
                                return false;
                            }

                            @Override
                            public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) {
                                return false;
                            }
                        })
                        .into(imageViewPreview);

                Firebase userdata2 = new Firebase("https://droidchatz.firebaseio.com/userdata/"+usernames.get(position));
                userdata2.addValueEventListener(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {
                        if (!usernames.get(position).equals(username)) {
                            Glide.with (c)
                                    .load (dataSnapshot.child("pic").getValue(String.class))
                                    .error (R.drawable.dog)
                                    .into (imageHolder.profileImage);


                        }                }

                    @Override
                    public void onCancelled(FirebaseError firebaseError) {

                    }
                });




                break;
            case 2:
            case 9:

                Log.i("Type on gif", String.valueOf(type.get(position)) + "  " +message.get(position)+"   "+holder.getItemViewType());

                ViewHolder gifHolder = (ViewHolder)holder;
                gifHolder.gif.setAdjustViewBounds(true);
                GlideDrawableImageViewTarget imageViewPreview2 = new GlideDrawableImageViewTarget(gifHolder.gif);
                Glide
                        .with(c)
                        .load(message.get(position))
                        .listener(new RequestListener<String, GlideDrawable>() {
                            @Override
                            public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) {
                                return false;
                            }

                            @Override
                            public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) {
                                return false;
                            }
                        })
                        .into(imageViewPreview2);
                if (!username.equals(usernames.get(position)))
                    gifHolder.profileImage.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            Intent i = new Intent(c, Profile.class);
                            i.putExtra("username",usernames.get(position));
                            i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                            c.startActivity(i);
                        }
                    });


                Firebase userdata3 = new Firebase("https://droidchatz.firebaseio.com/userdata/"+usernames.get(position));
                userdata3.addValueEventListener(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {
                        if (!usernames.get(position).equals(username))
                            Glide.with (c)
                                    .load (dataSnapshot.child("pic").getValue(String.class))
                                    .error (R.drawable.dog)
                                    .into (gifHolder.profileImage);

                    }

                    @Override
                    public void onCancelled(FirebaseError firebaseError) {

                    }
                });


                break;
            case 3:
            case 10:
                Log.i("Type on action", String.valueOf(type.get(position)) + "  " +message.get(position)+"   "+holder.getItemViewType());

                ViewHolder actionHolder = (ViewHolder)holder;
                actionHolder.groupactionmessage.setText(message.get(position));


                break;

            case 4:
            case 11:

                ViewHolder videoHolder = (ViewHolder)holder;
                Log.i("Type on video", String.valueOf(type.get(position)) + "  " +message.get(position)+"   "+holder.getItemViewType());
                FirebaseDatabase.getInstance().getReference().child("thumbnails").child(name).child(zcode.get(position)).addValueEventListener(new com.google.firebase.database.ValueEventListener() {
                    @Override
                    public void onDataChange(com.google.firebase.database.DataSnapshot dataSnapshot) {
                        Glide.with(c).load(dataSnapshot.getValue(String.class)).centerCrop().into(videoHolder.thumbnail);
                    }

                    @Override
                    public void onCancelled(DatabaseError databaseError) {

                    }
                });


                if (!username.equals(usernames.get(position)))
                    videoHolder.profileImage.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            Intent i = new Intent(c, Profile.class);
                            i.putExtra("username",usernames.get(position));
                            i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                            c.startActivity(i);
                        }
                    });
                videoHolder.itemView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Intent i = new Intent(c, VideoPlayer.class);
                        i.putExtra("link", message.get(position));
                        i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

                        c.startActivity(i);

                    }
                });
                Firebase userdata4 = new Firebase("https://droidchatz.firebaseio.com/userdata/"+usernames.get(position));

                userdata4.addValueEventListener(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {
                        if (!usernames.get(position).equals(username))
                            Glide.with (c)
                                    .load (dataSnapshot.child("pic").getValue(String.class))
                                    .error (R.drawable.dog)
                                    .into (videoHolder.profileImage);

                    }

                    @Override
                    public void onCancelled(FirebaseError firebaseError) {

                    }
                });



                break;
            case 5:
            case 12:



                ViewHolder fileHolder = (ViewHolder)holder;
                Firebase userdata5 = new Firebase("https://droidchatz.firebaseio.com/userdata/"+usernames.get(position));
                if (!username.equals(usernames.get(position)))
                    fileHolder.profileImage.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            Intent i = new Intent(c, Profile.class);
                            i.putExtra("username",usernames.get(position));
                            i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                            c.startActivity(i);
                        }
                    });
                userdata5.addValueEventListener(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {
                        if (!usernames.get(position).equals(username))

                            Glide.with (c)
                                    .load (dataSnapshot.child("pic").getValue(String.class))
                                    .error (R.drawable.dog)
                                    .into (fileHolder.profileImage);

                    }

                    @Override
                    public void onCancelled(FirebaseError firebaseError) {

                    }
                });
                fileHolder.filename.setText(URLUtil.guessFileName(message.get(position), null, null));
                final URL[] uri = new URL[1];
                final URLConnection[] ucon = new URLConnection[1];
                final String[] contentLengthStr = new String[1];
                Thread size = new Thread();
                Runnable getfilesize;
                fileHolder.itemView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(message.get(position)));
                        c.startActivity(browserIntent);
                    }
                });
                break;


        }




    }



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


    }

感谢名单!!!

2 个答案:

答案 0 :(得分:9)

我不知道原因,但我将RecyclerView高度更改为match_parent并且它正常工作。

它滚动到底部完成,我仍在使用相同的函数.setstacktoend(true)

对所有试图帮助我的人表示感谢:)

答案 1 :(得分:6)

您能否告诉我们您的Recyclerview及其适配器的完整代码。

也许这会起作用

  

recyclerview.scrollToPosition(mData.size() - 1);

其中mData是您传递到recyclerview适配器的列表 那些很难弄清楚这么小的代码有什么问题。