2016-06-22 38 views
0

我试图使用ArrayListRecyclerview.Adapter获得所有用户聊天(在我的数据库中创建),但我的模拟器屏幕上仅显示了我的ArrayList中的第一项。ArrayList只显示RecyclerView中的单个项目

这里的相应的代码:

MainActivity

package com.wipro.chat.activity; 

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.content.IntentFilter; 
import android.os.Bundle; 
import android.support.v4.content.LocalBroadcastManager; 
import android.support.v7.app.AppCompatActivity; 
import android.support.v7.widget.DefaultItemAnimator; 
import android.support.v7.widget.LinearLayoutManager; 
import android.support.v7.widget.RecyclerView; 
import android.support.v7.widget.Toolbar; 
import android.util.Log; 
import android.view.Menu; 
import android.view.MenuInflater; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.Toast; 

import com.android.volley.NetworkResponse; 
import com.android.volley.Request; 
import com.android.volley.Response; 
import com.android.volley.VolleyError; 
import com.android.volley.toolbox.StringRequest; 
import com.google.android.gms.common.ConnectionResult; 
import com.google.android.gms.common.GoogleApiAvailability; 

import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject; 

import java.util.ArrayList; 

import com.wipro.chat.R; 
import com.wipro.chat.adapter.ChatRoomsAdapter; 
import com.wipro.chat.app.Config; 
import com.wipro.chat.app.EndPoints; 
import com.wipro.chat.app.MyApplication; 
import com.wipro.chat.gcm.GcmIntentService; 
import com.wipro.chat.gcm.NotificationUtils; 
import com.wipro.chat.helper.SimpleDividerItemDecoration; 
import com.wipro.chat.model.ChatRoom; 
import com.wipro.chat.model.Message; 

public class MainActivity extends AppCompatActivity { 

    private String TAG = MainActivity.class.getSimpleName(); 
    private static final int PLAY_SERVICES_RESOLUTION_REQUEST = 9000; 
    private BroadcastReceiver mRegistrationBroadcastReceiver; 
    private ArrayList<ChatRoom> chatRoomArrayList; 
    private ChatRoomsAdapter mAdapter; 
    private RecyclerView recyclerView; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     /** 
     * Check for login session. If not logged in launch 
     * login activity 
     * */ 
     if (MyApplication.getInstance().getPrefManager().getUser() == null) { 
      launchLoginActivity(); 
     } 

     setContentView(R.layout.activity_main); 
     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 

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

     /** 
     * Broadcast receiver calls in two scenarios 
     * 1. gcm registration is completed 
     * 2. when new push notification is received 
     * */ 
     mRegistrationBroadcastReceiver = new BroadcastReceiver() { 
      @Override 
      public void onReceive(Context context, Intent intent) { 

       // checking for type intent filter 
       if (intent.getAction().equals(Config.REGISTRATION_COMPLETE)) { 
        // gcm successfully registered 
        // now subscribe to `global` topic to receive app wide notifications 
        subscribeToGlobalTopic(); 

       } else if (intent.getAction().equals(Config.SENT_TOKEN_TO_SERVER)) { 
        // gcm registration id is stored in our server's MySQL 
        Log.e(TAG, "GCM registration id is sent to our server"); 

       } else if (intent.getAction().equals(Config.PUSH_NOTIFICATION)) { 
        // new push notification is received 
        handlePushNotification(intent); 
       } 
      } 
     }; 

     chatRoomArrayList = new ArrayList<>(); 
     mAdapter = new ChatRoomsAdapter(this, chatRoomArrayList); 
     LinearLayoutManager layoutManager = new LinearLayoutManager(this); 
     recyclerView.setLayoutManager(layoutManager); 
     recyclerView.addItemDecoration(new SimpleDividerItemDecoration(
       getApplicationContext() 
     )); 
     recyclerView.setItemAnimator(new DefaultItemAnimator()); 
     recyclerView.setAdapter(mAdapter); 

