Android: выбранный по умолчанию элемент в recyclerview

#android #android-recyclerview

#Android #android-recyclerview

Вопрос:

в моем приложении есть recyclerview, и я показываю города в этом recyclerview. Форма каждого элемента округлена, а альфа равна 0,5. Я хочу, чтобы альфа только выбранного элемента была равна 1. Я могу изменить алфавитные обозначения выбранного элемента, но у меня проблема. Я хочу, чтобы первый элемент был выбран сразу после начала действия. Вот мои коды:

 public void onBindViewHolder(@NonNull final ViewHolder holder, final int i) {

    String name= cityArrayList.get(i).getName();
    Character firstLetter=name.charAt(0);
    String fL= String.valueOf(firstLetter);

    if(name.equals(" ")){
        holder.tvHeaderCityName.setText("Add City");

        holder.tvLogo.setText(fL);
    } else{
        holder.tvHeaderCityName.setText(name);

        holder.tvLogo.setText(fL);
    }

    boolean isLastIndex=false;
    boolean isFirstIndex=false;

    int size= cityArrayList.size();

    if(cityArrayList.get(i)==cityArrayList.get(size-1)){
        isLastIndex=true;
    }

    if(cityArrayList.get(i)==cityArrayList.get(0)){
        isFirstIndex=true;
    }

    Log.d("indexilk",String.valueOf(isFirstIndex));
    Log.d("indexson",String.valueOf(isLastIndex));


    holder.llCity.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            cIndex=i;

            cityArrayList.get(0).setChecked(false);

            for (int k=0;k<cityArrayList.size();k  ){

                if(k==i){
                    cityArrayList.get(k).setChecked(true);
                } else {
                    cityArrayList.get(k).setChecked(false);
                }
            }

        }
    });
        if (cIndex == i) {

            holder.llCity.setAlpha(1f);
            holder.tvHeaderCityName.setTypeface(Typeface.DEFAULT_BOLD);
        } else {
            holder.llCity.setAlpha(0.5f);
            holder.tvHeaderCityName.setTypeface(Typeface.DEFAULT);

        }



}
  

Я попробовал несколько вещей, но у меня не получилось, поэтому теперь я предоставил общий доступ к запущенному коду в невыбранном состоянии для всех элементов при открытии действия. Что я должен добавить к этому коду первым выбранным элементом?

Ответ №1:

Я создал образец адаптера RecyclerView. Вы можете использовать свой View вместо TextView и setAlpha() вместо SetTextColor(). Вы должны запустить метод checkedItem (int) в вашем фрагменте, затем notifyDataSetChanged или notifyItemChanged()

     /**
    * Created by beyazid on 11.03.2019.
    */
    public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {

    private Context context;
    private LayoutInflater inflater;
    private ArrayList<String> list;
    private int indexOfHighlightedItem = -1;

public MyAdapter(Context context, ArrayList<String> list) {
    inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    this.context = context;
    this.list = list;
}

@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = inflater.inflate(R.layout.my_row_for_recycler_view, parent, false);
    return new MyViewHolder(view);
}

@Override
public void onBindViewHolder(final MyViewHolder holder, final int position) {
    holder.bindItem(position);
    holder.tvDummy.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            indexOfHighlightedItem = position;
            notifyDataSetChanged();
        }
    });
}

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

public void checkedItem(int pos){
    indexOfHighlightedItem = pos;
}
}


public class MyViewHolder extends RecyclerView.ViewHolder {
    TextView tvDummy;
    public MyViewHolder(View itemView) {
        super(itemView);
        tvDummy = itemView.findViewById(R.id.text);
    }
    void bindItem(int pos) {
        String txt = list.get(pos);
        tvDummy.setText(txt);
        if(indexOfColoredItem==pos){
            tvDummy.setTextColor(ContextCompat.getColor(context, R.color.selectedColor));
        } else{
            tvDummy.setTextColor(ContextCompat.getColor(context, R.color.yourDefaulColor));
        }
    }
}

}
  

Вам нужно создать только целое число, чтобы получить выбранную позицию. Нравится
— private int indexOfHighlightedItem = -1;

Комментарии:

1. я могу изменить альфа-значение элемента или цвет с помощью onclick, но я хочу, чтобы первый элемент был выбран или окрашен, или альфа = 1 при запуске действия.

2. Хорошо, вы должны установить индекс 0. Потому что массив начинается с 0. И ваш первый элемент = yourList (0) вот так private int indexOfHighlightedItem = 0;