안드로이드 개발 질문/답변
(글 수 45,052)
안녕하세요 ~! 저는 지금 listview를 만들고 잇는데요
현재 서버에 요청을 해서 서버의 DB에서 내용을 빼와서 listview에 뿌려주는 부분을 구현중에 있습니다.
현재 액티비티의 구성은 대략 이렇습니다
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
ㅣ 리스트뷰 ㅣ
ㅣ ㅣ
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
ㅣEditText ㅣ Buttonㅣ
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
대략 이런식으로 구성되어 있는데,
이 액티비티에 들어오면 바로 리스트뷰의 내용이 들어오질 않습니다.
EditText를 한번 눌러야 그제서야 내용이 나옵니다..
제가 예상하는 문제로는 thread에서 listview에 들어올 데이터를 가져올때 문제가 발생되는것같아
여기저기 다 쑤셔보고 runOnUiThread도 건드려보기도 했지만 전혀 모르겠습니다
이런 지식이 너무 절실한지라 여쭙겠습니다 ㅠ.ㅠ...
소스는 다음과 같습니다
package org.sns;
//import문 생략
public class snsView extends ListActivity { Button loginBtn; Button writeBtn; Button deleteBtn; EditText etContent; LinearLayout content; public static String userid, passwd; ArrayList<snsData> list; ContentAdapter s_adapter; int num = 0;
private ProgressDialog progress; Thread thread;
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); this.getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); setContentView(R.layout.snsview); writeBtn = (Button) findViewById(R.id.SNSContentWriteBtn); loginBtn = (Button) findViewById(R.id.loginBtn); etContent = (EditText) findViewById(R.id.etSNSContent); deleteBtn = (Button) findViewById(R.id.snsDeleteBtn); list = new ArrayList<snsData>(); s_adapter = new ContentAdapter(this, R.layout.snscontent, list); setListAdapter(s_adapter); list.clear(); select(); writeBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (LoginStatus.isStatus()) { String comment = etContent.getText().toString(); SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat( "yyyy.MM.dd HH:mm:ss", Locale.KOREA); Date date = new Date(); String mTime = mSimpleDateFormat.format(date); new networkProcess(3, userid, comment, mTime); progressProcess(); etContent.setText(""); etContent.clearFocus(); InputMethodManager mgr = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); mgr.hideSoftInputFromWindow(etContent.getWindowToken(), 0); } } }); }
public void refreshView() { list.clear(); s_adapter.notifyDataSetChanged(); select(); }
public class ContentAdapter extends ArrayAdapter<snsData> { private ArrayList<snsData> items; public ContentAdapter(Context context, int textViewResourceId, ArrayList<snsData> items) { super(context, textViewResourceId, items); // TODO Auto-generated constructor stub this.items = items; } public View getView(int position, View convertView, ViewGroup parent) { View v = convertView; ViewHolder holder; if (v == null) { LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); v = vi.inflate(R.layout.snscontent, null); holder = new ViewHolder(v); v.setTag(holder); } else holder = (ViewHolder) v.getTag(); snsData data = items.get(position); holder.getContent().setText(data.getContent()); holder.getDate().setText(data.getDate()); holder.getNick().setText(data.getNick()); holder.getButton().setTag(Integer.valueOf(position)); holder.getButton().setOnClickListener(delete); holder.getButton().setVisibility(View.INVISIBLE); holder.getLayout().setTag(Integer.valueOf(position)); holder.getLayout().setOnClickListener(layout); return v; } } final OnClickListener layout = new OnClickListener() { @Override public void onClick(View v) { int position = (Integer) v.getTag(); View vi = v; ViewHolder holder = new ViewHolder(vi); if (userid.equals(list.get(position).getId())) holder.getButton().setVisibility(View.VISIBLE); } }; final OnClickListener delete = new OnClickListener() { @Override public void onClick(View v) { int position = (Integer) v.getTag(); viewDeleteConfirm(Integer.valueOf(list.get(position).getNum())); progressProcess(); // refreshView(); } }; public void viewDeleteConfirm(int num) { final int delete = num; AlertDialog.Builder alert_confirm = new AlertDialog.Builder( snsView.this); alert_confirm.setMessage("글을 삭제하시겠습니까 ?").setCancelable(false) .setPositiveButton("확인", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { new networkProcess(4, delete); } }) .setNegativeButton("취소", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // 'No' return; } }); AlertDialog alert = alert_confirm.create(); alert.show(); } class ViewHolder { ViewGroup layout; View Base; TextView content; TextView date; TextView nick; Button deleteBtn; ViewHolder(View base) { this.Base = base; } public ViewGroup getLayout() { if (layout == null) layout = (ViewGroup) Base.findViewById(R.id.snsContentLayout); return layout; } public Button getButton() { if (deleteBtn == null) deleteBtn = (Button) Base.findViewById(R.id.snsDeleteBtn); return deleteBtn; } public TextView getContent() { if (content == null) content = (TextView) Base.findViewById(R.id.snsContent); return content; } public TextView getDate() { if (date == null) date = (TextView) Base.findViewById(R.id.snsDate); return date; } public TextView getNick() { if (nick == null) nick = (TextView) Base.findViewById(R.id.snsNick); return nick; } }
void progressProcess() { progress = ProgressDialog .show(snsView.this, "", "갱신중입니다.", true, false); Thread thread = new Thread(new Runnable() { @Override public void run() { mHandler.sendEmptyMessage(0); } }); thread.start(); } private Handler mHandler = new Handler() { public void handleMessage(Message msg) { progress.dismiss(); // 다이얼로그 삭제 } };
public void select() { final ResponseHandler<String> responseHandler = new ResponseHandler<String>() { @Override public String handleResponse(HttpResponse response) throws ClientProtocolException, IOException { String xml = null; HttpEntity entity = response.getEntity(); xml = EntityUtils.toString(entity); XMLHandler parser = new XMLHandler(); Document doc = parser.getDomElement(xml); NodeList nl = doc.getElementsByTagName("comment"); Log.v("length :", String.valueOf(nl.getLength())); for (int i = 0; i < nl.getLength(); i++) { Element e = (Element) nl.item(i); String content = parser.getValue(e, "content"); String date = parser.getValue(e, "date"); String nick = parser.getValue(e, "nick"); String num = parser.getValue(e, "num"); String id = parser.getValue(e, "id"); list.add(new snsData(num, id, content, date, nick)); //s_adapter.notifyDataSetChanged(); } return xml; } }; new Thread() { @Override public void run() { String url = "http://192.168.0.11:8080/webserver/M-EYE/server/select.jsp"; HttpClient http = new DefaultHttpClient(); try { // 서버에 전달할 파라메터 세팅 ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); HttpPost httpPost = new HttpPost(url); UrlEncodedFormEntity entityRequest = new UrlEncodedFormEntity( nameValuePairs, "UTF-8"); httpPost.setEntity(entityRequest); http.execute(httpPost, responseHandler); } catch (Exception e) { e.printStackTrace(); } } }.start(); } }
코드하이라트 기능좀 써주시길.. 본인이봐도 이해 못하실 소스이실텐데
http://www.androidpub.com/index.php?mid=android_dev_qna&document_srl=78641