2016-07-11 70 views
1

enter image description here爲什麼recylerview安卓

我正在面臨兩個problem.why兩排(消息)之間這麼大的空間有兩行(消息)之間存在太多空間recylerview.i我試圖做一個聊天應用recyclerview.why在進入活動時未輸入消息,而是在消息編輯文本文本點擊時輸入消息。

我的代碼:

聊天佈局自己:

<TextView 
    android:id="@+id/message" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentRight="true" 
    android:layout_marginRight="10dp" 
    android:textIsSelectable="true" 
    android:background="@drawable/bg_bubble_gray" 
    android:textSize="14dp" /> 

<TextView 
    android:id="@+id/timestamp" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignRight="@id/message" 
    android:layout_below="@id/message" 
    android:layout_marginBottom="25dp" 
    android:padding="10dp" 
    android:textSize="10dp" /> 

chat layout myself: 



<?xml version="1.0" encoding="utf-8"?> 
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="horizontal" 
     android:paddingTop="5dp" 
     android:paddingLeft="16dp" 
     android:paddingRight="16dp" 
     > 

     <TextView 
      android:id="@+id/message" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignParentLeft="true" 
      android:layout_marginLeft="10dp" 
      android:textIsSelectable="true" 
      android:background="@drawable/bg_bubble_white" 
      android:textSize="14dp" /> 

     <TextView 
      android:id="@+id/timestamp" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignParentLeft="true" 
      android:layout_below="@id/message" 
      android:layout_marginBottom="25dp" 
      android:layout_marginLeft="10dp" 
      android:paddingLeft="10dp" 
      android:paddingTop="6dp" 
      android:textSize="10dp" /> 

    </LinearLayout> 

適配器:

public class ChatRoomThreadAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { 

private static String TAG = ChatRoomThreadAdapter.class.getSimpleName(); 

private String userId; 
private int SELF = 100; 
private static String today; 

private Context mContext; 
private ArrayList<Message> messageArrayList; 


public class ViewHolder extends RecyclerView.ViewHolder { 
    TextView message, timestamp; 

    public ViewHolder(View view) { 
     super(view); 
     message = (TextView) itemView.findViewById(R.id.message); 
     timestamp = (TextView) itemView.findViewById(R.id.timestamp); 
    } 
} 

public ChatRoomThreadAdapter(Context mContext, ArrayList<Message> messageArrayList, String userId) { 
    this.mContext = mContext; 
    this.messageArrayList = messageArrayList; 
    this.userId = userId; 

    Calendar calendar = Calendar.getInstance(); 
    today = String.valueOf(calendar.get(Calendar.DAY_OF_MONTH)); 
} 

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

    // view type is to identify where to render the chat message 
    // left or right 
    if (viewType == SELF) { 
     // self message 
     itemView = LayoutInflater.from(parent.getContext()) 
       .inflate(R.layout.chat_layout_myself, parent, false); 
    } else { 
     // others message 
     itemView = LayoutInflater.from(parent.getContext()) 
       .inflate(R.layout.chat_layout_other, parent, false); 
    } 


    return new ViewHolder(itemView); 
} 

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

    Message message = messageArrayList.get(position); 
    ((ViewHolder) holder).message.setText(message.getMessage()); 

    String timestamp = getTimeStamp(message.getCreatedAt()); 

    if (message.getUser().getName() != null) 
     timestamp = message.getUser().getName() + ", " + timestamp; 

    ((ViewHolder) holder).timestamp.setText(timestamp); 

} 

@Override 
public int getItemViewType(int position) { 
    Message message = messageArrayList.get(position); 
    if (message.getUser().getId().equals(userId)) { 
     return SELF; 
    } 

    return position; 
} 


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

public static String getTimeStamp(String dateStr) { 
    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
    String timestamp = ""; 

    today = today.length() < 2 ? "0" + today : today; 

    try { 
     Date date = format.parse(dateStr); 
     SimpleDateFormat todayFormat = new SimpleDateFormat("dd"); 
     String dateToday = todayFormat.format(date); 
     format = dateToday.equals(today) ? new SimpleDateFormat("hh:mm a") : new SimpleDateFormat("dd LLL, hh:mm a"); 
     String date1 = format.format(date); 
     timestamp = date1.toString(); 
    } catch (ParseException e) { 
     e.printStackTrace(); 
    } 
    return timestamp; 
} 
} 

