2

サーバーでデータベースMySQLを使用してチャットを実装しています。今、スレッドでカスタム Listview を更新したいのですが、方法がわかりません??

私のコードは次のとおりです。

chat_con_activity.java

    import android.app.Activity;
    import android.content.Context;
    import android.os.AsyncTask;
    import android.os.Bundle;
    import android.os.StrictMode;
    import android.os.SystemClock;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.ArrayAdapter;
    import android.widget.BaseAdapter;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.ListAdapter;
    import android.widget.ListView;
    import android.widget.Toast;

    import com.example.classes.IpUpdater;
    import com.example.classes.Messages_con_adapter;
    import com.example.classes.Send_Message;
    import com.example.classes.View_Messages;
    import com.example.tabs.user_online;
    import com.example.wifivoip.R;

    public class chat_con_activity extends Activity implements Runnable{
        private ListView list = null;
        ArrayAdapter<String> la;
        Button send_btn;
        EditText chat_msg;
        String user;
        String cTo;
        String[] names;
        String[] namesfrm;
        String[] msgs;
        String[] datez;
        int stop = 0;
        Context cn = this;
        Thread x;
        int count;
        Messages_con_adapter mca;
        @Override
        public void onCreate(Bundle savedInstanceState) {
            StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
            .permitAll().build();
    StrictMode.setThreadPolicy(policy);
            super.onCreate(savedInstanceState);
            setContentView(R.layout.send_chat);
            send_btn = (Button) findViewById(R.id.chat_btn_send);
            chat_msg = (EditText) findViewById(R.id.chat_text_send);
            user = getIntent().getStringExtra("cFrom");
            cTo = getIntent().getStringExtra("cTo");



            list = (ListView) findViewById(R.id.chat_list_view);

            Toast.makeText(getApplicationContext(), ""+user+" "+cTo, Toast.LENGTH_SHORT).show();
            display(); 

            x = new Thread(new Runnable() {

                @Override
                public void run() {
                    // TODO Auto-generated method stub
                    while(true){
                        try{
                            //Thread.sleep(1000);

                            View_Messages vm = new View_Messages(user, cTo);
                            int cnt = vm.getIfNew();
                            System.err.println(""+cnt+" "+count);
                            if(cnt != count){
                                System.err.println(""+cnt+" "+count);


                                names = vm.getAllNamesTo();
                                namesfrm = vm.getAllNamesFrom();
                                msgs = vm.getAllMsgs();
                                datez = vm.getAllDates();
                                count = vm.getIfNew();

                                list.setAdapter(la);
                                list.setSelection(list.getAdapter().getCount() - 1);

                            }
                            if(stop == 1){
                                break;
                            }

                        }catch (Exception e) {
                            // TODO: handle exception
                        }
                    }
                }
            });x.start();

            send_btn.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View arg0) {
                    // TODO Auto-generated method stub
                    String msg = chat_msg.getText().toString().trim();
                    if(!msg.equals("")){
                        new Send_Message().sendMessage(user, cTo, msg);
                        display();
                        chat_msg.setText("");
                    }else{
                        Toast.makeText(getApplicationContext(), "No message to send!!", Toast.LENGTH_SHORT).show();
                    }
                }
            });

        }


        @Override
        public void onDestroy(){
            super.onDestroy();
            stop = 1;
        }



        public void display(){
            View_Messages vm = new View_Messages(user, cTo);
            names = vm.getAllNamesTo();
            namesfrm = vm.getAllNamesFrom();
            msgs = vm.getAllMsgs();
            datez = vm.getAllDates();
            count = vm.getIfNew();

            list.setDivider(null);

            la = new Messages_con_adapter(this, user, names, namesfrm,msgs,datez,cTo);
            list.setAdapter(la);
            list.setSelection(list.getAdapter().getCount() - 1);
        }

私のアダプターは: Message_con_adapter.java

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;

