我知道这不是一个很好的问题描述,但我无意中发现了我的ListAdapter的不稳定行为。
关键是,我的应用程序中的onItemClickListener只在疯狂单击的时候才会响应。调试器也只有在这种情况下才会响应。尽管如此,有时还是会很好地点击工作。似乎有什么东西在内部阻止onItemClickListener被调用。有时,即使是默认的android点击动画也不显示在第一次点击。虽然,在2-5点击之后,一个接一个的快速总是按照预期的工作。
作为Android开发的新手,我不知道从哪里开始寻找这个问题。问题不是特定于设备的(测试)。
以防万一,我的项目中有一些代码(尽管我甚至不确定要提供什么):
一些来自OffersListAdapter:的代码
class ViewHolder {
private TextView whoandWhom;
private TextView date;
private TextView distance;
private TextView status;
private TextView place;
private boolean isMeeting = false;
private Meeting.Status meetingStatus;
private void color(int color) {
for (Field v: this.getClass().getDeclaredFields()) {
try {
if (v.getType() == TextView.class) {
TextView view = (TextView) v.get(this);
view.setTextColor(res.getColor(color));
}
} catch (IllegalAccessException e) {
Log.e("ERROR", "This field does not exist");
}
}
}
}
private View prepareHolder(boolean isMeeting, View convertView, Meeting.Status mStatus, Offer offer) {
ViewHolder holder = new ViewHolder();
LayoutInflater li = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if (isMeeting) {
convertView = li.inflate(R.layout.meetings_item, null);
} else {
convertView = li.inflate(R.layout.offers_item, null);
}
holder.whoandWhom = (TextView)convertView.findViewById(R.id.datetime);
holder.date = (TextView)convertView.findViewById(R.id.dateTime);
holder.distance = (TextView)convertView.findViewById(R.id.distance);
if (isMeeting) {
holder.isMeeting = true;
holder.status = (TextView)convertView.findViewById(status);
holder.place = (TextView)convertView.findViewById(place);
holder.meetingStatus = mStatus;
}
convertView.setTag(holder);
holder.whoandWhom.setText(offer.getOwnership());
holder.date.setText(offer.getDateRepresentation());
String distance = new DecimalFormat("#####.##").format(offer.getDistance()) + " км";
holder.distance.setText(distance);
if (isMeeting) {
Meeting meeting = (Meeting) offer;
holder.place.setText(meeting.getPlace_name());
switch (meeting.getStatus()) {
case pending:
holder.status.setText("Очікує підтвердження");
break;
case upcoming:
holder.status.setText("Незабаром");
holder.color(R.color.colorAccent);
break;
case completed:
holder.status.setText("Завершено");
holder.color(R.color.colorPrimary);
break;
}
}
return convertView;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
Offer offer = this.getItem(position);
Boolean isMeeting = offer.getClass() == Meeting.class;
Meeting.Status status = null;
if (isMeeting)
status = ((Meeting) offer).getStatus();
if (convertView == null) {
convertView = prepareHolder(isMeeting, convertView, status, offer);
} else {
holder = (ViewHolder) convertView.getTag();
if (isMeeting != holder.isMeeting)
convertView = prepareHolder(isMeeting, convertView, status, offer);
else if (isMeeting) {
if (status != holder.meetingStatus)
convertView = prepareHolder(true, convertView, status, offer);
}
}
return convertView;
}:MainActivity:中的几种方法
private void configureOffersOutput() {
offersOutput = (ListView) findViewById(R.id.offersOutput);
offersList = new ArrayList<Offer>();
LayoutInflater li = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
loadingView = li.inflate(R.layout.list_footer_view, null);
adapter = new OffersListAdapter(getApplicationContext(), offersList, getResources());
configureOnItemClick();
offersOutput.setAdapter(adapter);
offersOutput.setNestedScrollingEnabled(true);
offersOutput.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
if (view.getLastVisiblePosition() >= totalItemCount - 1 && !isLoading) {
moreOffers();
}
}
});
}
private void configureOnItemClick() {
final Activity a = this;
offersOutput.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
final Offer item = offersList.get(position);
if (item.getClass() == Offer.class) {
openActivity(a, SuggestActivity.class, new HashMap<String, String>() {{
put("id", item.getId());
put("location", item.getLocation());
put("datetime", item.getDateRepresentation());
put("ownership", item.getOwnership());
put("currentCoordinates", coordinates);
put("token", user.getToken());
put("uid", user.getId());
}});
} else if (item.getClass() == Meeting.class) {
final Meeting meeting = (Meeting) item;
Class<?> name;
switch (meeting.getStatus()) {
case pending:
name = ApproveActivity.class;
break;
case upcoming:
name = UpcomingActivity.class;
break;
case completed:
name = RateActivity.class;
break;
default:
name = MeetingActivity.class;
Log.e("ERROR", "Wrong status: " + meeting.getStatus().toString());
}
final String distance = new DecimalFormat("#####.##").format(meeting.getDistance()) + " км";
openActivity(a, name, new HashMap<String, String>(){{
put("id", meeting.getId());
put("datetime", meeting.getDateRepresentation());
put("ownership", meeting.getOwnership());
put("tel", meeting.getTel());
put("distance", distance);
put("place", meeting.getPlace_name());
put("place_coordinates", meeting.getPlace_coordinates());
put("currentCoordinates", coordinates);
put("token", user.getToken());
put("uid", user.getId());
}});
}
}
});
initRefresh();
isSetItemOnClick = true;
}发布于 2017-07-09 15:37:16
好吧,所以我想出了一个答案以防有人有同样的问题。
除此之外,我还有一个响应滚动事件的方法。它将按如下方式加载向下滚动的数据:
ffersOutput.setNestedScrollingEnabled(true);
offersOutput.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
if (view.getLastVisiblePosition() >= totalItemCount - 1 && !isLoading) {
moreOffers();
}
}
});moreOffers会发送一个请求到后端并加载行。
问题是:
解决方案(虽然很难看):将以下内容添加到从DB接收数据的方法中:
new Timer().schedule(new TimerTask() {
@Override
public void run() {
isLoading = false;
}
}, 100);这使得应用程序无法频繁地发出请求,因此它可以做出响应。
https://stackoverflow.com/questions/44986524
复制相似问题