首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Android - Backendless:喜欢按钮的问题

Android - Backendless:喜欢按钮的问题
EN

Stack Overflow用户
提问于 2016-04-10 17:05:26
回答 2查看 326关注 0票数 0

从后台的支持论坛来到这里。“这个支持论坛严格针对与后台相关的问题。我们的APIs和后端服务之外的任何一般问题都不包括在支持范围内。请考虑在stackoverflow.com和/或Android论坛上发布。”马克·皮勒。

所以我在这里发布我的问题。在后台无止境的支持论坛,我得到了一些宝贵的帮助,以保存和恢复关系,但现在我面临另一个问题与类似按钮。我正在开发一个有3个按钮的社交应用程序:比如评论分享。链接到我的后台支持线程:http://support.backendless.com/topic/some-questions-regarding-data-loading-in-recyclerview-android,就目前而言,我正在尝试使Like按钮工作,但我面临以下问题:

如果你看下面的代码和屏幕截图I 附加的,你可以看到有类似的心脏按钮,这不是填充,这意味着我没有点击类似的帖子。在第二个数字中,还有一个按钮被填充,我点击了它,这个应用程序把我添加到了像那篇文章这样的用户列表中。

代码语言:javascript
运行
复制
if (user.getObjectId().equals(userId)) {

holder.like.setBackgroundResource(R.drawable.ic_star_rate_on);

holder.like.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

showToast();

}

});

} else {

holder.like.setBackgroundResource(R.drawable.ic_star_rate_off);

//onclick in another function: setLike(holder.like,holder.likes,feeds);

}

但问题是,对空洞的心脏的点击不起作用。我试图创建一个祝酒词,以检查单击是否有效,吐司是否没有出现。

但是,如果我点击一个我喜欢的项目(填充了心脏图标),它就会显示我放的祝酒词,以检查它是否听了我的点击.

我试着调试应用程序,但是在调试窗口中什么也没有出现.一切似乎都是正常的,但无法找出代码的问题所在。我的Adapter类如下:

代码语言:javascript
运行
复制
public class FeedAdapter extends RecyclerView.Adapter<FeedAdapter.FeedsHolder> {

private List<Feeds> list;

private Context context;

private static String TAG = "MainActivity";

public FeedAdapter(Context context, List<Feeds> list) {

this.context = context;

this.list = list;

}

@Override

public FeedsHolder onCreateViewHolder(ViewGroup parent, int viewType) {

View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.feed_item, parent, false);

return new FeedsHolder(view);

}

@Override

public void onBindViewHolder(final FeedsHolder holder, int position) {

//Starting Feeds

final Feeds feeds = list.get(position);

//Name

holder.name.setText(feeds.getOwner());

//Profile picture

holder.profilePictureURL = feeds.getProfilePictureURL();

//Image

holder.imageURL = feeds.getImageUrl();

//Getting date

Date myD = feeds.getCreated();

long ddate = myD.getTime();

String myDate = String.valueOf(DateUtils.getRelativeTimeSpanString(ddate, System.currentTimeMillis(), DateUtils.SECOND_IN_MILLIS));

holder.timeAgo.setText("• " + myDate);

//Get total likes

final int i = feeds.getLikes();

//Query

QueryOptions options = new QueryOptions();

options.setRelated( Arrays.asList( "usersThatLike" ) );

BackendlessDataQuery query = new BackendlessDataQuery();

query.setQueryOptions( options );

// getting all saved feeds with related users

Backendless.Data.of(Feeds.class).find(query, new AsyncCallback<BackendlessCollection<Feeds>>() {

@Override

public void handleResponse(BackendlessCollection<Feeds> response) {

String userId = Backendless.UserService.CurrentUser().getObjectId();

for (Feeds feed: response.getCurrentPage()) {

List<BackendlessUser> likedUsers = feeds.getUsersThatLike();

for (BackendlessUser user : likedUsers)

if (user.getObjectId().equals(userId)) {

Log.d(TAG, "No -------------------------------------");

holder.like.setBackgroundDrawable(context.getResources().getDrawable(R.drawable.ic_star_rate_on));

holder.like.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

Toast.makeText(context, "You already like this item", Toast.LENGTH_SHORT).show();

}

});

} else {

holder.like.setBackgroundDrawable(context.getResources().getDrawable(R.drawable.ic_star_rate_off));

holder.like.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

Log.d(TAG, "It should work +++++++++++++++++++++++++++++++");

// getting current user

Toast.makeText(context, "Arrived", Toast.LENGTH_SHORT).show();

BackendlessUser currentUser = Backendless.UserService.CurrentUser();

// adding current user as one who "liked" feed, you should implement "adding" by yourself

List<BackendlessUser> list = new ArrayList<>();

list.add(currentUser);

feeds.setUsersThatLike(list);

holder.like.setBackgroundDrawable(context.getResources().getDrawable(R.drawable.ic_star_rate_on));

feeds.setLikes(i + 1);

Backendless.Data.of(Feeds.class).save(feeds, new AsyncCallback<Feeds>() {

@Override

public void handleResponse(Feeds feeds) {

int likes = feeds.getLikes();

if (likes == 1) {

holder.likes.setText(i + 1 + " like");

} else {

holder.likes.setText(i + 1 + " likes");

}

}

@Override

public void handleFault(BackendlessFault backendlessFault) {

}

});

}

});

}

}

}

