- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一个包含多个项目的回收 View 。并且 recyclerview 具有不同高度的不同 View 类型..
这就是我尝试过的
recyclerview.scrollToPosition(adapterWrapper.getAdapter().getItemCount()-1);
和
app:layoutManager="LinearLayoutManager"
app:stackFromEnd="true"
当我仅将它们应用于单一 View 类型时,它们对我来说效果很好。但在多 View 类型中。它没有滚动到底部。卡在底部前 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();
}
}
谢谢!!!
最佳答案
我不知道原因,但我将我的 RecyclerView 高度更改为 match_parent
并且它工作正常。
它滚动到底部,我仍在使用相同的函数 .setstacktoend(true)
感谢所有试图帮助我的人:)
关于java - 在具有多种 View 类型的回收 View 中滚动到底部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43666419/
这是代码片段。 请说出这种用小内存存储大数据的算法是什么。 public static void main(String[] args) { long longValue = 21474836
所以我使用 imap 从 gmail 和 outlook 接收电子邮件。 Gmail 像这样编码 =?UTF-8?B?UmU6IM69zq3OvyDOtc68zrHOuc67IG5ldyBlbWFpb
很久以前就学会了 C 代码;想用 Scheme 尝试一些新的和不同的东西。我正在尝试制作一个接受两个参数并返回两者中较大者的过程,例如 (define (larger x y) (if (> x
Azure 恢复服务保管库有两个备份配置选项 - LRS 与 GRS 这是一个有关 Azure 恢复服务保管库的问题。 当其驻留区域发生故障时,如何处理启用异地冗余的恢复服务保管库?如果未为恢复服务启
说,我有以下实体: @Entity public class A { @Id @GeneratedValue private Long id; @Embedded private
我有下一个问题。 我有下一个标准: criteria.add(Restrictions.in("entity.otherEntity", getOtherEntitiesList())); 如果我的
如果这是任何类型的重复,我会提前申请,但我找不到任何可以解决我的具体问题的内容。 这是我的程序: import java.util.Random; public class CarnivalGame{
我目前正在使用golang创建一个聚合管道,在其中使用“$ or”运算符查询文档。 结果是一堆需要分组的未分组文档,这样我就可以进入下一阶段,找到两个数据集之间的交集。 然后将其用于在单独的集合中进行
是否可以在正则表达式中创建 OR 条件。 我正在尝试查找包含此类模式的文件名列表的匹配项 第一个案例 xxxxx-hello.file 或者案例二 xxxx-hello-unasigned.file
该程序只是在用户输入行数时创建菱形的形状,因此它有 6 个 for 循环; 3 个循环创建第一个三角形,3 个循环创建另一个三角形,通过这 2 个三角形和 6 个循环,我们得到了一个菱形,这是整个程序
我有一个像这样的查询字符串 www.google.com?Department=Education & Finance&Department=Health 我有这些 li 标签,它们的查询字符串是这样
我有一个带有静态构造函数的类,我用它来读取 app.config 值。如何使用不同的配置值对类进行单元测试。我正在考虑在不同的应用程序域中运行每个测试,这样我就可以为每个测试执行静态构造函数 - 但我
我正在寻找一个可以容纳多个键的容器,如果我为其中一个键值输入保留值(例如 0),它会被视为“或”搜索。 map, int > myContainer; myContainer.insert(make_
我正在为 Web 应用程序创建数据库,并正在寻找一些建议来对可能具有多种类型的单个实体进行建模,每种类型具有不同的属性。 作为示例,假设我想为“数据源”对象创建一个关系模型。所有数据源都会有一些共享属
(1) =>CREATE TABLE T1(id BIGSERIAL PRIMARY KEY, name TEXT); CREATE TABLE (2) =>INSERT INTO T1 (name)
我不确定在使用别名时如何解决不明确的列引用。 假设有两个表,a 和 b,它们都有一个 name 列。如果我加入这两个表并为结果添加别名,我不知道如何为这两个表引用 name 列。我已经尝试了一些变体,
我的查询是: select * from table where id IN (1,5,4,3,2) 我想要的与这个顺序完全相同,不是从1...5,而是从1,5,4,3,2。我怎样才能做到这一点? 最
我正在使用 C# 代码执行动态生成的 MySQL 查询。抛出异常: CREATE TABLE dump ("@employee_OID" VARCHAR(50)); "{"You have an er
我有日期 2016-03-30T23:59:59.000000+0000。我可以知道它的格式是什么吗?因为如果我使用 yyyy-MM-dd'T'HH:mm:ss.SSS,它会抛出异常 最佳答案 Sim
我有一个示例模式,它的 SQL Fiddle 如下: http://sqlfiddle.com/#!2/6816b/2 这个 fiddle 只是根据 where 子句中的条件查询示例数据库,如下所示:
我是一名优秀的程序员,十分优秀!