public class Messages_con_adapter extends ArrayAdapter<String>{
    String user;
    String[] name;
    String[] namefrm;
    String[] msgs;
    String[] dates;
    Context context;
    View rowView;


    public Messages_con_adapter(Context context,String user, String[] name,String[] namefrm, String[] msgs,String[] dates,String To) {
        super(context, R.layout.chat_con,name);

        this.user = user;
        this.context = context;
        this.msgs = msgs;
        this.name = name;
        this.namefrm = namefrm;
        this.dates = dates;
        this.To = To;

    }


    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        LayoutInflater inflater = (LayoutInflater) context
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);




        if(namefrm[position].equals(user)){
            rowView = inflater.inflate(R.layout.chat_con_home, parent, false);
            TextView dateTimeHome = (TextView) rowView.findViewById(R.id.time_c_home);
            TextView c_home = (TextView) rowView.findViewById(R.id.c_u_home);
            TextView c_home_m = (TextView) rowView.findViewById(R.id.c_u_home_m);
            dateTimeHome.setText(dates[position]);
            c_home.setText(user);
            c_home_m.setText(msgs[position]);


        }else
        {
            rowView = inflater.inflate(R.layout.chat_con, parent, false);
            TextView dateTimeAway = (TextView) rowView.findViewById(R.id.time_c_away);
            TextView c_away = (TextView) rowView.findViewById(R.id.c_u_away);
            TextView c_away_m = (TextView) rowView.findViewById(R.id.c_u_away_m);
            dateTimeAway.setText(dates[position]);
            c_away.setText(namefrm[position]);
            c_away_m.setText(msgs[position]);

        }

        return rowView;
    }

アイデアはありますか?助けてください。=(

前もって感謝します。

4

4 に答える 4

1

リストビューを更新できます

まず第一に、どのイベントでリスト ビューを更新するかはあなた次第です。

リストビューで onscroll リスナーを使用して、リストビューを更新できます。

今問題は、カスタム リスト ビューでデータを更新する方法です。

データを更新する必要がある場合は、このメソッドを呼び出します。

public void updateDate(String user, String[] name,String[] namefrm, String[] msgs,String[] dates,String To) {
    super(context, R.layout.chat_con,name);

    this.user = user;
    this.context = context;
    this.msgs = msgs;
    this.name = name;
    this.namefrm = namefrm;
    this.dates = dates;
    this.To = To;
}

このメソッドは、以前のアダプター オブジェクトで呼び出してから呼び出します。

adapterObject.notifyDataSetChanged();

あなたのリストビューは更新されています。

于 2013-11-10T09:02:48.643 に答える
1

非 UI スレッドからリストビューを更新しないでください。代わりに、ハンドラーの使用を検討してください。

于 2013-11-10T08:45:27.133 に答える
0

UI 関連のコンポーネントを更新するには、 AsyncTaskを使用してそれを行います。
それは本当に簡単で、ベストプラクティスです。
これがドキュメント です。提供されたコードから、スレッドのメソッドで
行ったのと同じコードをメソッドに使用します。編集 あなたはアンドロイドに慣れていないので、ここでを見たいと思うかもしれません。run()
AsynTask's doInBackgrond()

于 2013-11-10T10:02:09.077 に答える
0

私はより良い解決策を持っています。listView とデータベースをバインドできます。データベースが新しいデータを更新すると、Android は ListView を自動的に更新するため、作業はサーバーからメッセージを受信して​​データベースに入れるだけです。

これを行うには、ContentProvider を実装する必要があります。これは SQLite データベースのラッパーです。その後、CursorAdapter を実装します。ArrayAdapter との違いはほとんどありません。最後のステップは、カーソルを返す ContentResolver を介して ContentProvider を呼び出し、テーブルの変更についてアダプターに通知することです。詳細については、http://www.vogella.com/articles/AndroidSQLite/article.html#sqliteoverview_listviewsを参照してください。

于 2013-11-10T10:00:45.857 に答える