it-swarm.com.de

Hintergrundfarbe des ausgewählten Elements in der Recyclingübersicht ändern

So ändern Sie die Hintergrundfarbe nur der ausgewählten Ansicht in meinem Recyclingansicht-Beispiel: Es muss nur die Hintergrundfarbe der angeklickten Elementansicht geändert werden .. Es muss jeweils nur ein ausgewähltes Element mit Hintergrundfarbenänderung angezeigt werden, der Rest muss dies tun sein wie zuvor, wählen Sie ..__ hier ist mein Code: 

Hauptaktivität

public class MainActivity extends AppCompatActivity {
RecyclerView rv1;
    private  final String Android_versions[]={
                "Donut",
                "Eclair",
                "Froyo",
                "Gingerbread",
                "Honeycomb",
                "Ice cream sandwich",
                "Jelly bean",
                "KitKat",
                "Lollipop",
                "Marshmallow"
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initViews();
    }

    private  void initViews(){
        rv1=(RecyclerView)findViewById(R.id.recyclerView1);
        rv1.setHasFixedSize(true);
        RecyclerView.LayoutManager layoutManager=new LinearLayoutManager(getApplicationContext());
        rv1.setLayoutManager(layoutManager);

        RecyclerDataAdapter rda=new RecyclerDataAdapter(rv1,getApplicationContext(),Android_versions);
        rv1.setAdapter(rda);
    }
}

RecyclerDataadapter

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

private String Android_versionnames[];
    private Context context1;

    private RecyclerView mRecyclerView;


    public RecyclerDataAdapter(RecyclerView recylcerView,Context context,String Android_versionnames[]){
        this.Android_versionnames=Android_versionnames;
        this.context1=context;
mRecyclerView=recylcerView;
        setHasStableIds(true);
        System.out.println("Inside dataadapter,Android names : \n ");
        for(int i=0;i<Android_versionnames.length;i++){
            System.out.println("\n"+Android_versionnames[i]);
        }
    }


    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view= LayoutInflater.from(parent.getContext()).inflate(R.layout.row_layout,parent,false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(final ViewHolder holder, int position) {
        holder.tv1.setText(Android_versionnames[position]);
    }


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


    public class ViewHolder extends RecyclerView.ViewHolder {
        private TextView tv1;
        LinearLayout row_linearlayout;
        RecyclerView rv2;

        public ViewHolder(final View itemView) {
            super(itemView);
            tv1=(TextView)itemView.findViewById(R.id.txtView1);
            row_linearlayout=(LinearLayout)itemView.findViewById(R.id.row_linrLayout);
            rv2=(RecyclerView)itemView.findViewById(R.id.recyclerView1);
            /*itemView.setBackgroundColor(0x00000000);//to transparent*/

        }
    }
}
32
c0der

Danke für die Replay-Jungs .. endlich bekam ich die Antwort ..

public void onBindViewHolder(final ViewHolder holder, final int position) {
        holder.tv1.setText(Android_versionnames[position]);

        holder.row_linearlayout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                row_index=position;
                notifyDataSetChanged();
            }
        });
        if(row_index==position){
            holder.row_linearlayout.setBackgroundColor(Color.parseColor("#567845"));
            holder.tv1.setTextColor(Color.parseColor("#ffffff"));
        }
        else
        {
            holder.row_linearlayout.setBackgroundColor(Color.parseColor("#ffffff"));
            holder.tv1.setTextColor(Color.parseColor("#000000"));
        }

    }

hier ist 'row_index' anfänglich auf '-1' gesetzt 

public class ViewHolder extends RecyclerView.ViewHolder {
        private TextView tv1;
        LinearLayout row_linearlayout;
        RecyclerView rv2;

        public ViewHolder(final View itemView) {
            super(itemView);
            tv1=(TextView)itemView.findViewById(R.id.txtView1);
            row_linearlayout=(LinearLayout)itemView.findViewById(R.id.row_linrLayout);
            rv2=(RecyclerView)itemView.findViewById(R.id.recyclerView1);
        }
    }
70
c0der

Ein wirklich einfacher Weg, dies zu erreichen, wäre:

//instance variable
List<View>itemViewList = new ArrayList<>();

