2017-06-25 5 views
0

私は、Firebaseを使ってChatAppをプログラムしたいと思っています。今は私がチャットしたユーザーを表示しています。しかし、今私は使用している日付文字列でソートするようにしたい: 例:21-06-2017 17:20。最新の時刻から最も早い時刻にソートする必要があります。日付でカスタムリストビューアをソート

マイアダプタ:

public class ChatAdapter extends ArrayAdapter<String> { 

private Activity context; 
private List<Chats> chatsList = new ArrayList<>(); 

public ChatAdapter(Activity context, List<Chats> chatsList) { 
    super(context, R.layout.abc_main_chat_item); 
    this.context = context; 
    this.chatsList = chatsList; 
} 

@Override 
public View getView(final int position, final View convertView, ViewGroup parent) { 
    LayoutInflater inflater = context.getLayoutInflater(); 
    View listViewItem = inflater.inflate(R.layout.abc_main_chat_item, null, true); 

    TextView tvusername = (TextView) listViewItem.findViewById(R.id.group_name); 
    TextView tvuid = (TextView) listViewItem.findViewById(R.id.useruid); 
    TextView tvlastmessage = (TextView) listViewItem.findViewById(R.id.latestMessage); 
    TextView tvlastmessagetime = (TextView) listViewItem.findViewById(R.id.latestMessageTime); 
    ImageView ivphoto = (ImageView) listViewItem.findViewById(R.id.profileImg); 

    tvusername.setText(chatsList.get(position).getUsername()); 
    tvlastmessage.setText(chatsList.get(position).getLastMessage()); 
    tvlastmessagetime.setText(chatsList.get(position).getLastMessageTime()); 
    tvuid.setText(chatsList.get(position).getUseruid()); 
    Picasso.with(getContext()).load(chatsList.get(position).getPhotoURL()).placeholder(R.drawable.ic_person_grey_round).into(ivphoto); 

    listViewItem.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Intent i = new Intent(context, Chat_Room.class); 
      i.putExtra("room_name", chatsList.get(position).getUsername()); 
      i.putExtra("room_uid", chatsList.get(position).getUseruid()); 
      context.startActivity(i); 

     } 
    }); 

    listViewItem.setOnLongClickListener(new View.OnLongClickListener() { 
     @Override 
     public boolean onLongClick(View v) { 
      final Dialog dialog = new Dialog(context); 
      dialog.setContentView(R.layout.abcd_listview_alertdia_layout); 
      ArrayList<String> list_of_chats = new ArrayList<>(); 
      final ArrayAdapter<String> arrayAdapter; 
      arrayAdapter = new ArrayAdapter<String>(context, android.R.layout.simple_list_item_1, list_of_chats); 

      list_of_chats.add(0, "Chatverlauf mit "+ chatsList.get(position).getUsername()+" löschen?"); 
      list_of_chats.add(1, "Profil von "+chatsList.get(position).getUsername()+" anschauen"); 
      arrayAdapter.notifyDataSetChanged(); 
      final ListView lv = (ListView) dialog.findViewById(R.id.lv); 
      lv.setAdapter(arrayAdapter); 
      lv.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
       @Override 
       public void onItemClick(AdapterView<?> parent, View view, final int position2, long id) { 
        if (position2 == 0) { 
         dialog.dismiss(); 
         AlertDialog.Builder alert = new AlertDialog.Builder(context); 
         alert.setTitle("Chatverlauf mit "+chatsList.get(position).getUsername()+" löschen?") 
           .setMessage("Du kannst das Löschen nicht rückgängig machen. Bist du dir sicher?") 
           .setNegativeButton("Abbrechen", new DialogInterface.OnClickListener() { 
            @Override 
            public void onClick(DialogInterface dialog, int which) { 
             dialog.cancel(); 
            } 
           }) 
           .setPositiveButton("OK", new DialogInterface.OnClickListener() { 
            @Override 
            public void onClick(DialogInterface dialog, int which) { 
             FirebaseDatabase.getInstance().getReference().child("chats").child("userchats").child(FirebaseAuth.getInstance().getCurrentUser().getUid()).child(chatsList.get(position).getUseruid()).setValue(null); 
             FirebaseDatabase.getInstance().getReference().child("chats").child("users").child(FirebaseAuth.getInstance().getCurrentUser().getUid()).child("messages").child(chatsList.get(position).getUseruid()).setValue(null); 
            } 
           }).setCancelable(true) 
           .show(); 
         lv.setAdapter(arrayAdapter); 
         arrayAdapter.notifyDataSetChanged(); 
        } 
        if (position2 == 1) { 
         Intent intent = new Intent(context, ViewContact.class); 
         intent.putExtra("useruid", chatsList.get(position).getUseruid()); 
         context.startActivity(intent); 
        } 
       } 
      }); 
      dialog.show(); 
      return true; 
     } 
    }); 

    ivphoto.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      final Dialog dialog = new Dialog(context); 
      dialog.setContentView(R.layout.abcd_profile_pic_dialog_layout); 
      ImageView imageView = (ImageView) dialog.findViewById(R.id.alertImage); 
      TextView textView = (TextView)dialog.findViewById(R.id.alertdialogtv); 
      ImageView message = (ImageView)dialog.findViewById(R.id.alertMessage); 
      ImageView profile = (ImageView)dialog.findViewById(R.id.alertProfile); 
      profile.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        Intent intent = new Intent(context, ViewContact.class); 
        intent.putExtra("useruid", chatsList.get(position).getUseruid()); 
        context.startActivity(intent); 
        dialog.dismiss(); 
       } 
      }); 
      message.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        Intent intent = new Intent(getContext(), Chat_Room.class); 
        intent.putExtra("room_name", chatsList.get(position).getUsername()); 
        intent.putExtra("room_uid", chatsList.get(position).getUseruid()); 
        context.startActivity(intent); 
       } 
      }); 
      Picasso.with(getContext()).load(chatsList.get(position).getPhotoURL()).placeholder(R.drawable.ic_person_grey_round).into(imageView); 
      textView.setText(chatsList.get(position).getUsername()); 
      dialog.setCancelable(true); 
      dialog.show(); 
     } 
    }); 

    return listViewItem; 
} 

