Android 使用scroll RecycleAdapter和scroll在元素上重复背景

Android 使用scroll RecycleAdapter和scroll在元素上重复背景,android,android-recyclerview,Android,Android Recyclerview,我有customrecycleAdapter,当我点击元素时,我会改变行的颜色,但若我滚动查看背景,会改变位置或出现在其他元素上。 我已经读过《观点的循环》,但是,这个问题的解决方案是什么呢 我的适配器是: public class CustomRecycleAdapter extends RecyclerView.Adapter<CustomRecycleAdapter.ViewHolder> { private JSONArray dataSource; priv

我有customrecycleAdapter,当我点击元素时,我会改变行的颜色,但若我滚动查看背景,会改变位置或出现在其他元素上。 我已经读过《观点的循环》,但是,这个问题的解决方案是什么呢

我的适配器是:

public class CustomRecycleAdapter extends RecyclerView.Adapter<CustomRecycleAdapter.ViewHolder> {
    private JSONArray dataSource;
    private AdapterCallback mAdapterCallback;
    public static SparseBooleanArray selectedItems;

    public CustomRecycleAdapter(JSONArray dataArgs, Context context){
        dataSource = dataArgs;
        this.mAdapterCallback = ((AdapterCallback) context);


    }



    public static interface AdapterCallback {
        void onMethodCallback(View caller, JSONObject obj, JSONArray data, int position);
    }


    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        // create a new view
        View view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.list_view_activities, parent, false);

        ViewHolder viewHolder = new ViewHolder(view,  new CustomRecycleAdapter.ViewHolder.IMyViewHolderClicks() {
            public void onClick(View caller, int position) {
                try {

                    JSONObject itemClicked = dataSource.getJSONObject(position);
                    mAdapterCallback.onMethodCallback(caller, itemClicked, dataSource, position);
//                    Log.e("clicked", itemClicked.toString());

                } catch (JSONException e) {
                    e.printStackTrace();
                }
            };
        });

        return viewHolder;

    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        try {

            JSONObject object =  dataSource.getJSONObject(position);
            holder.textView.setText(object.getString("description"));





        } catch (JSONException e) {
            e.printStackTrace();
        }

    }
    @Override
    public int getItemCount() {
        return dataSource.length();
    }

    public JSONObject getItem(int position) throws JSONException {
        return dataSource.getJSONObject(position);
    }

    public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{

        public IMyViewHolderClicks mListener;
        public TextView textView;
        public TextView hours;

        public ViewHolder(View itemView, IMyViewHolderClicks listener) {
            super(itemView);
            mListener = listener;
            textView = (TextView) itemView.findViewById(R.id.activity);
            hours = (TextView) itemView.findViewById(R.id.hours);
            itemView.setOnClickListener(this);

        }


        @Override
        public void onClick(View v) {
            int position  = getAdapterPosition();
            Log.e("RecycleAdapterPosition", String.valueOf(getAdapterPosition()));
//            mListener.onClick(v, position);
            v.setBackgroundColor(Color.GREEN);
            v.setSelected(true);


        }
        public interface IMyViewHolderClicks {


            public void onClick(View caller, int position);
        }
    }




}
公共类CustomRecycleAdapter扩展了RecycleView.Adapter{
私有JSONArray数据源;
专用适配器回调mAdapterCallback;
公共静态SparseBooleanArray selectedItems;
公共CustomRecycleAdapter(JSONArray数据参数,上下文){
dataSource=dataArgs;
this.mAdapterCallback=((AdapterCallback)上下文);
}
公共静态接口适配器回调{
void onMethodCallback(视图调用者、JSONObject对象、JSONArray数据、int位置);
}
@凌驾
public ViewHolder onCreateViewHolder(视图组父级,int-viewType){
//创建新视图
View=LayoutInflater.from(parent.getContext())
.充气(R.layout.list\u view\u活动,父项,false);
ViewHolder ViewHolder=新的ViewHolder(视图,新的CustomRecycleAdapter.ViewHolder.IMyViewHolderClicks(){
公共void onClick(视图调用者,int位置){
试一试{
JSONObject itemClicked=dataSource.getJSONObject(位置);
onMethodCallback(调用者、单击项、数据源、位置);
//Log.e(“clicked”,itemClicked.toString());
}捕获(JSONException e){
e、 printStackTrace();
}
};
});
返回视图持有者;
}
@凌驾
公共无效onBindViewHolder(ViewHolder,int位置){
试一试{
JSONObject object=dataSource.getJSONObject(位置);
holder.textView.setText(object.getString(“description”);
}捕获(JSONException e){
e、 printStackTrace();
}
}
@凌驾
public int getItemCount(){
返回dataSource.length();
}
公共JSONObject getItem(int位置)抛出JSONException{
返回dataSource.getJSONObject(位置);
}
公共静态类ViewHolder扩展了RecyclerView.ViewHolder实现了View.OnClickListener{
公共imyviewholder-mListener;
公共文本视图文本视图;
公共文本浏览时间;
公共视图持有者(视图项视图、IMyViewHolderClicks侦听器){
超级(项目视图);
mListener=监听器;
textView=(textView)itemView.findViewById(R.id.activity);
小时=(TextView)itemView.findViewById(R.id.hours);
setOnClickListener(这个);
}
@凌驾
公共void onClick(视图v){
int position=getAdapterPosition();
Log.e(“RecycleAdapterPosition”,String.valueOf(getAdapterPosition());
//mListener.onClick(v,位置);
v、 setBackgroundColor(颜色:绿色);
v、 已选择(正确);
}
公共界面IMyViewHolderClicks{
公共void onClick(视图调用者,int位置);
}
}
}

因此,我单击元素,并正确地设置背景,但如果我滚动,我会看到另一个设置了背景的元素,如果我向上滚动我选择的元素,它没有背景。

RecyclerView重新使用视图绘制列表中的下一个元素,该元素将显示,因此,视图集具有新数据,但仍保留旧样式,因为您可以看到列表中其他元素具有新颜色

您应该创建一个数组,存储是否选中此元素,并在调用
onBindViewHolder()
时检查是否选中了此元素

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

    if(checked[position]){
        //YourViewHolder change colour

    }

}

RecyclerView重用视图来绘制列表中将显示的下一个元素,因此视图集具有新数据,但继续具有旧样式,因为您可以看到列表中的其他元素具有新颜色

您应该创建一个数组,存储是否选中此元素,并在调用
onBindViewHolder()
时检查是否选中了此元素

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

    if(checked[position]){
        //YourViewHolder change colour

    }

}

这是模型和视图分离的一个好处。单击时,控制器应更新模型(即数组中的索引),然后更新的模型应触发对视图层(即适配器)的更新,该层可使用模型(颜色值)渲染正确的背景色。这是模型和视图分离的一个好处。单击时,控制器应更新模型(即数组中的索引),然后更新的模型应触发对视图层(即适配器)的更新,该视图层随后可使用模型(颜色值)渲染适当的背景色。