//OnCreateViewHolderMethod
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {    
    final View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_row, parent, false);
    final MyViewHolder myViewHolder = new MyViewHolder(itemView);

    itemViewList.add(itemView); //to add all the 'list row item' views

    //Set on click listener for each item view
    itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            for(View tempItemView : itemViewList) {
                /** navigate through all the itemViews and change color
                of selected view to colorSelected and rest of the views to colorDefault **/
                if(itemViewList.get(myViewHolder.getAdapterPosition()) == tempItemView) {
                    tempItemView.setBackgroundResource(R.color.colorSelected);
                }
                else{
                    tempItemView.setBackgroundResource(R.color.colorDefault);
                }
            }
        }
    });
    return myViewHolder;
}

UPDATE

Die obige Methode kann einige Standardattribute der itemView ruinieren. In meinem Fall habe ich CardView verwendet, und der Eckenradius der Karte wurde beim Klicken entfernt.

Bessere Lösung:

//instance variable
List<CardView>cardViewList = new ArrayList<>();

public class MyViewHolder extends RecyclerView.ViewHolder {
        CardView cardView; //THIS IS MY ROOT VIEW
        ...

        public MyViewHolder(View view) {
            super(view);
            cardView = view.findViewById(R.id.row_item_card);
            ...
        }
}

@Override
    public void onBindViewHolder(final MyViewHolder holder, int position) {
        final OurLocationObject locationObject = locationsList.get(position);
        ...

        cardViewList.add(holder.cardView); //add all the cards to this list

        holder.cardView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //All card color is set to colorDefault
                for(CardView cardView : cardViewList){
                cardView.setCardBackgroundColor(context.getResources().getColor(R.color.colorDefault));
                }
                //The selected card is set to colorSelected
                holder.cardView.setCardBackgroundColor(context.getResources().getColor(R.color.colorSelected));
            }
        });
}

UPDATE 2 - WICHTIG

die onBindViewHolder-Methode wird mehrmals aufgerufen, und jedes Mal, wenn der Benutzer die Ansicht außer Sicht und wieder in Sicht setzt, wird diese Ansicht mehrfach zur Liste hinzugefügt, was zu Problemen und geringfügiger Verzögerung des Codes führen kann Hinrichtungen

Um dies zu beheben, change

cardViewList.add(holder.cardView);

bis

if (!cardViewList.contains(holder.cardView)) {
    cardViewList.add(holder.cardView);
}
5
Hanzyusuf

Ich kann diese Lösung vorschlagen, die ich in meiner App verwendet habe. Ich habe diesen Code von onTouchListener in den Konstruktor meiner ViewHolder-Klasse eingefügt. itemView ist das Argument des Konstruktors. Stellen Sie sicher, dass Sie return false für diese Methode verwenden , weil dies für das Arbeiten mit OnClickListener erforderlich ist

itemView.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        if(event.getAction() == MotionEvent.ACTION_DOWN)
        {
            v.setBackgroundColor(Color.parseColor("#f0f0f0"));
        }
        if (event.getAction() == MotionEvent.ACTION_UP || event.getAction() == MotionEvent.ACTION_CANCEL)
        {
            v.setBackgroundColor(Color.TRANSPARENT);
        }
        return false;
    }
});
4
Gulov Khurshed

Wenn Sie Kotlin verwenden, ist es wirklich einfach.

In Ihrer RecyclerAdapter-Klasse

userV.invalidateRecycler()

holder.card_User.setCardBackgroundColor(Color.parseColor("#3eb1ae").withAlpha(60))

In deinem Fragment oder in deiner Aktivität

 override fun invalidateRecycler() {
    if (v1.recyclerCompanies.childCount > 0) {
        v1.recyclerCompanies.childrenRecursiveSequence().iterator().forEach { card ->
            if (card is CardView) {
                card.setCardBackgroundColor(Color.WHITE)
            }
        }
    }
}
1
Rudrik Panchal

Erstellen Sie eine Drawable-Datei in Drawable Foloder

<item Android:drawable="@color/SelectedColor" Android:state_pressed="true"></item>
<item Android:drawable="@color/SelectedColor" Android:state_selected="true"></item>
<item Android:drawable="@color/DefultColor"></item>

Und in der XML-Datei 

Android:background="@drawable/Drawable file"

In RecyclerView onBindViewHolder

holder.button.setSelected(holder.button.isSelected()?true:false);

Wie Toggle-Taste 

1
Joy

Fügen Sie in .onBindViewHolder () des RecyclerView-Adapters einen Click-Listener für die Elementansicht hinzu. Holen Sie sich die aktuell ausgewählte Position und ändern Sie die Farbe durch .setBackground () für das zuvor ausgewählte und aktuelle Element

0
Alex Shutov

Es ist mir gelungen, dies von meiner Aktivität aus zu tun, wo ich meine Rv einstelle und nicht mit dem Adapter

