2

我正在使用服务器中的数据库 MySQL 实现聊天。现在,我想在 Thread 中更新我的自定义 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;
}

这个方法用你的 previos 适配器对象调用,然后调用

adapterObject.notifyDataSetChanged();

您的列表视图正在更新。

于 2013-11-10T09:02:48.643 回答
1

永远不要从非 UI 线程更新您的列表视图,而是考虑使用处理程序。

于 2013-11-10T08:45:27.133 回答
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 回答
0

要更新 UI 相关组件,请使用AsyncTask来执行此操作。
它真的很简单,也是最佳实践。
这是文档
从您提供的代码中,使用您在run()线程方法中完成的相同代码到
AsynTask's doInBackgrond()方法。
编辑
由于您是 android 新手,您可能想查看此处的示例

于 2013-11-10T10:02:09.077 回答