小编Jus*_*ips的帖子

知道ListView中的View何时离开了屏幕?

我用Google搜索了这个,但找不到答案,所以这里......

我有一个ListView,显示一些文本和图像.底层适配器出于性能原因(根据推荐的方法)回收视图,并且我根据Android开发者网站的位图页面上的建议使用AsynchTask加载图像.

一切都很顺利,但我有一个问题.当适配器中的视图被回收时,它仍然具有对旧图像(ImageView)的引用.如果用户缓慢滚动,则AsynchTask有足够的时间加载新图像并显示它,因此没有可见的新图像重新加载到用户.

但是,如果用户非常快速地滚动,则加载图像的延迟意味着他们在被新图像替换之前看到旧图像(当View被另一个项目使用时加载).

所以,我的问题是,如何检测屏幕上何时不再显示视图,以便我可以删除图像?这将意味着用户看到一个空的列表视图项,最终将加载适当的图像,这看起来会更好.

提前谢谢了.这是列表视图适配器代码.

@Override
public View getView(int position, View convertView, ViewGroup parent)
{
    View view = convertView;
    ListViewHolder viewHolder;

    // if this is not a recycled view then create a new view for the data...
    if (view == null)
    {
        view = this.inflater.inflate(R.layout.target_list_view_layout, null, true);

        viewHolder = new ListViewHolder();

        viewHolder.manufacturer = (TextView) view.findViewById(R.id.manufacturer);
        viewHolder.targetName = (TextView) view.findViewById(R.id.targetName);
        viewHolder.targetThumbnail = (ImageView) view.findViewById(R.id.targetThumbnail);

        view.setTag(viewHolder);
    } else
    {
        viewHolder = (ListViewHolder) convertView.getTag();
    }

    TargetDescriptor targetDescriptor = this.selectedTargets.get(position);

    viewHolder.manufacturer.setText(targetDescriptor.manufacturer); …
Run Code Online (Sandbox Code Playgroud)

android listview asynchronous image

25
推荐指数
2
解决办法
9267
查看次数

"需要登录"401通过OAuth 2.0使用服务帐户呼叫v3 Google Calendar API时未经授权的消息

首先,让我解释一下我要做的事情,因为这是一个两部分问题.

我建立在内部通过的OAuth2一个谷歌帐户验证一个JAX-RS的服务,所以它可以访问和操作谷歌日历.这项服务将通过一个网站(的Joomla),这将允许登录到网站的用户注册与日历事件他们的电子邮件地址,以便他们可以得到电子邮件通知当事件附近被调用.这些用户不了解底层Google帐户.

所以我的第一个问题是使用服务帐户身份验证是正确的吗?查看Google文档,它是唯一适合非人类身份验证的用例(因此服务器到服务器身份验证).

第二个问题是,我已经写了一些代码来做到这一点,但我拿回401 /未经授权的响应返回以下错误回来时,我调用execute方法日历饲料.此代码已从Google示例中取消.

我正在使用Google Calendar API的v3-rev3-1.5.0-beta.我已在帐户中启用了Calendar API,并创建并下载了私钥,该私钥在下面的代码中使用.

我在本地调用Eclipse中的代码,而不是从Web服务器调用.

所以我做的第一个调用是取回一个凭证对象(Id用X混淆):

private static final HttpTransport HTTP_TRANSPORT = new NetHttpTransport();
private static final JsonFactory JSON_FACTORY = new JacksonFactory();
.
.
.
GoogleCredential credential = new GoogleCredential.Builder().setTransport(HTTP_TRANSPORT)
            .setJsonFactory(JSON_FACTORY)
            .setServiceAccountId("284XXXXXXXX@developer.gserviceaccount.com")
            .setServiceAccountScopes(CalendarScopes.CALENDAR)
            .setServiceAccountPrivateKeyFromP12File(new File("D:/3cd8XXXXXXXXXXXXXXXXXXXXXXXXXXXXXd635e-privatekey.p12"))
            .build();
Run Code Online (Sandbox Code Playgroud)

下一步是调用Calendar API,就像这样(之间没有其他代码调用):

 Calendar calendar = Calendar.builder(HTTP_TRANSPORT, JSON_FACTORY)
        .setApplicationName("TestApp-Calendar/1.0").setHttpRequestInitializer(credential)
        .build();

 CalendarList feed = calendar.calendarList().list().execute();
Run Code Online (Sandbox Code Playgroud)

对list().execute()的调用导致以下错误:

com.google.api.client.googleapis.json.GoogleJsonResponseException:401 Unauthorized {"code":401,"errors":[{"domain":"global","location":"Authorization","locationType":"标题","消息":"需要登录","原因":"必需"}},"消息":"需要登录"} com.google.api.client.googleapis.json.GoogleJsonResponseException.from(GoogleJsonResponseException. java:159)com.google.api.client.googleapis.json.GoogleJsonResponseException.execute(GoogleJsonResponseException.java:187)com.google.api.client.googleapis.services.GoogleClient.executeUnparsed(GoogleClient.java:115) at com.google.api.client.http.json.JsonHttpRequest.executeUnparsed(JsonHttpRequest.java:112)at the com.google.api.services.calendar.Calendar $ CalendarList $ List.execute(Calendar.java:510)at uk .org.reigatepriorybowmen.Service.registerEmailForAllCalendarEvents(Service.java:55)at uk.org.reigatepriorybowmen.Service.main(Service.java:74)

服务帐户设置如下:

在此输入图像描述

那么,我做错了什么?!我花了几个小时在谷歌上寻找解决方案,所以这是我最后的希望.

非常感谢您的帮助.

贾斯汀

google-calendar-api oauth-2.0 google-api-java-client google-oauth

18
推荐指数
2
解决办法
4万
查看次数

升级时保持相同的SQLite数据库,从Lite到Pro版本升级Android应用程序

首先,我做了一个搜索,找不到我的问题的具体答案,所以这里...

我正在编写我的第一个Android应用程序,并计划拥有Lite版本(有限功能)和付费版本(完整功能).

Lite和Pro版本将使用相同的SQLite数据库结构,如果用户以Lite版本启动并升级到Pro版本,我不希望它们丢失他们在Lite版本中创建的数据.

由于Lite和Pro版本(根据我的理解)必须在单独的包中以允许Android Market区分它们,Pro版本如何看到Lite数据库?

非常感谢你的答案.

sqlite android upgrade

14
推荐指数
1
解决办法
1783
查看次数

403通过OAuth 2.0使用服务帐户调用v3 Google Calendar API时的禁止消息

这是我的帖子中关于使用Google Calendar API和OAuth2时出现401错误的信息,可以在此处找到

这包含导致我下一个问题的帐户设置的详细信息,因此我不会在此主题中重复自己.

好的,所以当我调用以下代码来更新Calendar事件时,我得到403禁止错误.

for (Event event : events.getItems())
{
    event.setSummary("XXX" + event.getSummary());

    Event updatedEvent = calendar.events().update(CALENDAR_ID, event.getId(), event).execute();
}
Run Code Online (Sandbox Code Playgroud)

这是返回的错误消息:

com.google.api.client.googleapis.json.GoogleJsonResponseException: 403 Forbidden
{
    "code" : 403,
    "errors" : [ {
        "message" : "Forbidden"
     } ],
    "message" : "Forbidden"
}
Run Code Online (Sandbox Code Playgroud)

我试过了什么?好吧,我已经重新阅读了关于服务帐户的(相当差的)Google文档,重新检查了我的API控制台帐户设置,尝试更改构建凭据的代码(这会导致其他错误,因此在我之前的帖子中是回归) .

简而言之,没有任何作用,那么我有什么明显的遗漏吗?

google-calendar-api http-status-code-403 oauth-2.0

9
推荐指数
2
解决办法
2万
查看次数