Android回收站视图切换按钮回收问题

时间:2016-08-10 04:40:52

标签: java android android-recyclerview

我正在创建一个应用程序,并有一个Recyclerview用于显示用户提要。我正在使用切换按钮来喜欢帖子。当用户打开应用程序时,如果正在使用该应用程序的用户已经喜欢该状态,则其启用类似按钮,并且用户也可以像其他社交应用程序那样向下滚动来发布帖子。

  

问题是向下滚动时是否选中了切换按钮    其他切换按钮属于其他帖子也会被检查。

适配器类

 public class topNewsAdapter extends RecyclerView.Adapter<topNewsRowHolder> {

        private ArrayList<topData> topDataList;
        private Context context;
        private Activity activity;
        private RecyclerView recyclerView;
        private View v;
        protected String liked = "success";
        protected String expired = "Expired";




        public topNewsAdapter( ArrayList<topData> listItemList , Activity activity , RecyclerView view) {

            this.topDataList = listItemList;
            this.activity = activity;
            this.recyclerView = view;

        }



        @Override
        public topNewsRowHolder onCreateViewHolder(final ViewGroup parent, int viewType) {
            v = LayoutInflater.from(parent.getContext()).inflate(R.layout.top_news_row, parent, false);
            context = parent.getContext();
            return new topNewsRowHolder(v , activity); //passed activity



        }

        @Override
        public void onBindViewHolder(final topNewsRowHolder holder, final int position) {


            topData item = topDataList.get(position);

            if(!(item == null)) {

                holder.userName.setText(item.getUserName().toString());
                holder.timer.setText(item.getCreatedTime().toString());
                holder.status.setText(item.getStatus().toString());
                holder.fameCount.setText(item.getLikeCount().toString());
                holder.dislike_Count.setText(item.getDislike_Count().toString());
                holder.statusID.setText(item.getStatusID().toString());



                if(item.getLiked().equals(1)){
                    holder.fameButton.setChecked(true);
                }else if(item.getLiked().equals(0)){
                    holder.fameButton.setChecked(false);
                }



                if(item.getDisliked().equals(1)){
                    holder.disLikeButton.setChecked(true);

                }else if(item.getDisliked().equals(0)){
                    holder.disLikeButton.setChecked(false);
                }





               holder.fameButton.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                    @Override
                    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                        if(isChecked){

                           lRequester(holder.statusID.getText().toString() , "1" , holder.fameCount );
                            dRequester(holder.statusID.getText().toString() , "0" , holder.dislike_Count);

                            holder.fameButton.setChecked(true);


                       }else if(!isChecked){
                            lRequester(holder.statusID.getText().toString() , "0" , holder.fameCount);


                        }
                   }
               });


                holder.disLikeButton.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                    @Override
                    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                        if(isChecked){
                            dRequester(holder.statusID.getText().toString(), "1" ,holder.dislike_Count);
                            lRequester(holder.statusID.getText().toString() , "0" , holder.fameCount);

                            holder.fameButton.setChecked(false);

                        }else if(!isChecked){
                            dRequester(holder.statusID.getText().toString() , "0" , holder.dislike_Count);
                        }
                    }
                });







        }



        }













        @Override
        public int getItemCount() {
            return topDataList.size();
        }


        @Override
        public long getItemId(int position) {
            return position;
        }




        public void lRequester(String id , String type, final TextView textview){
            Call<responseFD> request = handler.handlerClass.fame(data("u") , data("t") , id , type );
            request.enqueue(new Callback<responseFD>() {
                @Override
                public void onResponse(Call<responseFD> call, Response<responseFD> response) {
                    if(!response.body().getResponse().isEmpty() && (response.body().getResponse() != null)) {

                        if (response.body().getResponse().equals(expired)) {
                            vlData.getInstance().terminateRunnable();
                            reset();

                        }else if (response.body().getResponse().equals(liked)) {
                            textview.setText(response.body().getLike_count().toString());

                        }


                    }

                }

                @Override
                public void onFailure(Call<responseFD> call, Throwable t) {
                    Toast.makeText(v.getContext(), "Something Gone Wrong", Toast.LENGTH_SHORT).show();

                }
            });


        }


        public void dRequester(String id , String type , final TextView textView){
            Call<responseFD> request = handler.handlerClass.disfame(data("u") , data("t") , id , type );
            request.enqueue(new Callback<responseFD>() {
                @Override
                public void onResponse(Call<responseFD> call, Response<responseFD> response) {
                    if(!response.body().getResponse().isEmpty() && response.body().getResponse() != null) {
                        if (response.body().getResponse().equals(expired)) {
                            vlData.getInstance().terminateRunnable();
                            reset();

                        }else if (response.body().getResponse().equals(liked)) {
                            textView.setText(response.body().getDislike_Count().toString());

                        }
                    }


                }

                @Override
                public void onFailure(Call<responseFD> call, Throwable t) {
                    Log.d("data", "onFailure: " + t.getMessage());
                }
            });







        }


        public void reset(){

            Intent i = new Intent(activity , login.class);
            activity.startActivity(i);
            activity.finish();
        }



    }