は、これは私が私のArrayList得た方法である:

`for(DataSnapshot snapshot : dataSnapshot.getChildren()){ 
        username.add(snapshot.child("roomname").getValue().toString()); 
        photoURL.add(snapshot.child("photoURL").getValue().toString()); 
        lastmessage.add(snapshot.child("lastMessage").getValue().toString()); 
        lastmessagetime.add(snapshot.child("lastMessageTime").getValue().toString()); 
        useruid.add(snapshot.child("userUiD").getValue().toString()); 
       } 

       ChatAdapter chatAdapter = new ChatAdapter(getActivity(), username, useruid, photoURL, lastmessage, lastmessagetime); 
       listView.setAdapter(chatAdapter);` 

をしかし、どのように、私はリストとしてそれを渡すことができます? リストに追加するにはどうすればよいですか?

ソートすることは可能ですか?

私はあなたが私を助けることを願っています:) ありがとう。

答えて

1

これはもちろん可能です。 しかし、まず、あなたのデータ構造は奇妙で実用的ではありません。

あなたのメッセージは、それが非常に複雑になりた単一のアレイに渡されます。

ArrayList<String> username, ArrayList<String> useruid, ArrayList<String> photoURL, ArrayList<String> lastmessage, ArrayList<String> lastmessagetime

ベターメッセージオブジェクトは、単一の項目が含まれているMessageオブジェクト、このようなもののリストを持っているだろう。

public class Message { 

    String username; 
    String useruid; 
    String photoURL; 
    String message; 
    Date timestamp; 
    //...getter and setter 
} 

さらに良いことには、MessageオブジェクトだけではuserId、messageTextとタイムスタンプが含ま持っているだろう。それはあなたが必要とするすべてです。

次に、アダプタにList<Message> messagesを渡すことができます。

メッセージリストを並べ替えるには、Comparableクラスを実装して、好みの方法でオブジェクトを並べ替えることができます。

public class Message implements Comparable<Message>{ 

    String username; 
    String useruid; 
    String photoURL; 
    String message; 
    Date timestamp; 

    @Override 
    public int compareTo(@NonNull Message o) { 
     return this.timestamp.compareTo(o.timestamp) 
    } 
} 

あなたMessageクラスに匹敵する追加した場合は、リストをソートする Collections.sort(messages);を使用することができます。

java comparableをご覧になると、various examplesがあります。また、このstackoverflow answer.

編集をチェックアウト:あなたのケースで

、あなたの要素を取得しているときのようなものだろう:

List<Message> messages = new ArrayList<Message>(); 

for(DataSnapshot snapshot : dataSnapshot.getChildren()){ 
    Message message = new Message(); 
    message.setName(snapshot.child("roomname").getValue().toString()); 
    … 
    //set all your properties and then add that object to the messages list 
    messages.add(message); 
    } 
Collections.sort(messages); // sort the message list 
ChatAdapter chatAdapter = new ChatAdapter(getActivity(), messages); 
listView.setAdapter(chatAdapter); 
+0

をあなたはそれを同じように渡すことができます追加の質問に答えるためにあなたは現在、すべてのリストを渡しています。私は自分の答えを広げ、その話題に関する別の答えを結んだ。 – stamanuel

+0

申し訳ありません。しかし、私はリストに何かを追加する方法を取得しない。最後にArrayListを編集してsomethigを追加する方法を教えてください。 –

+0

私はこのようにしてもうまくいきません: 'chats.setUsername(snapshot.child(" roomname ")。getValue()。toString()); chats.setPhotoURL(snapshot.child( "photoURL")。getValue()。toString()); リスト chatsList =新しいArrayList <>(); chatsList.add(チャット); ChatAdapter chatAdapter =新しいChatAdapter(getActivity()、chatsList); listView.setAdapter(chatAdapter); ' –