     recyclerView.addOnItemTouchListener(new ChatRoomsAdapter.RecyclerTouchListener(getApplicationContext(), recyclerView, new ChatRoomsAdapter.ClickListener() { 
      @Override 
      public void onClick(View view, int position) { 
       // when chat is clicked, launch full chat thread activity 
       ChatRoom userChatRoom = chatRoomArrayList.get(position); 
       Intent intent = new Intent(MainActivity.this, ChatRoomActivity.class); 
       intent.putExtra("user_id", userChatRoom.getId()); 
       intent.putExtra("name", userChatRoom.getName()); 
       startActivity(intent); 
      } 

      @Override 
      public void onLongClick(View view, int position) { 

      } 
     })); 

     /** 
     * Always check for google play services availability before 
     * proceeding further with GCM 
     * */ 
     if (checkPlayServices()) { 
      registerGCM(); 
      fetchChatRooms(); 
     } 
    } 

    /** 
    * Handles new push notification 
    */ 
    private void handlePushNotification(Intent intent) { 
     /*int type = intent.getIntExtra("type", -1); 

     // if the push is of chat room message 
     // simply update the UI unread messages count 
     if (type == Config.PUSH_TYPE_CHATROOM) { 
      Message message = (Message) intent.getSerializableExtra("message"); 
      String chatRoomId = intent.getStringExtra("chat_room_id"); 

      if (message != null && chatRoomId != null) { 
       updateRow(chatRoomId, message); 
      } 
     } else if (type == Config.PUSH_TYPE_USER) { 
      // push belongs to user alone 
      // just showing the message in a toast 
      Message message = (Message) intent.getSerializableExtra("message"); 
      Toast.makeText(getApplicationContext(), "New push: " + message.getMessage(), Toast.LENGTH_LONG).show(); 
     }*/ 
     Message message = (Message) intent.getSerializableExtra("message"); 
     String userChatRoomId = intent.getStringExtra("user_id"); 

     if (message != null && userChatRoomId != null) { 
      updateRow(userChatRoomId, message); 
     } 


    } 

    /** 
    * Updates the chat list unread count and the last message 
    */ 
    private void updateRow(String chatRoomId, Message message) { 
     for (ChatRoom cr : chatRoomArrayList) { 
      if (cr.getId().equals(chatRoomId)) { 
       int index = chatRoomArrayList.indexOf(cr); 
       cr.setLastMessage(message.getMessage()); 
       cr.setUnreadCount(cr.getUnreadCount() + 1); 
       chatRoomArrayList.remove(index); 
       chatRoomArrayList.add(index, cr); 
       break; 
      } 
     } 
     mAdapter.notifyDataSetChanged(); 
    } 


    /** 
    * fetching the chat rooms by making http call 
    */ 
    private void fetchChatRooms() { 
     StringRequest strReq = new StringRequest(Request.Method.GET, 
       EndPoints.CHAT_ROOMS, new Response.Listener<String>() { 

      @Override 
      public void onResponse(String response) { 
       Log.e(TAG, "response: " + response); 

       try { 
        JSONObject obj = new JSONObject(response); 

        // check for error flag 
        if (obj.getBoolean("error") == false) { 
         JSONArray chatRoomsArray = obj.getJSONArray("chat_rooms"); 
         for (int i = 0; i < chatRoomsArray.length(); i++) { 
          JSONObject chatRoomsObj = (JSONObject) chatRoomsArray.get(i); 
          ChatRoom cr = new ChatRoom(); 
          cr.setId(chatRoomsObj.getString("user_id")); 
          cr.setName(chatRoomsObj.getString("name")); 
          cr.setLastMessage(""); 
          cr.setUnreadCount(0); 
          cr.setTimestamp(chatRoomsObj.getString("created_at")); 

          chatRoomArrayList.add(cr); 
         } 

        } else { 
         // error in fetching chat rooms 
         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_LONG).show(); 
       } 

       mAdapter.notifyDataSetChanged(); 

       // subscribing to all chat room topics 
       //subscribeToAllTopics(); 
      } 
     }, 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); 
    } 

    // subscribing to global topic 
    private void subscribeToGlobalTopic() { 
     Intent intent = new Intent(this, GcmIntentService.class); 
     intent.putExtra(GcmIntentService.KEY, GcmIntentService.SUBSCRIBE); 
     intent.putExtra(GcmIntentService.TOPIC, Config.TOPIC_GLOBAL); 
     startService(intent); 
    } 

    // Subscribing to all chat room topics 
    // each topic name starts with `topic_` followed by the ID of the chat room 
    // Ex: topic_1, topic_2 
    /*private void subscribeToAllTopics() { 
     for (ChatRoom cr : chatRoomArrayList) { 

      Intent intent = new Intent(this, GcmIntentService.class); 
      intent.putExtra(GcmIntentService.KEY, GcmIntentService.SUBSCRIBE); 
      intent.putExtra(GcmIntentService.TOPIC, "topic_" + cr.getId()); 
      startService(intent); 
     } 
    }*/ 

    private void launchLoginActivity() { 
     Intent intent = new Intent(MainActivity.this, LoginActivity.class); 
     intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); 
     startActivity(intent); 
     finish(); 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 

     // register GCM registration complete receiver 
     LocalBroadcastManager.getInstance(this).registerReceiver(mRegistrationBroadcastReceiver, 
       new IntentFilter(Config.REGISTRATION_COMPLETE)); 

     // register new push message receiver 
     // by doing this, the activity will be notified each time a new message arrives 
     LocalBroadcastManager.getInstance(this).registerReceiver(mRegistrationBroadcastReceiver, 
       new IntentFilter(Config.PUSH_NOTIFICATION)); 

     // clearing the notification tray 
     NotificationUtils.clearNotifications(); 
    } 

    @Override 
    protected void onPause() { 
     LocalBroadcastManager.getInstance(this).unregisterReceiver(mRegistrationBroadcastReceiver); 
     super.onPause(); 
    } 

    // starting the service to register with GCM 
    private void registerGCM() { 
     Intent intent = new Intent(this, GcmIntentService.class); 
     intent.putExtra("key", "register"); 
     startService(intent); 
    } 

    private boolean checkPlayServices() { 
     GoogleApiAvailability apiAvailability = GoogleApiAvailability.getInstance(); 
     int resultCode = apiAvailability.isGooglePlayServicesAvailable(this); 
     if (resultCode != ConnectionResult.SUCCESS) { 
      if (apiAvailability.isUserResolvableError(resultCode)) { 
       apiAvailability.getErrorDialog(this, resultCode, PLAY_SERVICES_RESOLUTION_REQUEST) 
         .show(); 
      } else { 
       Log.i(TAG, "This device is not supported. Google Play Services not installed!"); 
       Toast.makeText(getApplicationContext(), "This device is not supported. Google Play Services not installed!", Toast.LENGTH_LONG).show(); 
       finish(); 
      } 
      return false; 
     } 
     return true; 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     MenuInflater inflater = getMenuInflater(); 
     inflater.inflate(R.menu.menu_main, menu); 
     return true; 
    } 

    public boolean onOptionsItemSelected(MenuItem menuItem) { 
     switch (menuItem.getItemId()) { 
      case R.id.action_logout: 
       MyApplication.getInstance().logout(); 
       break; 
     } 
     return super.onOptionsItemSelected(menuItem); 
    } 
} 

