gpt4 book ai didi

android - 如何在 Android 中管理 Activity 的 onPause、onResume 自定义适配器

转载 作者:太空宇宙 更新时间:2023-11-03 10:21:01 25 4
gpt4 key购买 nike

我有一个适配器,用于在 ListView 中显示消息,在聊天应用程序中查看类似的消息。创建 Activity 后,我能够完美地显示内容,但是当我返回并再次创建 Activity 时,适配器无法正常工作。

调试时发现如下:

  • 函数 receives() 在收到消息时调用并更新注册,正如我上面提到的,显示是没有问题的创建 Activity 后 ListView 中的数据,但一旦我返回并重新启动我无法显示收到的消息的 Activity 。

关于自定义适配器的 onResume() onPause 或 onStart() 方法是否缺少某些内容,例如再次注册或取消自定义适配器?感谢您的帮助。

以下是我的 Activity 类的代码,它使用自定义适配器来显示已发送和已接收的消息:

public class hotListener extends ListActivity {


private XMPPConnection connection;
private IBinder binder;
private Handler mHandler = new Handler();
private ArrayList<String> messages = new ArrayList<String>();
ArrayList<ChatMessage> messagex= new ArrayList<ChatMessage>();;
ChattingAdapter adaptex;

Intent mIntent ;
private ListView listview;
EditText sender_message ;
String msg;


@Override
protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);
setContentView(R.layout.listener);
//messagex.add(new ChatMessage("Hello", false));
adaptex = new ChattingAdapter(getApplicationContext(),messagex);
setListAdapter(adaptex);

Button send_button = (Button) findViewById(R.id.chat_send_message);
sender_message = (EditText) findViewById(R.id.chat_input);
send_button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
msg = sender_message.getText().toString();
sender_message.setText("");
if(!(msg.length()==0)){
messagex.add(new ChatMessage(msg, true));
//addNewMessage(new ChatMessage(msg, true));
adaptex.notifyDataSetChanged();
getListView().setSelection(messagex.size()-1);
}

}
});
if(!isMyServiceRunning()){
System.out.println("seems like service not running");
startService(new Intent(this,xService.class));
System.out.print(" now started ");
}
}

@Override
protected void onStart(){
super.onStart();
Boolean kuch = bindService(new Intent(this,xService.class), mConnection,Context.BIND_AUTO_CREATE);
//System.out.println(kuch);
System.out.println("bind done");
}

private void receives(XMPPConnection connection2) {
//ChatManager chatmanager = connection.getChatManager();
connection2.getChatManager().addChatListener(new ChatManagerListener() {

@Override
public void chatCreated(Chat arg0, boolean arg1) {
arg0.addMessageListener(new MessageListener() {

@Override
public void processMessage(Chat chat, Message message) {

final String from = message.getFrom();
final String body = message.getBody();
mHandler.post(new Runnable() {
ChatMessage kudi = new ChatMessage(body, false);

@Override
public void run() {

messagex.add(kudi);
adaptex.notifyDataSetChanged();
getListView().setSelection(messagex.size()-1);
Toast.makeText(hotListener.this,body,Toast.LENGTH_SHORT).show(); }
});
}
});
}
});
}

private boolean isMyServiceRunning() {
ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
for(RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)){
if(xService.class.getName().equals(service.service.getClassName())){
return true;
}
}
//System.out.print("false");
return false;
}

@Override
protected void onResume() {
bindService(new Intent(this, xService.class), mConnection, Context.BIND_AUTO_CREATE);
super.onResume();
}
@Override
protected void onPause() {
unbindService(mConnection);
super.onPause();
}

private ServiceConnection mConnection = new ServiceConnection() {

@Override
public void onServiceDisconnected(ComponentName name) {
connection = null;
service = null;
}

@Override
public void onServiceConnected(ComponentName name, IBinder binder) {
//System.out.println("binding in hot listener");
service = ((xService.MyBinder)binder).getService();
connection = service.getConnection();
receives(connection);
Log.wtf("Service","connected");
}
};

void addNewMessage(ChatMessage m)
{
System.out.println("1");
messagex.add(m);
System.out.println("2");
adaptex.notifyDataSetChanged();
System.out.println("3");
getListView().setSelection(messagex.size()-1);
}
}

这是我的自定义适配器(自定义适配器没有问题,但添加以明确说明):

public class ChattingAdapter extends BaseAdapter{
private Context mContext;
private ArrayList<ChatMessage> mMessages;


public ChattingAdapter(Context context, ArrayList<ChatMessage> messages) {
super();
this.mContext = context;
this.mMessages = messages;
}
@Override
public int getCount() {
return mMessages.size();
}
@Override
public Object getItem(int position) {
return mMessages.get(position);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ChatMessage message = (ChatMessage) this.getItem(position);

ViewHolder holder;
if(convertView == null)
{
holder = new ViewHolder();
convertView = LayoutInflater.from(mContext).inflate(R.layout.listitem, parent, false);
holder.message = (TextView) convertView.findViewById(R.id.text1);
convertView.setTag(holder);
}
else
holder = (ViewHolder) convertView.getTag();

holder.message.setText(message.getMessage());
LayoutParams lp = (LayoutParams) holder.message.getLayoutParams();

//Check whether message is mine to show green background and align to right

if(message.isMine())

{ holder.message.setBackgroundResource(R.drawable.msgbox_new_selected_go_up);

lp.gravity = Gravity.RIGHT;
}
//If not mine then it is from sender to show orange background and align to left

else
{
holder.message.setBackgroundResource(R.drawable.msgbox_other_go_up);

lp.gravity = Gravity.LEFT;

}
holder.message.setLayoutParams(lp);
//holder.message.setTextColor(R.color.textColor);

return convertView;
}
private static class ViewHolder
{
TextView message;
}

@Override
public long getItemId(int position) {
//Unimplemented, because we aren't using Sqlite.
return position;
}

}

p.s:我没有在 sqlite 中存储任何消息,因为我现在不想恢复消息,但我希望至少在 Activity 恢复时显示新消息。我可以在按下发送按钮后显示已发送的消息,但没有收到消息,这在第一次创建 Activity 时工作正常。

编辑:我做了更多的调试,结果发现问题不在恢复 Activity 中,如果我第一次不使用 receives() 函数,并且在返回后恢复 Activity ,那么 receives() 将起作用,这意味着,函数在 receives() 内部:getListView().setSelection(messagex.size()-1); 只工作一次。要么是第一次收到消息,要么是下一次,当且仅当它不是第一次在 Activity 中被调用。

最佳答案

我认为问题在于当您尝试恢复 Activity 时,您仍在运行之前的 mHandler 运行,因此您的消息实例没有被破坏,当您恢复 Activity 时它会产生问题。确保您的 mhandler 在调用 unstop 时销毁​​所有对象实例。

关于android - 如何在 Android 中管理 Activity 的 onPause、onResume 自定义适配器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21966891/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com