마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

adapter가 안됩니다

0 추천

상황:

채팅앱을 만들어보고 있습니다.

처음엔 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;
	}
}

 

makkaba (200 포인트) 님이 2015년 2월 10일 질문
makkaba님이 2015년 2월 10일 수정

1개의 답변

0 추천
어뎁터쪽 코드도 확인해 봐야 할것 같습니다.

아니면

xml 에서 리스트뷰 height 값이 wrap_content로 되어 있는건 아닌지도 확인해보세요.

초보자분들이 간혹 리스트뷰를 스크롤뷰 안에 넣는다던지 하는 실수도 종종 하는듯 합니다.
이드로이드 (22,930 포인트) 님이 2015년 2월 10일 답변
이드로이드님이 2015년 2월 10일 수정
답글 감사합니다. 어댑터 코드를 추가하였습니다. 혹시 xml 때문일까요?
<ListView
        android:id="@+id/list_view_messages"
        android:layout_width="fill_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:background="@null"
        android:divider="@null"
        android:transcriptMode="alwaysScroll"
        android:stackFromBottom="true">
    </ListView>
...