Recyclerview adapter: problem when changing the color of a button

Asked

Viewed 604 times

0

I’m using RecyclerView and putting together a list of buttons. I can change the color of button according to a if, if the condition is true it changes, but when you go up and down the list, you end up changing others buttons that cannot change the color.

Adapter

public class RVAdapterTp1 extends RecyclerView.Adapter<RVAdapterTp1.MyViewHolder> {
private ArrayList<horario> horarioI;
private ArrayList<horario> horarioO;
private LayoutInflater mLayoutInflater;
private MaterialDialog mMaterialDialog;
private Context mContext;

public RVAdapterTp1(Context c, ArrayList<horario> i, ArrayList<horario> o) {
    this.horarioI = i;
    this.horarioO = o;
    mContext = c;
    //mLayoutInflater = (LayoutInflater) c.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

}

@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.tp1_item, parent, false);
    MyViewHolder mvh = new MyViewHolder((v));
    return mvh;
}

@Override
public void onBindViewHolder( final MyViewHolder holder, final int position) {
    if (position < horarioO.size()) {
        holder.cvO.setText(horarioO.get(position).getIo());
        holder.cvO.setVisibility(View.VISIBLE);
        if (horarioO.get(position).getOb() == 0) {
            holder.cvO.setBackgroundColor(Color.parseColor("#FFC107"));
           holder.cvO.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    mMaterialDialog = new MaterialDialog(mContext);
                    mMaterialDialog.setTitle("ATENÇÃO");
                    mMaterialDialog.setMessage(horarioO.get(position).getObs());
                    mMaterialDialog.setPositiveButton("OK", new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            mMaterialDialog.dismiss();
                        }
                    });
                    mMaterialDialog.show();
                }
            });
        }
    } else {
        holder.cvO.setText("");
        holder.cvO.setVisibility(View.INVISIBLE);
    }

    if (position < horarioI.size()) {
        holder.cvI.setText(horarioI.get(position).getIo());
        holder.cvI.setVisibility(View.VISIBLE);
        Log.v("AQUIIIaaaaaa", holder.cvI.getText().toString());

        if (horarioI.get(position).getOb() == 0) {
            horarioI.get(position).setOb(1);
            Log.v("AQUIII", holder.cvI.getText().toString());
            holder.cvI.setBackgroundColor(Color.parseColor("#FFC107"));
            Log.v("AQUIIIeeeee", horarioI.get(position).getIo());
            holder.cvI.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    mMaterialDialog = new MaterialDialog(mContext);
                    mMaterialDialog.setTitle("ATENÇÃO");
                    mMaterialDialog.setMessage(horarioI.get(position).getObs());
                    mMaterialDialog.setPositiveButton("OK", new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            mMaterialDialog.dismiss();
                        }
                    });
                    Log.v("AQUIIIuuuu", holder.cvI.getText().toString());
                    mMaterialDialog.show();
                }
            });
        }
    } else {
        holder.cvI.setText("");
        holder.cvI.setVisibility(View.INVISIBLE);
    }

}

@Override
public int getItemCount() {
    if (horarioO.size() >= horarioI.size()) {
        return horarioO.size();
    } else {
        return horarioI.size();
    }
}

public class MyViewHolder extends RecyclerView.ViewHolder {

    public Button cvI;
    public Button cvO;

    public MyViewHolder(View itemView) {
        super(itemView);
        cvI = (Button) itemView.findViewById(R.id.cvI);
        cvO = (Button) itemView.findViewById(R.id.cvO);
    }
}
}

Fragment

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    View view = inflater.inflate(R.layout.fragment_tp1, container, false);


    mRecyclerView = (RecyclerView) view.findViewById(R.id.rv_list);

    mRecyclerView.setHasFixedSize(true);

    LinearLayoutManager llm = new LinearLayoutManager(getActivity());
    llm.setOrientation(LinearLayoutManager.VERTICAL);
    mRecyclerView.setLayoutManager(llm);

    adapterTp1 = new RVAdapterTp1(getActivity(), horarioI, horarioO);
    mRecyclerView.setAdapter(adapterTp1);

    return view;

}

Item layout

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/llTp1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">

<Button
    android:id="@+id/cvI"
    android:layout_width="0dp"
    android:layout_height="match_parent"
    android:layout_marginBottom="2dp"
    android:layout_marginLeft="2dp"
    android:layout_marginRight="4dp"
    android:layout_marginTop="0dp"
    android:layout_weight="1"
    android:textColor="@color/primary_text"
    android:textSize="30sp"
    android:visibility="invisible"></Button>

<Button
    android:id="@+id/cvO"
    android:layout_width="0dp"
    android:layout_height="match_parent"
    android:layout_marginBottom="2dp"
    android:layout_marginLeft="2dp"
    android:layout_marginRight="4dp"
    android:layout_marginTop="0dp"
    android:layout_weight="1"
    android:textColor="@color/primary_text"
    android:textSize="30sp"
    android:visibility="invisible"></Button>

</LinearLayout>

Layout Recyclerview

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".Frags.Tp1Frag">

<android.support.v7.widget.RecyclerView
    android:layout_gravity="center"
    android:id="@+id/rv_list"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"/>

</FrameLayout>

Layout of the viewPager

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/main_content"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.design.widget.AppBarLayout
    android:id="@+id/appBarLayout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:theme="@style/AppTheme.AppBarOverlay">
    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:titleTextColor="@color/primary_text"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorPrimary"
        app:layout_scrollFlags="scroll|enterAlways"
        app:popupTheme="@style/AppTheme.PopupOverlay" />
    <android.support.design.widget.TabLayout
        android:id="@+id/tabs"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:tabTextColor="#B6B6B6"
        app:tabSelectedTextColor="#FFFFFF"/>
   </android.support.design.widget.AppBarLayout>
    <android.support.v4.view.ViewPager
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior" />

</android.support.design.widget.CoordinatorLayout>

3 answers

3

Recyclerview is an optimized version of a Listview for a reason: as the name says, it reuses Views. When you change the color of the button of an item that is in a View, it may happen that when another item is displayed in this same View it does not reload the button and it gets the color changed.

Try changing the button color to original color at the beginning of onBindViewHolder( ).

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

    holder.cvO.setBackgroundColor( COR ORIGINAL );
    holder.cvI.setBackgroundColor( COR ORIGINAL );
    .
    .
    .
}

0

You need to get the id of the selected item in the onCreateViewHolder method then perform the given action

@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view;
    view = LayoutInflater.from(context).inflate(R.layout.stop_item_list, parent, false);

    botão.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) { 
           // ação de troca de cor!

        }
    }
}

-1

I was able to solve using Holder.setIsRecyclable(false);

  • 4

    You didn’t solve it, you just got around the problem.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.