@Override

public void handleFault(BackendlessFault backendlessFault) {

}

});

holder.status.setText(feeds.getStatus());

String thisString = "no";

String myImageString = "no";

Picasso.with(context).load(holder.profilePictureURL).placeholder(R.drawable.placeholder).into(holder.profilePicture);

String image = feeds.getIsImageUrlEmpty();

if (!image.equals(myImageString)) {

holder.image.setVisibility(View.GONE);

holder.tagStatusBottom.setVisibility(View.VISIBLE);

holder.tagImageBottom.setVisibility(View.GONE);

} else {

holder.image.setVisibility(View.VISIBLE);

holder.tagStatusBottom.setVisibility(View.GONE);

holder.tagImageBottom.setVisibility(View.VISIBLE);

Picasso.with(context).load(holder.imageURL).placeholder(R.drawable.placeholder).into(holder.image);

}

String myString = feeds.getIsTagEmpty();

if (myString.equals(thisString)){

holder.tagImageBottom.setVisibility(View.VISIBLE);

if (!image.equals(myImageString)) {

holder.image.setVisibility(View.GONE);

holder.tagStatusBottom.setVisibility(View.VISIBLE);

holder.tagImageBottom.setVisibility(View.GONE);

} else {

holder.image.setVisibility(View.VISIBLE);

holder.tagStatusBottom.setVisibility(View.GONE);

holder.tagImageBottom.setVisibility(View.VISIBLE);

Picasso.with(context).load(holder.imageURL).placeholder(R.drawable.placeholder).into(holder.image);

}

} else {

holder.tagImageBottom.setVisibility(View.GONE);

holder.tagStatusBottom.setVisibility(View.GONE);

}

String str = feeds.getTag();

ArrayList<int[]> hashtagSpans1 = getSpans(str, '#');

SpannableString commentsContent1 =

new SpannableString(str);

setSpanComment(commentsContent1, hashtagSpans1) ;

holder.tagImageBottom.setText(commentsContent1);

holder.tagStatusBottom.setText(commentsContent1);

holder.tagImageBottom.setMovementMethod(LinkMovementMethod.getInstance());

int likes = feeds.getLikes();

if (likes == 1) {

holder.likes.setText(i +" like");

} else {

holder.likes.setText(i +" likes");

}

}

public ArrayList<int[]> getSpans(String body, char prefix) {

ArrayList<int[]> spans = new ArrayList<int[]>();

Pattern pattern = Pattern.compile(prefix + "\\w+");

Matcher matcher = pattern.matcher(body);

// Check all occurrences

while (matcher.find()) {

int[] currentSpan = new int[2];

currentSpan[0] = matcher.start();

currentSpan[1] = matcher.end();

spans.add(currentSpan);

}

return spans;

}

private void setSpanComment(SpannableString commentsContent, ArrayList<int[]> hashtagSpans) {

for(int i = 0; i < hashtagSpans.size(); i++) {

int[] span = hashtagSpans.get(i);

int hashTagStart = span[0];

int hashTagEnd = span[1];

commentsContent.setSpan(new Hashtag(context),

hashTagStart,

hashTagEnd, 0);

}

}