聊天內容佈局:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    app:layout_behavior="@string/appbar_scrolling_view_behavior" 
    tools:context="com.systechdigital.webadeal.ChatActivity" 
    tools:showIn="@layout/activity_chat"> 


    <ListView 
     android:id="@android:id/list" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_above="@+id/listFooter" 
     android:layout_alignParentTop="true" 
     android:transcriptMode="alwaysScroll" 
     android:background="#393839" 
     /> 

    <LinearLayout 
     android:id="@+id/listFooter" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_alignParentBottom="true" 
     android:orientation="horizontal"> 

     <EditText 
      android:id="@+id/messageInput" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_weight="1" 
      android:inputType="textShortMessage" 
      android:lines="1" 
      android:singleLine="true" /> 

     <ImageButton 
      android:id="@+id/sendButton" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:src="@android:drawable/ic_menu_send" /> 
    </LinearLayout> 



</RelativeLayout> 

聊天活動:

public class ChatRoomActivity extends AppCompatActivity { 


private String TAG = ChatRoomActivity.class.getSimpleName(); 

private String chatRoomId; 
private RecyclerView recyclerView; 
private ChatRoomThreadAdapter mAdapter; 
private ArrayList<Message> messageArrayList; 
private EditText inputMessage; 
private Button btnSend; 
private AsyncTaskClass backgroundTask; 
private Context context_chatLisActivity; 
private ProgressDialog progressDialog; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_chat_room); 
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 


    inputMessage = (EditText) findViewById(R.id.message); 
    btnSend = (Button) findViewById(R.id.btn_send); 
    context_chatLisActivity=ChatRoomActivity.this; 

    chatRoomId = InfoSetClass.getRoom_id(); 
    Log.v("ResDRoomId",chatRoomId); 
//  String title = intent.getStringExtra("name"); 

//  getSupportActionBar().setTitle(title); 
//  getSupportActionBar().setDisplayHomeAsUpEnabled(true); 



    if (chatRoomId == null) { 
     Toast.makeText(getApplicationContext(), "Chat room not found!", Toast.LENGTH_SHORT).show(); 
     finish(); 
    } 

    recyclerView = (RecyclerView) findViewById(R.id.recycler_view); 

    messageArrayList = new ArrayList<>(); 


    // self user id is to identify the message owner 
    String selfUserId = InfoSetClass.getOwn_UserId(); 

    mAdapter = new ChatRoomThreadAdapter(this, messageArrayList, selfUserId); 

    LinearLayoutManager layoutManager = new LinearLayoutManager(this); 
    recyclerView.setLayoutManager(layoutManager); 
    recyclerView.setItemAnimator(new DefaultItemAnimator()); 
    recyclerView.setAdapter(mAdapter); 

/* mRegistrationBroadcastReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      if (intent.getAction().equals(Config.PUSH_NOTIFICATION)) { 
       // new push message is received 

      } 
     } 
    };*/ 

    btnSend.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      sendMessage(); 
     } 
    }); 

    fetchChatThread(); 

} 





/** 
* Posting a new message in chat room 
* will make an http call to our server. Our server again sends the message 
* to all the devices as push notification 
* */ 

