如何将数据加载到recyclerveiw适配器位置?

时间:2018-04-05 07:17:56

标签: android socket.io recycler-adapter

实际上我正试图通过从服务器(mongodb)获取一组帖子来显示recyclelerview中的帖子,并且它运行正常。然后我试图在post's username的帮助下加载post_ owner_mail。您可能会说我为什么要将这些内容置于明确位置而不是批量处理,但因为会有不同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());

}

LoadData类:

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"
}

1 个答案:

答案 0 :(得分:0)

您有几个解决方案可以解决此问题:

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

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

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

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