0

こんにちは私はRecyclerViewを使ってtwilioチャットを開発しました。その後、私はRecyclerViewの内部でフォームビューと呼び出し画面をチャットメッセージアイテムとして、変更ビュータイプで実装します。RecyclerViewチャットウィンドウ内で複数のレイアウトを実装する

これは効率的な方法ですか?他の方法で私に示唆してください、ありがとう。

が、これは私のコードです:

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); 
} 

} 

アダプタ全コード:

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(); 
} 
} 

これは私が何をしたいのUIです。

+0

「アダプタ」からコードを投稿してください。そうすることが正しいかどうかを教えてください。 –

+0

@BartekLipinskiアダプターのフルコードを追加しました – yathavan

答えて

0

ViewHoldersを使用していると仮定すると、実装は正しいようです。 1つの改善は、getItemViewType(int position)メソッドをオーバーライドして、各要素ビュータイプ(その位置とcalling変数によって与えられる)を返すことです。そうすれば、コード内のif文を1つのswitch文で置き換えることができます。

関連する問題