Wenn jemand etwas Ähnliches tun muss, hier der Code

In diesem Fall ändert sich die Farbe auf einem logClick

           @Override
        public void onLongClick(View view, int position) {
            Toast.makeText(UltimasConsultasActivity.this, "Item agregado a la lista de mails",
                    Toast.LENGTH_SHORT).show();

            sendMultipleMails.setVisibility(View.VISIBLE);
            valueEmail.setVisibility(View.VISIBLE);
            itemsSeleccionados.setVisibility(View.VISIBLE);

            listaEmails.add(superListItems.get(position));
            listaItems ="";
            NameOfyourRecyclerInActivity.findViewHolderForAdapterPosition(position).NameOfYourViewInTheViewholder.setBackgroundColor((Color.parseColor("#336F0D")));

            for(int itemsSelect = 0; itemsSelect <= listaEmails.size() -1; itemsSelect++){

             listaItems  +=  "*"+listaEmails.get(itemsSelect).getDescripcion() + "\n";
            }

            itemsSeleccionados.setText("Items Seleccionados : "+  "\n" + listaItems);


        }


    }));
0
JoaquinAlvarez

Ich habe es so verstanden

public void onClick(View v){
        v.findViewById(R.id.textView).setBackgroundColor(R.drawable.selector_row);
 }

Vielen Dank

0
MindRoasterMir

Meine Lösung:

public static class SimpleItemRecyclerViewAdapter
        extends RecyclerView.Adapter<SimpleItemRecyclerViewAdapter.ViewHolder> {

    private final MainActivity mParentActivity;
    private final List<DummyContent.DummyItem> mValues;
    private final boolean mTwoPane;
    private static int lastClickedPosition=-1;
    **private static View viewOld=null;**
    private final View.OnClickListener mOnClickListener = new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            DummyContent.DummyItem item = (DummyContent.DummyItem) view.getTag();
            if (mTwoPane) {
                Bundle arguments = new Bundle();
                arguments.putString(ItemDetailFragment.ARG_ITEM_ID, item.id);
                ItemDetailFragment fragment = new ItemDetailFragment();
                fragment.setArguments(arguments);
                mParentActivity.getSupportFragmentManager().beginTransaction()
                        .replace(R.id.item_detail_container, fragment)
                        .commit();
            } else {
                Context context = view.getContext();
                Intent intent = new Intent(context, ItemDetailActivity.class);
                intent.putExtra(ItemDetailFragment.ARG_ITEM_ID, item.id);

                context.startActivity(intent);
            }

            **view.setBackgroundColor(mParentActivity.getResources().getColor(R.color.SelectedColor));
            if(viewOld!=null)
                viewOld.setBackgroundColor(mParentActivity.getResources().getColor(R.color.DefaultColor));
            viewOld=view;**
        }
    };

viewOld ist am Anfang null und zeigt dann auf die zuletzt ausgewählte Ansicht . Mit onClick ändern Sie den Hintergrund der ausgewählten Ansicht und definieren den Hintergrund der ausgewählten vorletzten Ansicht neu.

0
Paolo

Erstellen Sie einen Selektor im Ordner Drawable:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android"> 
<item Android:state_pressed="true">
   <shape>
         <solid Android:color="@color/blue" />
   </shape>
</item>

<item Android:state_pressed="false">
    <shape>
       <solid Android:color="@Android:color/transparent" />
    </shape>
</item>
</selector>

Fügen Sie die Eigenschaft in Ihre XML-Datei ein (in der Sie RecyclerView deklarieren):

Android:background="@drawable/selector"
0
GiuseppeLabanca

Der einfachste Weg von meiner Seite ist das Hinzufügen einer Variablen in der adapterPage als zuletzt angeklickte Position.

fügen Sie in onBindViewHolder diesen Code ein, der nach der letzten gespeicherten Position sucht, die mit den Ladepositionen übereinstimmt Konstanten sind die Klasse, in der ich meine globalen Variablen deklariere

if(Constants.LAST_SELECTED_POSITION_SINGLE_PRODUCT == position) {

    //change the view background here
    holder.colorVariantThumb.setBackgroundResource(R.drawable.selected_background);
}

//on view click you store the position value and notifyItemRangeChanged will 
// call the onBindViewHolder and will check the condition

holder.itemView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view){
        Constants.LAST_SELECTED_POSITION_SINGLE_PRODUCT=position;
        notifyItemRangeChanged(0, mColorVariants.size());
    } 
});
0
Rahul