Java notify()引发异常
我必须从BaseCardAdapter中的列表中删除一个对象。此BaseCardAdapter用于我的SwipeCardView。我试着在按下按钮后移除一个物体。之后,我需要通知适配器一个对象被删除。很遗憾,我收到了以下错误: java.lang.IllegalMonitorStateException:对象在notify()之前未被线程锁定 这是我的密码:Java notify()引发异常,java,android,Java,Android,我必须从BaseCardAdapter中的列表中删除一个对象。此BaseCardAdapter用于我的SwipeCardView。我试着在按下按钮后移除一个物体。之后,我需要通知适配器一个对象被删除。很遗憾,我收到了以下错误: java.lang.IllegalMonitorStateException:对象在notify()之前未被线程锁定 这是我的密码: public class FeedAdapter extends BaseCardAdapter { private ArrayList
public class FeedAdapter extends BaseCardAdapter {
private ArrayList<EventObject> events;
private Activity activity;
private TextView property1, property2, property3, usernameage;
private ImageView userthumb;
public FeedAdapter(ArrayList<EventObject> events, Activity activity) {
this.events = events;
this.activity = activity;
}
@Override
public int getCount() {
return events.size();
}
@Override
public int getCardLayoutId() {
return R.layout.model_idea_feed;
}
@Override
public void onBindData(final int position, View cardview) {
if (events.size() == 0 || events == null){
return;
}
ImageView thumb = cardview.findViewById(R.id.feed_thumb_model);
userthumb = cardview.findViewById(R.id.feed_profile_thumb);
final TextView eventname = cardview.findViewById(R.id.feed_name_model);
usernameage = cardview.findViewById(R.id.feed_username_model);
TextView date = cardview.findViewById(R.id.feed_date_model);
TextView additional = cardview.findViewById(R.id.feed_additional_model);
TextView address = cardview.findViewById(R.id.feed_adress_model);
property1 = cardview.findViewById(R.id.feed_property1_model);
property2 = cardview.findViewById(R.id.feed_property2_model);
property3 = cardview.findViewById(R.id.feed_property3_model);
ImageButton save = cardview.findViewById(R.id.feed_savebtn_model);
ImageButton accept = cardview.findViewById(R.id.feed_accept_model);
switch(Integer.parseInt(events.get(position).getPosition())) {
case 0:
thumb.setBackgroundResource(R.drawable.berlin0);
break;
case 1:
thumb.setBackgroundResource(R.drawable.berlin1);
break;
case 2:
thumb.setBackgroundResource(R.drawable.berlin2);
break;
default:
thumb.setBackgroundResource(R.drawable.berlin2);
break;
}
eventname.setText(events.get(position).getName());
date.setText(events.get(position).getDate());
additional.setText(events.get(position).getInfos());
Geocoder geocoder;
List<Address> addresses;
geocoder = new Geocoder(activity, Locale.getDefault());
try {
addresses = geocoder.getFromLocation(Double.parseDouble(events.get(position).getLat()),Double.parseDouble(events.get(position).getLng()), 1); // Here 1 represent max location result to returned, by documents it recommended 1 to 5
String adderess = addresses.get(0).getAddressLine(0); // If any additional address line present than only, check with max available address lines by getMaxAddressLineIndex()
String city = addresses.get(0).getLocality();
String state = addresses.get(0).getAdminArea();
String country = addresses.get(0).getCountryName();
String postalCode = addresses.get(0).getPostalCode();
String knownName = addresses.get(0).getFeatureName();
address.setText(adderess);
} catch (IOException e) {
e.printStackTrace();
}
save.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
events.remove(events.get(position));
//Here Appears the error:
events.notify();
}
});
}
}
公共类FeedAdapter扩展BaseCardAdapter{
私人ArrayList事件;
私人活动;
私有文本视图属性1、属性2、属性3、用户名年龄;
私有ImageView用户拇指;
公共FeedAdapter(ArrayList事件、活动){
这个事件=事件;
这个。活动=活动;
}
@凌驾
public int getCount(){
返回事件。大小();
}
@凌驾
public int getCardLayoutId(){
返回R.layout.model\u idea\u提要;
}
@凌驾
公共无效onBindData(最终整型位置,视图cardview){
if(events.size()=0 | | events==null){
返回;
}
ImageView thumb=cardview.findViewById(R.id.feed\u thumb\u model);
userthumb=cardwiew.findviewbyd(R.id.feed\u profile\u thumb);
final TextView eventname=cardwiew.findviewbyd(R.id.feed\u name\u model);
usernameage=cardwiew.findviewbyd(R.id.feed\u username\u model);
TextView date=cardwiew.findviewbyd(R.id.feed\u date\u model);
TextView additional=cardwiew.findviewbyd(R.id.feed\u additional\u model);
TextView地址=cardview.findViewById(R.id.feed\u address\u model);
property1=cardview.findViewById(R.id.feed\u property1\u模型);
property2=cardwiew.findviewbyd(R.id.feed\u property2\u模型);
property3=cardview.findViewById(R.id.feed\u property3\u模型);
ImageButton save=cardview.findViewById(R.id.feed\u savebtn\u model);
ImageButton accept=cardview.findViewById(R.id.feed\u accept\u model);
开关(Integer.parseInt(events.get(position.getPosition())){
案例0:
thumb.setBackgroundResource(R.drawable.berlin0);
打破
案例1:
拇指.挫折资源(R.drawable.berlin1);
打破
案例2:
拇指.挫折资源(R.drawable.berlin2);
打破
违约:
拇指.挫折资源(R.drawable.berlin2);
打破
}
eventname.setText(events.get(position.getName());
date.setText(events.get(position.getDate());
additional.setText(events.get(position.getInfos());
地理编码器;
列出地址;
地理编码器=新的地理编码器(活动,Locale.getDefault());
试一试{
addresses=geocoder.getFromLocation(Double.parseDouble(events.get(position.getLat()),Double.parseDouble(events.get(position.getLng()),1);//这里1代表返回的最大位置结果,由它建议的1到5个文档决定
String address=addresses.get(0).getAddressLine(0);//如果存在除此之外的任何其他地址行,请通过getMaxAddressLineIndex()检查最大可用地址行
字符串city=addresses.get(0.getLocation();
字符串状态=addresses.get(0.getAdminArea();
字符串country=addresses.get(0.getCountryName();
字符串postalCode=addresses.get(0.getPostalCode();
字符串knownName=addresses.get(0.getFeatureName();
地址.setText(address);
}捕获(IOE异常){
e、 printStackTrace();
}
save.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
events.remove(events.get(position));
//出现以下错误:
events.notify();
}
});
}
}
notify()
与列表和适配器完全无关
您需要的是notifyDataSetChanged()
,它是在适配器本身上调用的,而不是在数据列表上调用的
替换:
events.notify();
与:
或:
无法选择notifyDataSetChanged或notifyItemRemoved,我只能选择notify或NotifyAll正如我所说,您不能在列表中调用它。我用ArrayAdapter而不是BaseCardAdapter解决了这个问题@BaseCardAdapter中的漫游者您无法使用NotifyDatasetChanged或notifyItemRemoved,因为它不可用。什么是BaseCardAdapter?它不是Android API的一部分。
notifyDataSetChanged();
notifyItemRemoved(position);