상황:
채팅앱을 만들어보고 있습니다.
처음엔 table layout에 그냥 add 하여 90년대 채팅처럼 나오게 했었는데요.
채팅 내용을 listview와 adapter를 사용하여 말풍선처럼 나오게 시도하는 중에 막혔습니다.
문제:
에러는 없는데 아무것도 보여지지가 않습니다ㅠ
add도 제대로 하는 것 같고.. notify도 해주는데 왜 화면으로 뜨지 않는 걸까요?
뭔가 중요한 절차를 빼먹은 것 같은데
adapter를 처음 써봐서 잘 모르겠습니다..
고수님들의 답변 부탁드립니다..
코드:
public class ChatActivity extends Activity {
SharedPreferences prefs;
List<NameValuePair> params;
EditText chat_msg;
Button send_btn;
Bundle bundle;
TableLayout tab;
// Chat messages list adapter
private MessagesListAdapter adapter;
private List<CustomMsg> listMessages;
private ListView listViewMessages;
SQLiteDatabase db;
String newQuery = "create table dialogue (id integer primary key , name text, msg text);";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_chat);
listViewMessages = (ListView) findViewById(R.id.list_view_messages);
prefs = getSharedPreferences("Chat", 0);
bundle = getIntent().getBundleExtra("INFO");
SharedPreferences.Editor edit = prefs.edit();
edit.putString("CURRENT_ACTIVE", bundle.getString("mobno"));
edit.commit();
LocalBroadcastManager.getInstance(this).registerReceiver(onNotice, new IntentFilter("Msg"));
listMessages = new ArrayList<CustomMsg>();
adapter = new MessagesListAdapter(this, listMessages);
listViewMessages.setAdapter(adapter);
db = openOrCreateDatabase("dbname", MODE_WORLD_WRITEABLE, null);
try{
db.execSQL(newQuery);
} catch (Exception e) {
e.printStackTrace();
}
selectData();
/* 상대방이 한말 표시 */
if(bundle.getString("name") != null){
//append message to list
CustomMsg m = new CustomMsg(bundle.getString("name"), bundle.getString("msg"), false);
appendMessage(m);
}
//내가 한말 표시
//내가 입력하는 칸:chat_msg
chat_msg = (EditText)findViewById(R.id.chat_msg);
send_btn = (Button)findViewById(R.id.sendbtn);
send_btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
insertData("You: ",chat_msg.getText().toString());
Log.d("test", "you: " + chat_msg.getText().toString());
//append message to list
CustomMsg m = new CustomMsg("Me", chat_msg.getText().toString(), true);
appendMessage(m);
new Send().execute();
}
});
}
/**
* Appending message to list view
* */
private void appendMessage(final CustomMsg m) {
runOnUiThread(new Runnable() {
@Override
public void run() {
listMessages.add(m);
adapter.notifyDataSetChanged();
}
});
}
private BroadcastReceiver onNotice= new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String str = intent.getStringExtra("msg");
String str1 = intent.getStringExtra("fromname");
String str2 = intent.getStringExtra("fromu");
if(str2.equals(bundle.getString("mobno"))){
insertData(str1, str);
Log.d("test", "2 name: " + str1 + " msg: " + str);
//append message to list
CustomMsg m = new CustomMsg(str1, str, false);
appendMessage(m);
}
}
};
private class Send extends AsyncTask<String, String, JSONObject> {
@Override
protected JSONObject doInBackground(String... args) {
JSONParser json = new JSONParser();
params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("from", prefs.getString("REG_FROM","")));
params.add(new BasicNameValuePair("fromn", prefs.getString("FROM_NAME","")));
params.add(new BasicNameValuePair("to", bundle.getString("mobno")));
params.add((new BasicNameValuePair("msg",chat_msg.getText().toString())));
JSONObject jObj = json.getJSONFromUrl("http://주소:8000/send",params);
return jObj;
}
@Override
protected void onPostExecute(JSONObject json) {
chat_msg.setText("");
String res = null;
try {
res = json.getString("response");
if(res.equals("Failure")){
Toast.makeText(getApplicationContext(),"The user has logged out. You cant send message anymore !",Toast.LENGTH_SHORT).show();
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}
private void insertData(String name,String msg){
db.beginTransaction();
try{
String sql = "insert into dialogue (name,msg) values ('"+ name +"','"+ msg +"');";
db.execSQL(sql);
db.setTransactionSuccessful();
}catch(Exception e){
e.printStackTrace();
}finally{
db.endTransaction();
}
}
public void selectData(){
String sql = "select * from dialogue";
Cursor result = db.rawQuery(sql, null);
result.moveToFirst();
while(!result.isAfterLast()){
//append message to list
CustomMsg m = new CustomMsg(result.getString(1), result.getString(2), false);
appendMessage(m);
result.moveToNext();
}
result.close();
}
}
adapter 코드:
package learn2crack.chat;
import java.util.List;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
public class MessagesListAdapter extends BaseAdapter {
private Context context;
private List<CustomMsg> messagesItems;
public MessagesListAdapter(Context context, List<CustomMsg> navDrawerItems) {
this.context = context;
this.messagesItems = navDrawerItems;
}
@Override
public int getCount() {
return messagesItems.size();
}
@Override
public Object getItem(int position) {
return messagesItems.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@SuppressLint("InflateParams")
@Override
public View getView(int position, View convertView, ViewGroup parent) {
/**
* The following list not implemented reusable list items as list items
* are showing incorrect data Add the solution if you have one
* */
CustomMsg m = messagesItems.get(position);
LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
// Identifying the message owner
if (m.isSelf()) {
// message belongs to you, so load the right aligned layout
convertView = mInflater.inflate(R.layout.list_item_message_right,null);
} else {
// message belongs to other person, load the left aligned layout
convertView = mInflater.inflate(R.layout.list_item_message_left,null);
}
TextView lblFrom = (TextView) convertView.findViewById(R.id.lblMsgFrom);
TextView txtMsg = (TextView) convertView.findViewById(R.id.txtMsg);
txtMsg.setText(m.getMessage());
lblFrom.setText(m.getFromName());
return convertView;
}
}