ChatRoomsAdapter:其被检索聊天室

package com.wipro.chat.adapter; 

/** 
* Created by COMP on 16-06-2016. 
*/ 
import android.content.Context; 
import android.support.v7.widget.RecyclerView; 
import android.view.GestureDetector; 
import android.view.LayoutInflater; 
import android.view.MotionEvent; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.TextView; 

import java.text.ParseException; 
import java.text.SimpleDateFormat; 
import java.util.ArrayList; 
import java.util.Calendar; 
import java.util.Date; 

import com.wipro.chat.R; 
import com.wipro.chat.model.ChatRoom; 


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

    private Context mContext; 
    private ArrayList<ChatRoom> chatRoomArrayList; 
    private static String today; 

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

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


    public ChatRoomsAdapter(Context mContext, ArrayList<ChatRoom> chatRoomArrayList) { 
     this.mContext = mContext; 
     this.chatRoomArrayList = chatRoomArrayList; 

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

    @Override 
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View itemView = LayoutInflater.from(parent.getContext()) 
       .inflate(R.layout.chat_rooms_list_row, parent, false); 

     return new ViewHolder(itemView); 
    } 

    @Override 
    public void onBindViewHolder(ViewHolder holder, int position) { 
     ChatRoom chatRoom = chatRoomArrayList.get(position); 
     holder.name.setText(chatRoom.getName()); 
     holder.message.setText(chatRoom.getLastMessage()); 
     if (chatRoom.getUnreadCount() > 0) { 
      holder.count.setText(String.valueOf(chatRoom.getUnreadCount())); 
      holder.count.setVisibility(View.VISIBLE); 
     } else { 
      holder.count.setVisibility(View.GONE); 
     } 

     holder.timestamp.setText(getTimeStamp(chatRoom.getTimestamp())); 
    } 

    @Override 
    public int getItemCount() { 
     return chatRoomArrayList.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; 
    } 

    public interface ClickListener { 
     void onClick(View view, int position); 

     void onLongClick(View view, int position); 
    } 

    public static class RecyclerTouchListener implements RecyclerView.OnItemTouchListener { 

     private GestureDetector gestureDetector; 
     private ChatRoomsAdapter.ClickListener clickListener; 

     public RecyclerTouchListener(Context context, final RecyclerView recyclerView, final ChatRoomsAdapter.ClickListener clickListener) { 
      this.clickListener = clickListener; 
      gestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() { 
       @Override 
       public boolean onSingleTapUp(MotionEvent e) { 
        return true; 
       } 

       @Override 
       public void onLongPress(MotionEvent e) { 
        View child = recyclerView.findChildViewUnder(e.getX(), e.getY()); 
        if (child != null && clickListener != null) { 
         clickListener.onLongClick(child, recyclerView.getChildLayoutPosition(child)); 
        } 
       } 
      }); 
     } 

     @Override 
     public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) { 

      View child = rv.findChildViewUnder(e.getX(), e.getY()); 
      if (child != null && clickListener != null && gestureDetector.onTouchEvent(e)) { 
       clickListener.onClick(child, rv.getChildLayoutPosition(child)); 
      } 
      return false; 
     } 

     @Override 
     public void onTouchEvent(RecyclerView rv, MotionEvent e) { 
     } 

     @Override 
     public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) { 

     } 
    } 
} 

