0

Hallo, ich habe Twilio-Chat mit RecyclerView entwickelt. Danach implementiere ich die Formularansicht und den Aufruf des Bildschirms in der RecyclerView als Chat-Nachrichtenelement nach Änderungstyp.Mehrere Layouts im RecyclerView-Chatfenster implementieren

ist dieser effiziente Weg? auf jede andere weise bitte schlagen sie mir, danke.

dies ist mein Code:

if (viewType == SELF) { 

itemView = LayoutInflater.from(parent.getContext()) 
    .inflate(R.layout.chat_item_user, parent, false); 

} else if (viewType == formView) { 

itemView = LayoutInflater.from(parent.getContext()) 
    .inflate(R.layout.chat_form_item, parent, false); 

} else { 

if (calling == true) { 

    itemView = LayoutInflater.from(parent.getContext()) 
    .inflate(R.layout.chat_calling_screen, parent, false); 

} else { 

    itemView = LayoutInflater.from(parent.getContext()) 
    .inflate(R.layout.chat_item_other, parent, false); 
} 

} 

Adapter Voll Code:

class MessagesAdapter extends RecyclerView.Adapter <MessagesAdapter.ViewHolder> { 

class ViewHolder extends RecyclerView.ViewHolder { 
    public TextView messagedata, msgTime; 
    public ImageView profileImg; 
    public Button answer; 
    public Button decline; 
    public RelativeLayout formLayout; 

    public ViewHolder(View view) { 
    super(view); 
    messagedata = (TextView) view.findViewById(R.id.messagechat); 
    msgTime = (TextView) view.findViewById(R.id.msg_time); 
    profileImg = (ImageView) view.findViewById(R.id.chat_profile_img); 
    answer = (Button) view.findViewById(R.id.call_answer); 
    decline = (Button) view.findViewById(R.id.call_decline); 
    formLayout = (RelativeLayout) view.findViewById(R.id.form_container); 

    if (buttonAvaliable) { 

    answer.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     calling = false; 
     Intent answer = new Intent(MainActivity.this, VideoActivity.class); 
     finish(); 
     startActivity(answer); 
    } 
    }); 

    decline.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 

     calling = false; 
     int number = Integer.parseInt(String.valueOf(getAdapterPosition())); 
     finish(); 
     startActivity(getIntent()); 

    } 
    }); 

    } 

    buttonAvaliable = false; 

    if (formAvaliable) { 

    formLayout.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     Intent formActivity = new Intent(MainActivity.this, UserEvaluationChat.class); 
     startActivity(formActivity); 
    } 
    }); 

    } 

    formAvaliable = false; 

    } 
} 

public MessagesAdapter() { 

} 

@Override 
public MessagesAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View itemView; 

    if (viewType == SELF) { 

    itemView = LayoutInflater.from(parent.getContext()) 
    .inflate(R.layout.chat_item_user, parent, false); 

    } else if (viewType == formView) { 

    itemView = LayoutInflater.from(parent.getContext()) 
    .inflate(R.layout.chat_form_item, parent, false); 

    formAvaliable = true; 

    } else { 

    if (calling == true) { 

    itemView = LayoutInflater.from(parent.getContext()) 
    .inflate(R.layout.chat_calling_screen, parent, false); 

    buttonAvaliable = true; 
    calling = false; 

    } else { 

    itemView = LayoutInflater.from(parent.getContext()) 
    .inflate(R.layout.chat_item_other, parent, false); 
    } 

    calling = false; 

    } 
    return new ViewHolder(itemView); 
} 

@Override 
public int getItemViewType(int position) { 
    Message message = mMessages.get(position); 

    String userId = String.valueOf(getSharedPref("userId") + "_user").toLowerCase().trim(); 
    String author = String.valueOf(message.getAuthor()).toLowerCase().trim(); 

    if (message.getAuthor().equals(userId)) { 
    return SELF; 
    } 

    if (!message.getAuthor().equals(userId) && message.getMessageBody().equals("patientevaluation__form")) { 
    return formView; 
    } 

    return position; 
} 

@Override 
public void onBindViewHolder(ViewHolder holder, int position) { 

    Message message = mMessages.get(position); 

    String messageText = String.format("%s", message.getMessageBody()); 

    if (holder.getItemViewType() == formView) { 

    formAvaliable = true; 

    } else { 

    formAvaliable = false; 
    calling = false; 

    holder.messagedata.setTextSize(18); 
    holder.messagedata.setText(messageText); 

    } 

} 

@Override 
public int getItemCount() { 
    return mMessages.size(); 
} 
} 

Dies ist die Benutzeroberfläche, was ich will.

+0

Bitte schreiben Sie mehr Code von Ihrem 'Adapter', damit wir Ihnen sagen können, ob das der richtige Weg ist oder nicht. –

+0

@BartekLipinski Ich habe Adapter voller Code hinzugefügt – yathavan

Antwort

0

Angenommen, Sie verwenden ViewHolders, scheint Ihre Implementierung korrekt. Eine Verbesserung wäre jedoch, die Methode getItemViewType(int position) zu überschreiben, um jeden Elementansichtstyp zurückzugeben (gegeben durch seine Position und die Variable calling). Auf diese Weise können Sie die if Sätze in Ihrem Code durch einen einzigen switch Satz ersetzen.

Verwandte Themen