@Override

public int getItemCount() {

return list.size();

}

这是我的饲料课:

代码语言:javascript
运行
复制
public class Feeds

{

private String owner;

private String tag;

private String profilePictureURL;

private String imageURL;

private Date created;

private Date updated;

private String status;

private int likes;

private String isTagEmpty;

private String isImageUrlEmpty;

private List<BackendlessUser> usersThatLike;

public String getOwner()

{

return owner;

}

public void setOwner( String owner )

{

this.owner = owner;

}

public int getLikes()

{

return likes;

}

public void setLikes ( int likes )

{

this.likes = likes;

}

public String getIsTagEmpty()

{

return isTagEmpty;

}

public void setIsTagEmpty ( String isTagEmpty )

{

this.isTagEmpty = isTagEmpty;

}

public String getIsImageUrlEmpty()

{

return isImageUrlEmpty;

}

public void setIsImageUrlEmpty ( String isImageUrlEmpty )

{

this.isImageUrlEmpty = isImageUrlEmpty;

}

public String getStatus()

{

return status;

}

public void setStatus( String status )

{

this.status = status;

}

public String getTag()

{

return tag;

}

public void setTag( String tag )

{

this.tag = tag;

}

public String getProfilePictureURL()

{

return profilePictureURL;

}

public void setProfilePictureURL ( String profilePictureURL )

{

this.profilePictureURL = profilePictureURL;

}

public String getImageUrl()

{

return imageURL;

}

public void setImageUrl ( String imageURL )

{

this.imageURL = imageURL;

}

public Date getCreated()

{

return created;

}

public Date getUpdated()

{

return updated;

}

public List<BackendlessUser> getUsersThatLike() {

return usersThatLike;

}

public void setUsersThatLike(List<BackendlessUser> usersThatLike) {

this.usersThatLike = usersThatLike;

}

}

你能帮我吗?

编辑:在实现下面答案中的代码之后的不起作用。我就是这样编辑我的代码的:

代码语言:javascript
运行
复制
    //Skipped previous code. Posted only the changed code
Backendless.Data.of(Feeds.class).find(query, new AsyncCallback<BackendlessCollection<Feeds>>() {
                @Override
                public void handleResponse(final BackendlessCollection<Feeds> feedsBackendlessCollection) {

//Suggested by sihao
                    holder.like.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            String userId = Backendless.UserService.CurrentUser().getObjectId();

                            for (Feeds feed: feedsBackendlessCollection.getCurrentPage()) {

                                List<BackendlessUser> likedUsers = feeds.getUsersThatLike();

                                for (BackendlessUser user : likedUsers)

                                    if (user.getObjectId().equals(userId)) {

                                        Toast.makeText(context,"You already liked this item",Toast.LENGTH_SHORT).show();
                                    } else {
                                        // getting current user

                                        BackendlessUser currentUser = Backendless.UserService.CurrentUser();

    // adding current user as one who "liked" feed, you should implement "adding" by yourself

                                        List<BackendlessUser> list = new ArrayList<>();

                                        list.add(currentUser);

                                        feeds.setUsersThatLike(list);

                                        holder.like.setBackgroundDrawable(context.getResources().getDrawable(R.drawable.ic_star_rate_on));

                                        feeds.setLikes(i + 1);

                                        Backendless.Data.of(Feeds.class).save(feeds, new AsyncCallback<Feeds>() {
                                            @Override
                                            public void handleResponse(Feeds feeds) {
                                                int likes = feeds.getLikes();

                                                if (likes == 1) {

                                                    holder.likes.setText(i + 1 + " like");

                                                } else {

                                                    holder.likes.setText(i + 1 + " likes");

                                                }
                                            }

                                            @Override
                                            public void handleFault(BackendlessFault backendlessFault) {

                                            }
                                        });
                                    }
                            }
                        }
                    });
                }

                @Override
                public void handleFault(BackendlessFault backendlessFault) {

                }
            });