PHP码是这样的:

/* * * 
* fetching all chat rooms 
*/ 
$app->get('/chat_rooms', function() { 
    $response = array(); 
    $db = new DbHandler(); 

    // fetching all user tasks 
    $result = $db->getAllChats(); 

    $response["error"] = false; 
    $response["chat_rooms"] = array(); 

    // pushing single chat room into array 
    while ($chat_room = $result->fetch_assoc()) { 
     $tmp = array(); 
     $tmp["user_id"] = $chat_room["user_id"]; 
     $tmp["name"] = $chat_room["name"]; 
     $tmp["created_at"] = $chat_room["created_at"]; 
     array_push($response["chat_rooms"], $tmp); 
    } 

    echoRespnse(200, $response); 
}); 
public function getAllChats() { 
     $stmt = $this->conn->prepare("SELECT user_id, name, created_at FROM users"); 
     $stmt->execute(); 
     $tasks = $stmt->get_result(); 
     $stmt->close(); 
     return $tasks; 
    } 

有我的数据库中两个用户的聊天记录,即消息聊天和我得到无论是从数据库到ArrayList我却是只显示消息

适配器显示:从数据库 the RecyclerView.Adapter screen

响应: response from database

+0

chatRoomArrayList的大小是多少? – Pr38y

+0

大小为2,因为我在数据库中有2个聊天室。 chatRoomsArray.length()= 2 –

+2

确保R.layout.chat_rooms_list_row的根没有将其高度设置为match_parent。 – Luksprog

回答

0

检查recycler_view在主布局。高度应设为"wrap_content"

相关问题