我正在使用android studio构建一个消息传递应用程序,为此我导入了这个类。
import co.devcenter.androiduilibrary.ChatView;
在此课程中,有接收和发送消息选项。在接收消息方法中,它接收当前时间并接收消息。现在,我想存储此消息并将其显示给用户。问题是,为了向用户显示此消息,我需要能够编写一个像StoreMessages这样的方法来存储这些消息的时间,当我想向用户显示这些消息时,我需要让它的时间等于我对数据库的价值。但由于我无法更改接收方法,因此总是占用当前时间。那么如何在这个类中添加新功能呢?
我试图将整个类复制到我创建的新java文件中,程序崩溃了
这是感兴趣的人的日志cat错误,但这个问题的主要焦点是如何实现我的要求。
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.sahilliolu.myapplication/com.example.sahilliolu.myapplication.ChatActivity}: java.lang.ClassCastException: co.devcenter.androiduilibrary.ChatView cannot be cast to com.example.sahilliolu.myapplication.ChatView
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2665)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726)
at android.app.ActivityThread.-wrap12(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6119)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
Caused by: java.lang.ClassCastException: co.devcenter.androiduilibrary.ChatView cannot be cast to com.example.sahilliolu.myapplication.ChatView
at com.example.sahilliolu.myapplication.ChatActivity.onCreate(ChatActivity.java:38)
at android.app.Activity.performCreate(Activity.java:6679)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2618)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726)
at android.app.ActivityThread.-wrap12(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6119)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
Application terminated.
答案 0 :(得分:1)
如果您尝试向库中添加功能,则最好使用继承,而只是复制整个文件。
但是,在代码紧密耦合的情况下(我假设我找到了正确的库),那么你需要做一些额外的工作。
public class YourChatView extends View {
// This is your own adapter.
private MyChatViewListAdapter adapter;
...
public MyChatView(Context context) {
this(context, null);
}
public ChatView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public ChatView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context, attrs, defStyleAttr);
}
private void init(Context context, AttributeSet attrs, int defStyleAttr) {
...
// You'd have to replace these with your own adapter
adapter = new MyChatViewListAdapter(context);
chatListView.setAdapter(adapter);
}
...
// Make this insert the timestamp you want
private void setButtonOnClickListener() {
sendButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
long stamp = System.currentTimeMillis();
String message = inputEditText.getText().toString();
if (!TextUtils.isEmpty(message)) {
sendMessage(message, stamp);
}
}
});
}
或者,如果您在完全交换该功能时遇到问题,则可以在您自己的子类中覆盖这些方法,因为它们是公开的。
public void sendMessage(String message, long stamp) {
ChatMessage chatMessage = new ChatMessage(message, stamp, Type.SENT);
if (chatListener != null && chatListener.sendMessage(message, stamp)) {
chatViewListAdapter.addMessage(chatMessage);
inputEditText.setText("");
}
}
public void newMessage(String message) {
ChatMessage chatMessage = new ChatMessage(message, System.currentTimeMillis(), Type.RECEIVED);
chatViewListAdapter.addMessage(chatMessage);
notifyMessageReceivedListener(chatMessage);
}
public void newMessage(ChatMessage chatMessage) {
chatViewListAdapter.addMessage(chatMessage);
notifyMessageReceivedListener(chatMessage);
}
如果你复制了所有这些代码并进行了修改,那么请务必在活动代码中使用CustomChatView
而不是ChatView
。如果您不使用extends
,则无法将CustomChatView
转换为ChatView
,也不能混合使用类,这就是错误所说的内容。
您可以使用适配器类执行类似的操作。
public class ChatViewListAdapter extends BaseAdapter {
...
public void addMessage(ChatMessage message) {
chatMessages.add(message);
notifyDataSetChanged();
}
只需展开ChatViewListAdapter
,并覆盖addMessage
方法即可执行任何操作。
public class MyChatViewListAdapter extends ChatViewListAdapter {
...
@Override
public void addMessage(ChatMessage message) {
message.setTimestamp(0L); // Update to the time you want.
super.addMessage(message);
}