首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >onClickListener只在几次单击之后才能工作。

onClickListener只在几次单击之后才能工作。
EN

Stack Overflow用户
提问于 2017-07-08 13:03:00
回答 1查看 99关注 0票数 0

我知道这不是一个很好的问题描述,但我无意中发现了我的ListAdapter的不稳定行为。

关键是,我的应用程序中的onItemClickListener只在疯狂单击的时候才会响应。调试器也只有在这种情况下才会响应。尽管如此,有时还是会很好地点击工作。似乎有什么东西在内部阻止onItemClickListener被调用。有时,即使是默认的android点击动画也不显示在第一次点击。虽然,在2-5点击之后,一个接一个的快速总是按照预期的工作。

作为Android开发的新手,我不知道从哪里开始寻找这个问题。问题不是特定于设备的(测试)。

以防万一,我的项目中有一些代码(尽管我甚至不确定要提供什么):

一些来自OffersListAdapter:的代码

代码语言:javascript
复制
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:中的几种方法

代码语言:javascript
复制
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;
}
EN

回答 1

Stack Overflow用户

发布于 2017-07-09 15:37:16

好吧,所以我想出了一个答案以防有人有同样的问题。

除此之外,我还有一个响应滚动事件的方法。它将按如下方式加载向下滚动的数据:

代码语言:javascript
复制
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会发送一个请求到后端并加载行。

问题是:

  1. DB非常快地耗尽行,因此它将接收空的结果。
  2. 应用程序发送请求的速度如此之快,并且频繁地尝试刷新行,以至于它们在大多数情况下都无法对触摸做出响应。

解决方案(虽然很难看):将以下内容添加到从DB接收数据的方法中:

代码语言:javascript
复制
new Timer().schedule(new TimerTask() {
    @Override
    public void run() {
        isLoading = false;
    }
}, 100);

这使得应用程序无法频繁地发出请求,因此它可以做出响应。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44986524

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档