更新:我这些天试图解决这个问题,并得到了一个(不错的)想法。我成功地改变了按钮的背景,从空洞的心,填补的元素,已经喜欢的用户。我有以下想法:检查心脏是空的还是充满的。因此,在活动加载时,我的应用程序从"usersThatLike“列中获取数据,并设置”填充心脏可绘制“,如果用户在后面的列表中,则设置”填充心可绘制“,如果没有,则设置”空心可绘制“。所以现在我试着创建一个可绘制的检查。如果心被填充,而不是显示“您已经喜欢此项目”,否则将类似的内容添加到项目中,并将用户添加到当前项目的"usersThatLike“列。但它还在为所有的物品“填满”心。我的意思是说,即使心脏可拉伸是空的,它返回的是填充的,如果我单击一个填充的心脏,它会显示吐司,但是如果心脏没有填充,它将显示相同的祝酒词:我的代码是:

代码语言:javascript
运行
复制
//*** Skipped the query code. In handleResponse:
    String userId = Backendless.UserService.CurrentUser().getObjectId();
                    for (Feeds feed: response.getData()) {
                        feed = list.get(position);

                        List<BackendlessUser> likedUsers = feed.getUsersThatLike();

                        for (BackendlessUser user : likedUsers)
                            if (user.getObjectId().equals(userId)) {
                                holder.like.setBackgroundResource(R.drawable.ic_star_rate_on);
                            } else if (!user.getObjectId().equals(userId)) {
                                holder.like.setBackgroundResource(R.drawable.ic_star_rate_off);
                            }
                    }

在正常的handleResponse中,在查询代码之后,我将检查可绘制的,如下所示:

代码语言:javascript
运行
复制
//***HERE IS THE QUERY
    Backendless.Data.of(Feeds.class).find(query, new AsyncCallback<BackendlessCollection<Feeds>>() {

            //***SKIPPED FOR BREVITY 

        });

//***HERE IS THE CHECK

        holder.like.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (holder.like.getBackground() != context.getDrawable(R.drawable.ic_star_rate_off)){
                toast();
            } else {
                setLike();
            }
        }
    });
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-10 18:32:06

更新:

大家好,我终于找到了一个很好的解决方案。我能够将用户保存到"usersThatLike“列,并在特定项上设置类似的内容。但是,每次我单击“喜欢”按钮时,它都会显示“您已经喜欢它”的祝酒词,只有当我出现在usersThatLike列表中时,才会显示它,因此出现了问题。我使用了以下技巧来解决这个问题:在我的RecyclerView适配器中,我像这样查询了类:

代码语言:javascript
运行
复制
QueryOptions options = new QueryOptions();

    options.setRelated( Arrays.asList( "usersThatLike" ) );

    BackendlessDataQuery query = new BackendlessDataQuery();

    query.setQueryOptions( options );

    Backendless.Data.of(Feeds.class).find(query, new AsyncCallback<BackendlessCollection<Feeds>>() {

        @Override

        public void handleResponse(BackendlessCollection<Feeds> response) {
            String userId = Backendless.UserService.CurrentUser().getObjectId();
            for (Feeds feed: response.getData()) {
                feed = list.get(position);

                List<BackendlessUser> likedUsers = feed.getUsersThatLike();

                for (BackendlessUser user : likedUsers)
                    if (user.getObjectId().equals(userId)) {
                        holder.like.setBackgroundResource(R.drawable.ic_star_rate_on);
                    } else if (!user.getObjectId().equals(userId)) {
                        holder.like.setBackgroundResource(R.drawable.ic_star_rate_off);
                    }
            }

        }

        @Override

        public void handleFault(BackendlessFault backendlessFault) {

        }

    });

如您所见,如果查询返回该用户不在列表中,并且如果用户在列表中,则设置可绘制的星型关闭。

在此之后,我才能解决这个问题。在查询之外,我创建了以下检查:

代码语言:javascript
运行
复制
holder.likeLayout.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (holder.like.getBackground().getConstantState() != ContextCompat.getDrawable(context, R.drawable.ic_star_rate_off).getConstantState()){
                toast();
            } else {
                setLike();
            }
        }
    });

在上面的代码中,我得到按钮背景,并将其与我的可绘制文件夹中的图像进行比较。如果like按钮使用star_off,它将设置like并将用户添加到usersThatLike列表中。否则就祝酒:“你已经喜欢这件东西了”

