【问题标题】:How to load data to recyclerveiw adapter position wise?如何明智地将数据加载到 recyclerview 适配器位置?
【发布时间】:2018-04-05 07:17:56
【问题描述】:

实际上,我正在尝试通过从服务器 (mongodb) 获取一组帖子来在 recyclerview 中显示帖子,并且工作正常。然后我试图在post_ owner_mail 的帮助下加载post's username。你可能会说为什么我要明智地加载这些东西而不是批量加载这些东西,但是因为会有不同ownerMail 的帖子所以不可能预取他们的用户名。为此,我使用了一个单独的类来从服务器加载数据并在文本视图中显示。但现在的问题是虽然textview 正在设置用户名,但并非一直在设置,并且recyclerview 也滞后。谁能帮我解决这个问题。

适配器类代码:

 @Override
public void onBindViewHolder( CustomRecyclerViewHolder holder, int position) {
  //It's a data model class of image_links and post_owner_mails
  TimelineData timelineData=totalList.get(holder.getAdapterPosition());

 //It's the custom loader class through which I'm loading data and setting to txt view position wise
  LoadData d=new LoadData(hold.userNameTxtView,timelineData.getPostOwnerMail());

}

加载数据类:

public class LoadData{
private Socket socket;
{
    try{
        socket = IO.socket("http://192.168.43.218:8080");
    }catch(URISyntaxException e){
        throw new RuntimeException(e);
    }
}
public LoadData(final TextView tv,final String email){
    socket.disconnect();
    socket.connect();
    JSONObject ob=new JSONObject();
    try {
        ob.put("getFullnameMail",email);
        socket.emit("data",ob);
        socket.on("fullname", new Emitter.Listener() {
            @Override
            public void call(Object... args) {
                final JSONObject ob=(JSONObject)args[0];
                Needle.onMainThread().execute(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            tv.setText(ob.getString("fullname"));
                            socket.disconnect();
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }    
                    }
                });
            }
        });
    } catch (JSONException e) {
        e.printStackTrace();
    }
}
}

数据库存储模式

{
"_id" : ObjectId("5aa9304391b4ee28f4e4525d"),
"post_owner_mail" : "john.cena",
"time" : "14 Mar 2018(01-30-50)",
"img_link" : [ 
    "192.168.43.218:8080/user_info/john.cena/uploads/14 Mar 2018(01-30-50)/pic0.jpg", 
    "192.168.43.218:8080/user_info/john.cena/uploads/14 Mar 2018(01-30-50)/pic1.jpg"
],
"caption" : "#fun#cartoon"
}

【问题讨论】:

  • 使用google的paging支持库
  • @pskink 先生,我是初学者,请详细说明我该如何使用 分页库
  • 参见PagedListAdapter 类 - 你应该将它用作适配器的基类

标签: android socket.io android-recyclerview


【解决方案1】:

你有几个解决方案来解决这个问题:

1)您可以将电子邮件地址与您呈现给用户的项目结合起来(基本上您正在创建一个包含旧数据+电子邮件的新对象,或者只是向旧对象添加另一个字段),您需要访问数据库/服务器/服务,只需添加您希望添加到每个项目的必填字段(电子邮件)。

2) 如果您无权访问数据库/服务,您可以创建一个加载器,在加载这两个项目(旧项目和电子邮件)时向用户显示,您将已经获取电子邮件设置适配器之前的每个项目)

3)另一种方法是根据请求显示电子邮件,只需添加一个按钮(或像箭头这样的图像),当用户单击它时,它将根据您的意愿请求电子邮件并将其显示在项目中你选的。

有不同的方法可以解决您的问题。 如果显示电子邮件不重要,我会使用方法 3。

【讨论】:

  • 先生再次感谢您的回答,但请您检查我编辑的问题。实际上,当用户滚动到这个位置时,我正在以这种格式存储用户上传的帖子,我正在获取他的 fullname 并向他们展示。因此,在我的情况下,我应该怎么做
  • 顺便说一下,假设我将 username 与其他数据一起以后期保存格式存储,但我必须访问喜欢的数量或 cmets 通过位置明智的方法在图片上。那么,如何处理这种情况
  • 当用户点击项目时,您可以简单地布局(通过显示更少的信息),他可以看到有关它的内容/更多详细信息(另一个片段/活动甚至是对话框)。或者你可以做一个加载器按钮,每次加载一个项目。
  • 不错的建议,但您认为它对社交媒体应用程序用户友好吗?假设您正在查看某人在社交媒体平台上的帖子,但只有在您单击加载器按钮时才会显示该名称。
  • 老实说,我没有使用太多社交媒体。我可以告诉您,当您使用 Gmail 等电子邮件客户端应用程序时,您通常会看到重要的信息,例如主题、电子邮件来自哪里、是否有附件。您可以看到实际电子邮件的一句话,但要查看整封电子邮件(在您的案例中发布),您需要单击它并更详细地查看它。您需要展示简单的用户界面,而不是复杂且不友好的界面。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多