Java 启动应用程序调用后,RecyclerView中的项重复
每次应用程序被销毁并再次打开时,也就是每次调用“onStart”方法时,每个新项都会添加两次。 当我关闭并再次打开它时,每个新项目都会重复三次,以此类推 以下是活动的代码:Java 启动应用程序调用后,RecyclerView中的项重复,java,android,Java,Android,每次应用程序被销毁并再次打开时,也就是每次调用“onStart”方法时,每个新项都会添加两次。 当我关闭并再次打开它时,每个新项目都会重复三次,以此类推 以下是活动的代码: @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_chat);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_chat);
IntializeControllers();
if (getIntent().getExtras() != null && getIntent().getStringExtra("userID" ) != null&& getIntent().getStringExtra("userName") != null&& getIntent().getStringExtra("userImage") != null){
messageReceiverID = getIntent().getExtras().get("userID").toString();
if (messageReceiverID.equals(auth.getCurrentUser().getUid())){
Toast.makeText(this, "يرجى التأكد من إعدادات تسجيل الدخول", Toast.LENGTH_SHORT).show();
finish();
}
messageReceiverName = getIntent().getExtras().get("userName").toString();
messageReceiverImage = getIntent().getExtras().get("userImage").toString();
}
else {
Toast.makeText(this, "لا يوجد بيانات", Toast.LENGTH_SHORT).show();
finish();
}
DisplayLastSeen();
userName.setText(messageReceiverName);
Picasso.get().load(messageReceiverImage).placeholder(R.drawable.profile_image).into(userImage);
SendMessageButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
sendMessage();
MessageInputText.setText("");
}
});
swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
mCurrentPage++;
itemPos =0;
LoadMoreMessages();
}
});
sendFileButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
CharSequence options[] = new CharSequence[]
{
"Images",
"PDF Files",
"Ms Word Files"
};
AlertDialog.Builder builder = new AlertDialog.Builder(ChatActivity.this);
builder.setTitle("Select the File");
builder.setItems(options, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int i) {
if (i == 0){
checker ="image";
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent,"Select Image"),438);
}if (i == 1){
checker ="pdf";
Intent intent = new Intent();
intent.setType("application/pdf");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent,"Select PDF File"),438);
}if (i == 2){
checker ="docx";
Intent intent = new Intent();
intent.setType("application/msword");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent,"Select Ms Word File"),438);
}
}
});
builder.show();
}
});
seenListener =null;
}
@Override
protected void onStart() {
super.onStart();
LoadMessages();
callImage.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
sheckSelfPermissionsAndCallUser();
}
});
Toast.makeText(this, "onStart", Toast.LENGTH_SHORT).show();
}
private void IntializeControllers() {
toolbar = findViewById(R.id.group_chat_toolbar);
setSupportActionBar(toolbar);
ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setDisplayShowCustomEnabled(true);
LayoutInflater layoutInflater = (LayoutInflater) this.getSystemService(getApplicationContext().LAYOUT_INFLATER_SERVICE);
View actionBarView = layoutInflater.inflate(R.layout.custom_chat_bar, null);
actionBar.setCustomView(actionBarView);
}
auth = FirebaseAuth.getInstance();
messageSenderID = auth.getCurrentUser().getUid();
RootRef = FirebaseDatabase.getInstance().getReference();
callImage = findViewById(R.id.custom_user_call);
userImage = findViewById(R.id.custom_profile_image);
userName = findViewById(R.id.custom_profile_name);
userLastSeen = findViewById(R.id.custom_user_last_seen);
SendMessageButton = findViewById(R.id.send_message_btn);
MessageInputText = findViewById(R.id.input_message);
recyclerView = findViewById(R.id.private_messages_list_of_users);
swipeRefreshLayout = findViewById(R.id.swipeRefreshLayout);
sendFileButton = findViewById(R.id.send_files_btn);
progressDialog = new ProgressDialog(ChatActivity.this);
linearLayoutManager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(linearLayoutManager);
recyclerView.setHasFixedSize(true);
Calendar calendar = Calendar.getInstance();
SimpleDateFormat currentDate = new SimpleDateFormat("MMM dd, yyyy");
saveCurrentDate =currentDate.format(calendar.getTime());
SimpleDateFormat currentTime = new SimpleDateFormat("hh:mm a");
saveCurrentTime =currentTime.format(calendar.getTime());
FirebaseUser firebaseUser = FirebaseAuth.getInstance().getCurrentUser();
sinchClient = Sinch.getSinchClientBuilder()
.context(this)
.applicationKey("b3ecda78-59b0-400e-91bb-53f14fc1efc1")
.applicationSecret("pi0eQwXOzEGP7Crsk8Zepw==")
.environmentHost("clientapi.sinch.com")
.userId(firebaseUser.getUid())
.build();
sinchClient.setSupportCalling(true);
sinchClient.startListeningOnActiveConnection();
sinchClient.start();
callImage.setVisibility(View.VISIBLE);
userLastSeen.setVisibility(View.VISIBLE);
sinchClient.getCallClient().addCallClientListener(new CallClientListener() {
@Override
public void onIncomingCall(CallClient callClient, final com.sinch.android.rtc.calling.Call calli) {
alertDialog = new AlertDialog.Builder(ChatActivity.this).create();
alertDialog.setTitle("وردتك مكالمة من قبل " + messageReceiverName);
alertDialog.setCanceledOnTouchOutside(false);
alertDialog.setButton(AlertDialog.BUTTON_NEUTRAL, "رفض", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
alertDialog.dismiss();
call.hangup();
}
});
alertDialog.setButton(AlertDialog.BUTTON_POSITIVE, "قبول", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
call = calli;
call.answer();
call.addCallListener(new sinchCallListenr());
Toast.makeText(ChatActivity.this, "Calling is Start", Toast.LENGTH_SHORT).show();
}
});
alertDialog.show();
}
});
apiService = Client.getClient("https://fcm.googleapis.com/").create(APIService.class);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 438 && resultCode == RESULT_OK && data != null && data.getData() != null){
progressDialog.setTitle("Sending File");
progressDialog.setMessage("please wait, we are sending that file...");
progressDialog.setCanceledOnTouchOutside(false);
progressDialog.show();
fileUri = data.getData();
if (!checker.equals("image")){
StorageReference storageReference = FirebaseStorage.getInstance().getReference().child("Document Files");
final String messageSenderRef = "Messages/" + messageSenderID +"/" + messageReceiverID;
final String messageReceiverRef = "Messages/" + messageReceiverID + "/" +messageSenderID;
DatabaseReference userMessageKeyRef = RootRef.child("Messages")
.child(messageSenderID).child(messageReceiverID).push();
final String messagePushID =userMessageKeyRef.getKey();
final StorageReference filePath =storageReference.child(messagePushID +"."+checker);
filePath.putFile(fileUri).addOnCompleteListener(new OnCompleteListener<UploadTask.TaskSnapshot>() {
@Override
public void onComplete(@NonNull Task<UploadTask.TaskSnapshot> task) {
if (task.isSuccessful()){
filePath.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
@Override
public void onSuccess(Uri uri) {
final String downloadUrl = uri.toString();
myUrl = downloadUrl;
notify = true;
Map messageTextBody = new HashMap();
messageTextBody.put("message",myUrl);
messageTextBody.put("name", Objects.requireNonNull(fileUri.getLastPathSegment()));
messageTextBody.put("type",checker);
messageTextBody.put("from",messageSenderID);
messageTextBody.put("to",messageReceiverID);
messageTextBody.put("seenMessage",false);
messageTextBody.put("messageID",messagePushID);
messageTextBody.put("time",saveCurrentTime);
messageTextBody.put("date",saveCurrentDate);
Map messageBodyDetails = new HashMap();
messageBodyDetails.put(messageSenderRef
+"/" +messagePushID, messageTextBody);
messageBodyDetails.put(messageReceiverRef +"/" +messagePushID,
messageTextBody); RootRef.updateChildren(messageBodyDetails);
progressDialog.dismiss();
if (notify) {
//
sendNotification(messageReceiverID, GetNameUser(), myUrl, checker);
}
notify = false;
}
});
}
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
progressDialog.dismiss();
Toast.makeText(ChatActivity.this, ""+e.getMessage(), Toast.LENGTH_SHORT).show();
}
}).addOnProgressListener(new OnProgressListener<UploadTask.TaskSnapshot>() {
@Override
public void onProgress(UploadTask.TaskSnapshot taskSnapshot) {
double p = (100.0*taskSnapshot.getBytesTransferred())/taskSnapshot.getTotalByteCount();
progressDialog.setMessage((int) p +" % Uploading....");
}
});
}else if (checker.equals("image")){
StorageReference storageReference = FirebaseStorage.getInstance().getReference().child("Image Files");
final String messageSenderRef = "Messages/" + messageSenderID +"/" + messageReceiverID;
final String messageReceiverRef = "Messages/" + messageReceiverID + "/" +messageSenderID;
DatabaseReference userMessageKeyRef = RootRef.child("Messages")
.child(messageSenderID).child(messageReceiverID).push();
final String messagePushID =userMessageKeyRef.getKey();
final StorageReference filePath =storageReference.child(messagePushID +".jpg");
uploadTask = filePath.putFile(fileUri);
uploadTask.continueWithTask(new Continuation() {
@Override
public Object then(@NonNull Task task){
if (!task.isSuccessful()){
Toast.makeText(ChatActivity.this, ""+task.getException().getMessage(), Toast.LENGTH_SHORT).show();
}
return filePath.getDownloadUrl();
}
}).addOnCompleteListener(new OnCompleteListener<Uri>(){
@Override
public void onComplete(@NonNull Task<Uri> task) {
if (task.isSuccessful()){
Uri downloadUri = task.getResult();
myUrl = downloadUri.toString();
Map messageTextBody = new HashMap();
messageTextBody.put("message",myUrl);
messageTextBody.put("name",fileUri.getLastPathSegment());
messageTextBody.put("type",checker);
messageTextBody.put("from",messageSenderID);
messageTextBody.put("to",messageReceiverID);
messageTextBody.put("seenMessage",false);
messageTextBody.put("messageID",messagePushID);
messageTextBody.put("time",saveCurrentTime);
messageTextBody.put("date",saveCurrentDate);
Map messageBodyDetails = new HashMap();
messageBodyDetails.put(messageSenderRef +"/" +messagePushID, messageTextBody);
messageBodyDetails.put(messageReceiverRef +"/" +messagePushID, messageTextBody);
RootRef.updateChildren(messageBodyDetails).addOnCompleteListener(new OnCompleteListener() {
@Override
public void onComplete(@NonNull Task task) {
if (task.isSuccessful()) {
notify=true;
//messageAdapter.notifyDataSetChanged();
progressDialog.dismiss();
Toast.makeText(ChatActivity.this, "Message Sent Successfully", Toast.LENGTH_SHORT).show();
if (notify) {
sendNotification(messageReceiverID, GetNameUser(), myUrl, checker);
}
notify = false;
}else {
progressDialog.dismiss();
Toast.makeText(ChatActivity.this, "Error : "+task.getException().getMessage(), Toast.LENGTH_SHORT).show();
}
}
});
}
}
});
}else {
Toast.makeText(this, "Nothing Selected, Error.", Toast.LENGTH_SHORT).show();
progressDialog.dismiss();
}
}
}
@Override
protected void onResume() {
Log.d("tester","onResume");
super.onResume();
//move recycler from here
messageAdapter =new MessageAdapter(messagesList,ChatActivity.this,messageReceiverImage);
recyclerView.setAdapter(messageAdapter);
ItemTouchHelper itemTouchHelper = new
ItemTouchHelper(new SwipeToDeleteCallback(messageAdapter));
itemTouchHelper.attachToRecyclerView(recyclerView);
recyclerView.smoothScrollToPosition(recyclerView.getAdapter().getItemCount());
seenMessage();
UpdateUserStatus("online");
DisplayLastSeen();
messageAdapter.notifyDataSetChanged();
// messagesListAdapter = new MessagesListAdapter(messagesList,messageReceiverImage);
// recyclerView.setAdapter(messagesListAdapter);
}
}
@Override
protected void onStop() {
super.onStop();
Log.d("tester","onStop");
FirebaseUser firebaseUser = auth.getCurrentUser();
if (firebaseUser != null){
UpdateUserStatus("offline");
RootRef.removeEventListener(seenListener);
RootRef.removeEventListener(listener);
}
}
@Override
protected void onDestroy() {
Log.d("tester","onDestroy");
super.onDestroy();
FirebaseUser firebaseUser = auth.getCurrentUser();
if (firebaseUser != null){
UpdateUserStatus("offline");
if (seenListener != null) {
RootRef.removeEventListener(seenListener);
}
}
}
}
@覆盖
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u chat);
初始化控制器();
如果(getIntent().getExtras()!=null&&getIntent().getStringExtra(“用户ID”)!=null&&getIntent().getStringExtra(“用户名”)!=null&&getIntent().getStringExtra(“用户图像”)!=null){
messageReceiverID=getIntent().getExtras().get(“userID”).toString();
if(messageReceiverID.equals(auth.getCurrentUser().getUid())){
Toast.makeText(这是“Toast.LENGTH.”show();
完成();
}
messageReceiverName=getIntent().getExtras().get(“用户名”).toString();
messageReceiverImage=getIntent().getExtras().get(“userImage”).toString();
}
否则{
Toast.makeText(这是“Toast.LENGTH”show();
完成();
}
DisplayLastSeen();
userName.setText(messageReceiverName);
Picasso.get().load(messageReceiverImage).placeholder(R.drawable.profile\u image).into(userImage);
SendMessageButton.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
sendMessage();
MessageInputText.setText(“”);
}
});
swipeRefreshLayout.setOnRefreshListener(新的swipeRefreshLayout.OnRefreshListener()){
@凌驾
公共void onRefresh(){
mCurrentPage++;
itemPos=0;
LoadMoreMessages();
}
});
sendFileButton.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
CharSequence选项[]=新的CharSequence[]
{
“图像”,
“PDF文件”,
“Ms Word文件”
};
AlertDialog.Builder=新建AlertDialog.Builder(ChatActivity.this);
setTitle(“选择文件”);
setItems(选项,新的DialogInterface.OnClickListener(){
@凌驾
公共void onClick(对话框接口对话框,int i){
如果(i==0){
checker=“image”;
意图=新意图();
intent.setType(“image/*”);
intent.setAction(intent.ACTION\u GET\u CONTENT);
startActivityForResult(Intent.createChooser(Intent,“选择图像”),438;
}如果(i==1){
checker=“pdf”;
意图=新意图();
intent.setType(“application/pdf”);
intent.setAction(intent.ACTION\u GET\u CONTENT);
startActivityForResult(Intent.createChooser(Intent,“选择PDF文件”),438);
}如果(i==2){
checker=“docx”;
意图=新意图();
intent.setType(“应用程序/msword”);
intent.setAction(intent.ACTION\u GET\u CONTENT);
startActivityForResult(Intent.createChooser(Intent,“选择Ms Word文件”),438);
}
}
});
builder.show();
}
});
seenListener=null;
}
@凌驾
受保护的void onStart(){
super.onStart();
LoadMessages();
callImage.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
SheckSelf许可证和Calluser();
}
});
Toast.makeText(这是“onStart”,Toast.LENGTH_SHORT).show();
}
私有无效初始化控制器(){
工具栏=findViewById(R.id.group\u chat\u工具栏);
设置支持操作栏(工具栏);
ActionBar ActionBar=getSupportActionBar();
if(actionBar!=null){
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setDisplayShowCustomEnabled(true);
LayoutInflater LayoutInflater=(LayoutInflater)this.getSystemService(getApplicationContext().LAYOUT\u充气机\u服务);
View actionBarView=LayoutFlater.充气(R.layout.custom\u chat\u bar,空);
actionBar.setCustomView(actionBarView);
}
auth=FirebaseAuth.getInstance();
messageSenderID=auth.getCurrentUser().getUid();
RootRef=FirebaseDatabase.getInstance().getReference();
callImage=findviewbyd(R.id.custom\u user\u调用);
userImage=findviewbyd(R.id.custom\u profile\u image);
用户名=findViewById(R.id.custom\u profile\u name);
userLastSeen=findViewById(R.id.custom\u user\u last\u-seen);
SendMessageButton=findViewById(R.id.send\u message\u btn);
MessageInputText=findviewbyd(R.id.input\u message);
recyclerView=findViewById(R.id.private\u messages\u list\u用户);
swipeRefreshLayout=findViewById(R.id.swipeRefreshLayout);
sendFileButton=findviewbyd(R.id.send\u files\u btn);
progressDialog=新建progressDialog(ChatActivity.this);
linearLayoutManager=新的linearLayoutManager(此);
recyclerView.setLayoutMana
// When adding new data
adapter.addAll(data);
adapter.notifyDataSetChanged();
// when updating data again in onResume or onStart
adapter.clear();// clear old data from list
adapter.addAll(data);
adapter.notifyDataSetChanged();
//Inside adapter
//Adding item
void addAll(List<Data> data){
list.addAll(data);
}
//For clearing list
void clear(){
list.clear();
// To update list automatically add below line
//notifyDataSetChanged();
}