从后台的支持论坛来到这里。“这个支持论坛严格针对与后台相关的问题。我们的APIs和后端服务之外的任何一般问题都不包括在支持范围内。请考虑在stackoverflow.com和/或Android论坛上发布。”马克·皮勒。
所以我在这里发布我的问题。在后台无止境的支持论坛,我得到了一些宝贵的帮助,以保存和恢复关系,但现在我面临另一个问题与类似按钮。我正在开发一个有3个按钮的社交应用程序:比如评论分享。链接到我的后台支持线程:http://support.backendless.com/topic/some-questions-regarding-data-loading-in-recyclerview-android,就目前而言,我正在尝试使Like按钮工作,但我面临以下问题:
如果你看下面的代码和屏幕截图I 附加的,你可以看到有类似的心脏按钮,这不是填充,这意味着我没有点击类似的帖子。在第二个数字中,还有一个按钮被填充,我点击了它,这个应用程序把我添加到了像那篇文章这样的用户列表中。
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类如下:
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();
}
这是我的饲料课:
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;
}
}
你能帮我吗?
编辑:在实现下面答案中的代码之后的不起作用。我就是这样编辑我的代码的:
//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“列。但它还在为所有的物品“填满”心。我的意思是说,即使心脏可拉伸是空的,它返回的是填充的,如果我单击一个填充的心脏,它会显示吐司,但是如果心脏没有填充,它将显示相同的祝酒词:我的代码是:
//*** 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中,在查询代码之后,我将检查可绘制的,如下所示:
//***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();
}
}
});
发布于 2016-04-10 18:32:06
更新:
大家好,我终于找到了一个很好的解决方案。我能够将用户保存到"usersThatLike“列,并在特定项上设置类似的内容。但是,每次我单击“喜欢”按钮时,它都会显示“您已经喜欢它”的祝酒词,只有当我出现在usersThatLike列表中时,才会显示它,因此出现了问题。我使用了以下技巧来解决这个问题:在我的RecyclerView适配器中,我像这样查询了类:
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) {
}
});
如您所见,如果查询返回该用户不在列表中,并且如果用户在列表中,则设置可绘制的星型关闭。
在此之后,我才能解决这个问题。在查询之外,我创建了以下检查:
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列表中。否则就祝酒:“你已经喜欢这件东西了”
希望它能帮助别人,节省他们的时间,因为我在这个问题上花了很多时间。
问候
旧的答案:
回答四豪的评论:@思豪,如果你查看我的第一篇帖子,你会看到:
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) {
}
});
}
});
发布于 2016-04-10 17:52:17
我相信你的问题就在这里。
引用上面给出的代码的:
//****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移出范围,移到更通用的地方。
例如,:
//****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附加到同一个按钮上。
,而不是这样做,您应该尝试这种方法.
https://stackoverflow.com/questions/36532799
复制相似问题