更改适配器中的业务对象

时间:2015-05-15 14:39:32

标签: android json android-adapter

我正在构建一个类似于Facebook的Android应用程序(从REST API获取存储在数据库中的新闻源),我现在正在实现一个类似reddit的投票系统,其中每个订阅源项都有一个投票状态(存储在db。

中的none,up,down)

当我检索新闻源json时,我将其voteState设置为json中的投票状态,然后通过新闻源适配器显示它。

但是如果我将newsfeed适配器中的voteState设置为另一个值(基于onClickListener),则此更改的值不会达到实际的新闻源。 这是因为每次我滚动新闻源时,新闻源适配器都会获得新闻源的新实例,并不关心我改变的值。

因此,我正在寻找从newsfeed适配器永久修改新闻源投票状态的最佳方法(这可以推广到分配给ArrayList的任何变量,然后通过ArrayListAdapter显示)。

如果您有任何建议,请随时回复。

谢谢:)

编辑:

public class NewsfeedAdapter extends RecyclerView.Adapter<NewsfeedAdapter.ViewHolder> {

private Newsfeed newsfeed;
private FeedItem item;

public NewsfeedAdapter(..., Newsfeed newsfeed) {
    ...;
    this.newsfeed = newsfeed;
}

public static class ViewHolder extends RecyclerView.ViewHolder {
    protected Button button_up/down....

    public ViewHolder(View v) {
        super(v);

        button = findViewById ... (R.id.button);
        ...
    }

}

// Create new views (invoked by the layout manager)
@Override
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
    ...
}

@Override
public void onBindViewHolder(final ViewHolder holder, final int position) {
    final FeedItem item = newsfeed.get(position);

    holder.button_up.setTag(position);
    holder.button_up.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            changeVote(item, "up");
        }
    });

    holder.button_down.setTag(position);
    holder.button_down.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            changeVote(item, "down");
        }
    });
}

public void changeVote(FeedItem item, String flag) {
    // Log.d(TAG, "State of vote :" + item.getVoteState());
    if (item.getVoteState().equals(flag)) {
        item.setVoteState("none");
        Log.d(TAG, "Deleting vote :" + item.getVoteState());
        new Connexion(activity, fragment, "vote", "Deleting vote...").execute(String.valueOf(item.getId()), flag, "delete");
    }
    else if (item.getVoteState().equals("none")){
        item.setVoteState(flag);
        Log.d(TAG, "Voting :" + item.getVoteState());
        new Connexion(activity, fragment, "vote", "Voting...").execute(String.valueOf(item.getId()), flag, "insert");

    } else {
        item.invertVoteState(flag);
        Log.d(TAG, "Inverting :" + item.getVoteState());
        new Connexion(activity, fragment, "vote", "Voting...").execute(String.valueOf(item.getId()), flag, "invert");
    }
} }

1 个答案:

答案 0 :(得分:0)

您有两种选择:

1)每次更改数据时,都会向其余API发送更新。这真的很贵,而且不是你想要做的事情。

2)在您的rest API和listview之间创建一个本地数据层 - 很可能是SQLite数据库或其他一些ORM lib。这样,您可以在适配器中保存数据库的实例,并且每当数据更改时,您可以通过简单的db方法调用更新它,然后定期向其余API发送更新,同时还检查来自的更新其余的API,然后将它们推送到数据库。

我强烈建议您使用SQLite数据库,因为您可以在数据库代码中保留一定数量的更改计数器,或者自上次同步以来经过的时间,并保持用户看到的数据不会被粉碎重复网络呼叫的用户数据使用情况。