Rowholder class

 public  class topNewsRowHolder extends RecyclerView.ViewHolder {

    protected TextView userName;
    protected TextView timer;
    protected TextView status;
    protected ImageView profilePicHolder;
    protected TextView fameCount;
    protected TextView dislike_Count;
    protected ToggleButton fameButton;
    protected ToggleButton disLikeButton;
    protected View v;
    protected TextView statusID;
    protected Activity activity;
    protected RelativeLayout holderlayout;




    public topNewsRowHolder(View view , Activity activity ){
        super(view);
        v = view;
        this.activity = activity;

        this.userName = (TextView)view.findViewById(R.id.usernameHolder);
        this.timer = (TextView)view.findViewById(R.id.timeHolder);
        this.status = (TextView)view.findViewById(R.id.status_user);
        this.profilePicHolder = (ImageView)view.findViewById(R.id.profile_pic_holder);
        this.fameCount = (TextView)view.findViewById(R.id.like_count);
        this.dislike_Count = (TextView)view.findViewById(R.id.dislike_count);
        this.fameButton = (ToggleButton)view.findViewById(R.id.fameButton);
        this.disLikeButton = (ToggleButton)view.findViewById(R.id.dislikeButton);
        this.statusID = (TextView)view.findViewById(R.id.statusID);
        this.holderlayout = (RelativeLayout) view.findViewById(R.id.text);







    }


    }

我知道这是因为回收利用。如何解决这个问题?谢谢:))

2 个答案:

答案 0 :(得分:0)

试试这个:RecyclerView需要一个外部变量来跟踪检查哪些项目,而SparseBooleanArray会起作用,这很乏味。

holder.fameButton.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean IsChecked) { 
        isChecked ? item.setIsLiked(1) : item.setIsLiked(0);
        if(isChecked){
            lRequester(holder.statusID.getText().toString() , "1" , holder.fameCount );
            dRequester(holder.statusID.getText().toString() , "0" , holder.dislike_Count);
        } else if(!isChecked){
            lRequester(holder.statusID.getText().toString() , "0" , holder.fameCount);
        }
        }
     });

答案 1 :(得分:0)

在内容Feed中为managind创建一个Broker模式。

此单例破坏将跟踪每个内容订阅源项ID并将其映射到散列映射中的状态(社交或喜欢)。并且每次在Content Feed项目中发生反应(如/不同/不喜欢/不相似)时,您都会使用此Broker触发actian,该Broker也会传播并在本地跟踪更改。您可以实现Broadcaster或pub-sub模式,以便为UI提供有关更改的信息。

最好使用带有数据库的Content Provider来存储您从网络服务器获取的json。

如果您需要进一步澄清,请与我们联系。

SocialBroker.java

public class SocialBroker extends ISocialBroker {
    //region <!-- Private properties -->
    private static SocialBroker _instance;
    private HashMap<UUID, SocialStatus> _map = new HashMap<>();
    //endregion

    //region <!-- Singleton initializer -->
    public static SocialBroker newInstance() {
        if (_instance == null) {
            _instance = new SocialBroker();
        }
        return _instance;
    }

    private SocialBroker() {};
    //endregion
    // The interface method implemented here
}

ISocialBroker.java

public interface ISocialBroker {
    public synchronized SocialStatus save(String expiresAt, UUID id, boolean hasLiked, int numberOfLikes, int numberOfComments);
    public SocialStatus lookup(UUID id);
    public synchronized SocialStatus like(UUID id);
    public synchronized SocialStatus unlike(UUID id);

    public HashMap<UUID, SocialStatus> getMap();
    public void loadState(HashMap<UUID, SocialStatus> restoredSocialState);
}

OnReactionObserver.java

public interface OnReactionObserver {
    void onLikeReaction();
}

OnReactionPublisher.java

public interface OnReactionPublisher {
    void attachObserver(OnReactionObserver... observer);
    void notifyListeners();
}

当您将结果绑定到适配器中的视图时,使用代理保存条目,然后在类似按钮视图中,再次召唤Broker以执行like / different / dislike / undislike。

SocialStatus只是一个跟踪信息的模型,可以序列化,保存,与在线服务同步。

希望这能指向正确的方向。