希望它能帮助别人,节省他们的时间,因为我在这个问题上花了很多时间。

问候

旧的答案:

回答四豪的评论:@思豪,如果你查看我的第一篇帖子,你会看到:

代码语言:javascript
运行
复制
    if (user.getObjectId().equals(userId)) {

    Log.d(TAG, "No -------------------------------------");

    holder.like.setBackgroundDrawable(context.getResources().getDrawable(R.drawable.ic_star_rate_on));

// FIRST ONCLICK LISTENER
    holder.like.setOnClickListener(new View.OnClickListener() {

    @Override

    public void onClick(View v) {

    Toast.makeText(context, "You already like this item", Toast.LENGTH_SHORT).show();

    }

    });

    } else {

    holder.like.setBackgroundDrawable(context.getResources().getDrawable(R.drawable.ic_star_rate_off));

// SECOND ONCLICK LISTENER
    holder.like.setOnClickListener(new View.OnClickListener() {

    @Override

    public void onClick(View v) {

    Log.d(TAG, "It should work +++++++++++++++++++++++++++++++");

    // getting current user

    Toast.makeText(context, "Arrived", Toast.LENGTH_SHORT).show();

    BackendlessUser currentUser = Backendless.UserService.CurrentUser();

    // adding current user as one who "liked" feed, you should implement "adding" by yourself

    List<BackendlessUser> list = new ArrayList<>();

    list.add(currentUser);

    feeds.setUsersThatLike(list);

    holder.like.setBackgroundDrawable(context.getResources().getDrawable(R.drawable.ic_star_rate_on));

    feeds.setLikes(i + 1);

    Backendless.Data.of(Feeds.class).save(feeds, new AsyncCallback<Feeds>() {

    @Override

    public void handleResponse(Feeds feeds) {

    int likes = feeds.getLikes();

    if (likes == 1) {

    holder.likes.setText(i + 1 + " like");

    } else {

    holder.likes.setText(i + 1 + " likes");

    }

    }

    @Override

    public void handleFault(BackendlessFault backendlessFault) {

    }

    });

    }

    });
票数 0
EN

Stack Overflow用户

发布于 2016-04-10 17:52:17

我相信你的问题就在这里。

引用上面给出的代码的

代码语言:javascript
运行
复制
//****PART I: NOTICE HERE****//
if (user.getObjectId().equals(userId)) {

     holder.like.setBackgroundResource(R.drawable.ic_star_rate_on);

     //****YOUR CLICK LISTENER*****//
     holder.like.setOnClickListener(new View.OnClickListener() {
         @Override
         public void onClick(View v) {
             showToast();
          }

      });

  //****PART II: NOTICE HERE****//
 } else {

  holder.like.setBackgroundResource(R.drawable.ic_star_rate_off);

  //onclick in another function: setLike(holder.like,holder.likes,feeds);

}

如果您查看第一和第二部分所示的两个部分,您就会发现,如果用户以前喜欢这个帖子,您只会附加按钮的ClickListener。

您的解决方案是将这个ClickListener移出范围,移到更通用的地方。

例如,

代码语言:javascript
运行
复制
//****YOUR CLICK LISTENER*****//
holder.like.setOnClickListener(new View.OnClickListener() {
   @Override
   public void onClick(View v) {
       showToast();
   }

});

//****PART I: NOTICE HERE****//
if (user.getObjectId().equals(userId)) {

     holder.like.setBackgroundResource(R.drawable.ic_star_rate_on);

  //****PART II: NOTICE HERE****//
 } else {

  holder.like.setBackgroundResource(R.drawable.ic_star_rate_off);

  //onclick in another function: setLike(holder.like,holder.likes,feeds);

}

编辑:

从您的代码中,您似乎试图将两个ClickListeners附加到同一个按钮上。

,而不是这样做,您应该尝试这种方法.

  • 首先,使用我提供的修改过的示例。(添加常规单击侦听器)
  • 在您的ClickListener中,以这种方式实现它。 //*您的单击侦听器*//holder.like.setOnClickListener(新的View.OnClickListener() {@覆盖公共无效onClick(View )){ if (user.getObjectId().equals(userId)) {.在这里做你的东西,{.在这里做其他事情} });
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36532799

复制
相关文章

相似问题

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