Android getIntent会在新的数据上获取旧数据

时间:2017-01-20 11:06:42

标签: android android-intent android-recyclerview

我是android app中的新手。我正在开发一个聊天应用程序。我使用了RecyclerView并在recyclelerview适配器内部,我在活动开始时传递了一个数据

这是我的代码

ChatAdapter.java // MyViewHolder

class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{

        TextView name;
        ImageView img,status;

        public MyViewHolder(View itemView) {
            super(itemView);
            name= (TextView) itemView.findViewById(R.id.name);
            img= (ImageView) itemView.findViewById(R.id.img);
            status=(ImageView)itemView.findViewById(R.id.status);
            itemView.setOnClickListener(this);
        }

        @Override
        public void onClick(View view) {
            int position=getAdapterPosition();
            UsersList current=data.get(position);
            Intent intent=new Intent(context,ChatRoomActivity.class);
            intent.putExtra("NAME",current.name);
            intent.putExtra("USERNAME",current.username);
            **Log.wtf("CAAAAA","USERNAME "+current.username);**
            context.startActivity(intent);
        }
    }

每当我点击回收器视图然后它传递正确的数据但是当我按下后退按钮并点击recylclerview(其他)时它会传递错误的数据

我已经通过Log(Bold one)进行了检查,显示了正确的数据,但我不知道为什么在活动中收到了错误的数据。 请帮帮我。您的回复对我来说非常有价值

4 个答案:

答案 0 :(得分:1)

getAdapterPosition()

返回此ViewHolder表示的项的适配器位置。

  

请注意

如果有待处理的适配器更新但尚未发生新的布局传递,则这可能与getLayoutPosition()不同。 在下一次布局遍历之前,RecyclerView不会处理任何适配器更新。这可能会在用户在屏幕上看到的内容和适配器内容之间产生暂时的不一致。这种不一致并不重要,因为它不会超过16毫秒,但如果您想使用ViewHolder位置来访问适配器,则可能会出现问题。有时,您可能需要获取确切的适配器位置以执行某些操作以响应用户事件。在这种情况下,您应该使用此方法来计算ViewHolder的适配器位置。

答案 1 :(得分:1)

我得到了解决方案!实际上,旧意图数据的原因是广播接收器。当活动恢复时,广播接收器发送旧数据。因此,我们需要取消注册广播接收器

以下是我的代码

@Override
    protected void onDestroy() {
        LocalBroadcastManager.getInstance(this).unregisterReceiver(messageReceiver2);
        LocalBroadcastManager.getInstance(this).unregisterReceiver(messageReceiver3);
        LocalBroadcastManager.getInstance(this).unregisterReceiver(messageReceiver4);
        super.onDestroy();
    }

答案 2 :(得分:0)

在目标活动中使用getIntent().getStringExtra("USERNAME")

编辑:

UsersList current =new UsersList();
 current.name=getIntent().getStringExtra("NAME");
current.username=getIntent().getStringExtra("USERNAME");

new Thread(new Runnable() { (At)
Override public void run() { 
adapter=new ChatroomAdapter(ChatRoomActivity.this,dbHelperChatRoom.getMessages(current))‌​;

runOnUiThread(new Runnable() { 
@Override public void run() 
{ recyclerView.setAdapter(adapter); 
} }); } }).start(); 

答案 3 :(得分:0)

您需要更改清单中活动的操作名称。

应该是<action android:name="android.intent.action.VIEW" />而不是<action android:name="android.intent.action.MAIN" />

android.intent.action.MAIN的文档声明如下:Activity Action:表示此活动是应用程序的入口点,即启动应用程序时,此活动已创建,不期望接收数据