private void sendMessage() { 
    final String message = this.inputMessage.getText().toString().trim(); 

    if (TextUtils.isEmpty(message)) { 
     Toast.makeText(getApplicationContext(), "Enter a message", Toast.LENGTH_SHORT).show(); 
     return; 
    } 




    this.inputMessage.setText(""); 

    StringRequest strReq = new StringRequest(Request.Method.POST, 
      endPoint, new Response.Listener<String>() { 

     @Override 
     public void onResponse(String response) { 
      Log.v("ResDSNDMsg ", response); 

      try { 
       JSONObject obj = new JSONObject(response); 

       // check for error 
       if (obj.getBoolean("error") == false) { 
        JSONObject commentObj = obj.getJSONObject("message"); 

        /*String commentId = commentObj.getString("message_id"); 
        String commentText = commentObj.getString("message"); 
        String createdAt = commentObj.getString("created_at"); 

        JSONObject userObj = obj.getJSONObject("user"); 
        String userId = userObj.getString("user_id"); 
        String userName = userObj.getString("name"); 
        User user = new User(userId, userName, null); 

        Message message = new Message(); 
        message.setId(commentId); 
        message.setMessage(commentText); 
        message.setCreatedAt(createdAt);*/ 


//      messageArrayList.add(message); 

        mAdapter.notifyDataSetChanged(); 
        if (mAdapter.getItemCount() > 1) { 
         // scrolling to bottom of the recycler view 
         recyclerView.getLayoutManager().smoothScrollToPosition(recyclerView, null, mAdapter.getItemCount() - 1); 
        } 

       } else { 
        Toast.makeText(getApplicationContext(), "" + obj.getString("message"), Toast.LENGTH_LONG).show(); 
       } 

      } catch (JSONException e) { 
       Log.e(TAG, "json parsing error: " + e.getMessage()); 
       Toast.makeText(getApplicationContext(), "json parse error: " + e.getMessage(), Toast.LENGTH_SHORT).show(); 
      } 
     } 
    }, new Response.ErrorListener() { 

     @Override 
     public void onErrorResponse(VolleyError error) { 
      NetworkResponse networkResponse = error.networkResponse; 
      Log.e(TAG, "Volley error: " + error.getMessage() + ", code: " + networkResponse); 
      Toast.makeText(getApplicationContext(), "Volley error: " + error.getMessage(), Toast.LENGTH_SHORT).show(); 
      inputMessage.setText(message); 
     } 
    }) { 

     @Override 
     protected Map<String, String> getParams() { 
      Map<String, String> params = new HashMap<String, String>(); 
      params.put("user_id", MyApplication.getInstance().getPrefManager().getUser().getId()); 
      params.put("message", message); 

      Log.e(TAG, "Params: " + params.toString()); 

      return params; 
     }; 
    }; 

    // disabling retry policy so that it won't make 
    // multiple http calls 

    int socketTimeout = 0; 
    RetryPolicy policy = new DefaultRetryPolicy(socketTimeout, 
      DefaultRetryPolicy.DEFAULT_MAX_RETRIES, 
      DefaultRetryPolicy.DEFAULT_BACKOFF_MULT); 

    strReq.setRetryPolicy(policy); 

    //Adding request to request queue 
    MyApplication.getInstance().addToRequestQueue(strReq); 
} 


