问题
protected void onPostExecute( ArrayList<HashMap<String,String>> myArrayList)// for arraylist(ArrayList<String> result)
{
for (HashMap<String, String> data : myArrayList)
{
String sender_no = data.get(TAG_SENDER_NO);
String msg1=data.get(TAG_SEN_MSG);
String receiver_no=data.get(TAG_RECEIVER_NO);
if(sender_no.equals(senderno))
{
ListAdapter adapter = new SimpleAdapter(SinglechatActivity.this, myArrayList,R.layout.list_row_layout_even,
new String[] { TAG_SEN_MSG },new int[] { R.id.message_me });
// CustomList adapter= new CustomList(SinglechatActivity.this,myArrayList);//sender_no, msg1, receiver_no);
ListView lv = (ListView) findViewById(R.id.listview);
lv.setAdapter( adapter);
}
else
{
ListAdapter adapter = new SimpleAdapter(SinglechatActivity.this, myArrayList,R.layout.list_row_layout_odd,
new String[] { TAG_SEN_MSG },new int[] { R.id.message_frnd });
// CustomList adapter= new CustomList(SinglechatActivity.this, sender_no, msg1, receiver_no);
ListView lv = (ListView) findViewById(R.id.listview);
lv.setAdapter( adapter);
}
In this, I would like to have message on right hand side and left hand side based on the sender and receiver.
回答1:
Use Custom adapter
with separate layouts for sender and receiver messages. It is called Heterogeneous ListView
.
Something like this
public class MyAdapter extends BaseAdapter {
ArrayList<HashMap<String,String>> messages;
int SENDER_MESSAGE = 0;
int RECEIVER_MESSAGE = 1;
Context context;
@Override
public int getCount() {
return messages.size();
}
@Override
public Object getItem(int position) {
return messages.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public int getViewTypeCount() {
return 2;
}
@Override
public int getItemViewType(int position) {
//This is dummy logic
//Write your own logic to differentiate between sender and receiver message
if (position % 2 == 0) {
return SENDER_MESSAGE;
}
else {
return RECEIVER_MESSAGE;
}
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if (getItemViewType(position) == SENDER_MESSAGE) {
convertView = inflater.inflate(R.layout.sender_message_layout, null);
}
else {
//Received message
convertView = inflater.inflate(R.layout.received_message_layout, null);
}
}
//...set text to message layout here
}
}
For more info on Custom Adapter
you can refer this
http://www.vogella.com/articles/AndroidListView/article.html#adapterown_example
For heterogeneous ListView (Different row layouts in ListView) tutorial you can refer this
http://chrislee.kr/wp/tag/getitemviewtype-tutorial/
回答2:
In your onBindViewHolder() method of your recyclerView adapter you can align the sender or receiver view layout programatically using an "if" statement. For example if it is sender align left or right, e.t.c. Use the code below for example to access and set the view layout parameters:
RelativeLayout.LayoutParams params =
(RelativeLayout.LayoutParams)button.getLayoutParams();
params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
params.addRule(RelativeLayout.LEFT_OF, R.id.id_to_be_left_of);
button.setLayoutParams(params);
来源:https://stackoverflow.com/questions/20757988/chat-application-in-android-so-that-sender-and-receiver-message-should-be-on-dif