/** 
* Fetching all the messages of a single chat room 
* */ 
private void fetchChatThread() { 

    progressDialog = new ProgressDialog(ChatRoomActivity.this); 
    progressDialog.setMessage("Please wait....."); 
    progressDialog.show(); 

    String chatFetch = ""; 

    backgroundTask = new AsyncTaskClass(context_chatLisActivity); 

    new android.os.Handler().postDelayed(new Runnable() { 
     @Override 
     public void run() { 
//    progressDialog.dismiss(); 

      if (progressDialog.isShowing()) { 
       try { 
        progressDialog.dismiss(); 
       } catch (Exception e) {// nothing } 

       } 
      } 

      String result = backgroundTask.getResponse(1); 

      Log.v("ResDMSGFetch", result); 

      try { 
       JSONObject js = new JSONObject(result); 
//   Log.v("ResDFrJ",js.toString()); 
       JSONArray arr = js.getJSONArray(""); 

       for (int i = 0; i < arr.length(); i++) { 
        JSONObject tmpOb = new JSONObject(arr.optString(i)); 



       } 


       mAdapter.notifyDataSetChanged(); 
       if (mAdapter.getItemCount() > 1) { 
        recyclerView.getLayoutManager().smoothScrollToPosition(recyclerView, null, mAdapter.getItemCount() - 1); 
       } else { 
        Toast.makeText(getApplicationContext(), "", Toast.LENGTH_LONG).show(); 
       } 

      } catch (JSONException e) { 

       Log.v("JSONExp_Users", e.toString()); 

      } 

     } 
    }, 3000); 


    /* StringRequest strReq = new StringRequest(Request.Method.GET, 
      endPoint, new Response.Listener<String>() { 

     @Override 
     public void onResponse(String response) { 
      Log.v("ResDMSGFetch: ", response); 

      try { 
       JSONObject obj = new JSONObject(response); 

       // check for error 
       if (obj.getBoolean("error") == false) { 
        JSONArray commentsObj = obj.getJSONArray("result"); 

        for (int i = 0; i < commentsObj.length(); i++) { 
         JSONObject commentObj = (JSONObject) commentsObj.get(i); 

         String commentId = commentObj.getString("message_id"); 
         String commentText = commentObj.getString("message"); 
         String createdAt = commentObj.getString("created_at"); 

         JSONObject userObj = commentObj.getJSONObject("user"); 
         String userId = userObj.getString("user_id"); 
         String userName = userObj.getString("username"); 
         User user = new User(userId, userName, null); 

         Message message = new Message(); 
         message.setId(commentId); 
         message.setMessage(commentText); 
         message.setCreatedAt(createdAt); 
         message.setUser(user); 

         messageArrayList.add(message); 
        } 

        mAdapter.notifyDataSetChanged(); 
        if (mAdapter.getItemCount() > 1) { 
         recyclerView.getLayoutManager().smoothScrollToPosition(recyclerView, null, mAdapter.getItemCount() - 1); 
        } 

       } else { 
        Toast.makeText(getApplicationContext(), "" + obj.getJSONObject("error").getString("message"), Toast.LENGTH_LONG).show(); 
       } 

      } catch (JSONException e) { 
       Log.e(TAG, "json parsing error: " + e.getMessage()); 
       Toast.makeText(getApplicationContext(), "json parse error: " + e.getMessage(), Toast.LENGTH_SHORT).show(); 
      } 
     } 
    }, new Response.ErrorListener() { 

     @Override 
     public void onErrorResponse(VolleyError error) { 
      NetworkResponse networkResponse = error.networkResponse; 
      Log.e(TAG, "Volley error: " + error.getMessage() + ", code: " + networkResponse); 
      Toast.makeText(getApplicationContext(), "Volley error: " + error.getMessage(), Toast.LENGTH_SHORT).show(); 
     } 
    }); 

    //Adding request to request queue 
    MyApplication.getInstance().addToRequestQueue(strReq);*/ 
} 

} 

我需要一些嚴重help.please就幫我解決這個問題,2。

+0

好,像你說的,但不工作我都試過了。 – AAA

回答

2

問題很簡單。您正在將每個佈局高度告知MATCH_PARENT。將android:layout_height="match_parent"更改爲android:layout_height="wrap_content"

這告訴佈局有一個高度包裹其子女或內容。您可以根據需要使用填充邊距以增加/減少連續行之間的間距。

所以,在chat_layout_myself.xml最終代碼應該是,

<?xml version="1.0" encoding="utf-8"?> 
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:orientation="horizontal" 
     android:paddingTop="5dp" 
     android:paddingLeft="16dp" 
     android:paddingRight="16dp" 
     > 

     <TextView 
      android:id="@+id/message" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignParentLeft="true" 
      android:layout_marginLeft="10dp" 
      android:textIsSelectable="true" 
      android:background="@drawable/bg_bubble_white" 
      android:textSize="14dp" /> 

     <TextView 
      android:id="@+id/timestamp" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignParentLeft="true" 
      android:layout_below="@id/message" 
      android:layout_marginBottom="25dp" 
      android:layout_marginLeft="10dp" 
      android:paddingLeft="10dp" 
      android:paddingTop="6dp" 
      android:textSize="10dp" /> 

    </LinearLayout> 
+0

感謝問題解決:) – AAA

+0

很高興它幫助你解決你的問題。請接受答案。 –

+0

我之前你說過。如果有可能請標記我的問題 – AAA