首页 > 解决方案 > 如何确认recyclerview项目列表中的选定项目并在布局上进行选择

问题描述

我正在使用 recyclerview 网格布局管理器准备 textview 座位号列表。我可以用红色选择recyclerview列表中的多个项目。现在我想在单击确认座位按钮时将此座位项目保持为红色。当我重新打开 recyclerview 列表时,它应该显示座位选择的红色和正常颜色的其他座位项目。 确认座位按钮单击确认座位按钮单击 选择适配器

    '''


     public class SelectionAdapter extends RecyclerView.Adapter<SelectionAdapter.MygridViewHolder> {

            private Context applicationContext;
            private ArrayList<Seatnos> list, selected;

            public SelectionAdapter(Context applicationContext, ArrayList<Seatnos> list) {
                this.applicationContext = applicationContext;
                this.list = list;
                this.selected = new ArrayList<>();
            }


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

    @Override
    public void onBindViewHolder(@NonNull final MygridViewHolder holder, final int position) {
         final Seatnos seatnos = list.get(position);

          holder.textView.setText(String.valueOf(position));
           holder.textView.setText(seatnos.getTextno());



        holder.textView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (selected.contains(seatnos)) {
                    selected.remove(seatnos);
                    unhighlightView(holder);
                } else {
                    selected.add(seatnos);
                    highlightView(holder);
                }
            }
        });


        if (selected.contains(seatnos))
            highlightView(holder);
        else
            unhighlightView(holder);
    }




    private void highlightView(MygridViewHolder holder) {
        holder.itemView.setBackgroundColor(ContextCompat.getColor(applicationContext, R.color.red));
    }

    private void unhighlightView(MygridViewHolder holder) {
        holder.itemView.setBackgroundColor(ContextCompat.getColor(applicationContext, android.R.color.transparent));
    }


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

    class  MygridViewHolder extends RecyclerView.ViewHolder {
        TextView textView;


        MygridViewHolder(@NonNull View itemView) {
            super(itemView);


            textView = (TextView) itemView.findViewById(R.id.textViewsA);

        }
    }



        public void addAll(ArrayList<Seatnos> list) {
            clearAll(false);
            this.list = list;
            notifyDataSetChanged();

        }

        public void clearAll(boolean isNotify) {
            list.clear();
            selected.clear();
            if (isNotify) notifyDataSetChanged();
        }

        public void clearSelected() {
            selected.clear();
            notifyDataSetChanged();
        }

        public void selectAll() {

            selected.clear();
            selected.addAll(list);
            notifyDataSetChanged();
        }

        public ArrayList<Seatnos> getSelected() {

            return selected;

    }
}
'''

座位选择活动.java

'''   
public class SeatSelectionActivity extends AppCompatActivity {

    RecyclerView recyclerView;
    Activity activity = SeatSelectionActivity.this;
    Button btnGetSelected,btnreset;
    FirebaseDatabase database;
    DatabaseReference ref;
    SelectionAdapter selectionAdapter;
    ArrayList<Seatnos> list;
    Update update;
    ChildEventListener mChildListner;
    ValueEventListener mValueEventListner;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_seat_selection);

       btnGetSelected = (Button) findViewById(R.id.btconfirm);

        recyclerView=(RecyclerView) findViewById(R.id.viewseat);

        list = new ArrayList<>();

        String uid = getIntent().getStringExtra(UpdateAdapter.USER_KEY);

        DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference("updates").child(uid);



        selectionAdapter=new SelectionAdapter(this, list);
        RecyclerView.LayoutManager layoutManager=new GridLayoutManager(this,4);
        recyclerView.setLayoutManager(layoutManager);
        recyclerView.setItemAnimator(new DefaultItemAnimator());


        mValueEventListner = new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                Update update =dataSnapshot.getValue(Update.class);

                update.setUid(dataSnapshot.getKey());
                int seat= Integer.parseInt(update.getSeat());
                ArrayList<String> array = new ArrayList<String>(seat);

                for(long i=0; i<seat; i++) {
                    array.add(String.valueOf(i));
                    Seatnos seatnos = new Seatnos();
                    seatnos.setTextno(""+(i+1));
                    if(i==0){
                        seatnos.setChecked(true);
                    }



                    list.add(seatnos);
                }


                recyclerView.setAdapter(selectionAdapter);

            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        };
        databaseReference.addValueEventListener(mValueEventListner);



    }





    public void reset(View view) {

    }

   public void bookconfirm(View view) {


       if (selectionAdapter.getSelected().size() > 0) {
           //ArrayList<Integer> mlist = new ArrayList<>();
           StringBuilder stringBuilder = new StringBuilder();
           for (int i = 0; i < selectionAdapter.getSelected().size(); i++) {

               stringBuilder.append(selectionAdapter.getSelected().get(i).getTextno());




              stringBuilder.append("\n");

           }


           Toast.makeText(activity, String.format("Selected %d items", selectionAdapter.getSelected().size()), Toast.LENGTH_SHORT).show();


           showToast(stringBuilder.toString().trim());

       } else {
           showToast("No Selection");
       }




   };

    public void selectAll(View v) {
        selectionAdapter.selectAll();
    }

    public void deselectAll(View v) {
        selectionAdapter.clearSelected();
    }

    public void doAction(View v) {
        Toast.makeText(activity, String.format("Selected %d items", selectionAdapter.getSelected().size()), Toast.LENGTH_SHORT).show();
    }


private void showToast(String msg) {
        Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
        }
        }
'''

模型类

'''

public class Seatnos implements Serializable {
    String textno;
    String sid;

     private boolean isChecked = false;

    public Seatnos() {

    }

    public boolean isChecked() {
            return isChecked;
        }

        public void setChecked(boolean checked) {
            isChecked = checked;
        }

    public String getSid() {
        return sid;
    }

    public void setSid(String sid) {
        this.sid = sid;
    }

    public Seatnos(String textno) {
        this.textno = textno;
    }

    public String getTextno() {
        return textno;
    }

    public void setTextno(String textno) {
        this.textno = textno;
    }
}
'''

标签: android-recyclerview

解决方案


您将用于shared preferences保存所选项目的状态:

这样做onBindViewHolder

@Override
public void onBindViewHolder(@NonNull final MygridViewHolder holder, final int position) {
final Seatnos seatnos = list.get(position);

holder.textView.setText(String.valueOf(position));
holder.textView.setText(seatnos.getTextno());


//read from preferences

SharedPreferences pref = getSharedPreferences("item", MODE_PRIVATE); 
String state = pref.getString(String.valueOf(position)+"state", "default");

if(state.equals("selected")){

//selected
highlightView(holder);

}else{
//not selected
unhighlightView(holder);
}


//on click

holder.textView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (selected.contains(seatnos)) {
selected.remove(seatnos);
unhighlightView(holder);

//save state
SharedPreferences.Editor editor = getSharedPreferences("item", MODE_PRIVATE).edit();
editor.putString(String.valueOf(position)+"state", "not_selected");
editor.apply();

} else {

selected.add(seatnos);
highlightView(holder);

//save state
SharedPreferences.Editor editor = getSharedPreferences("item", MODE_PRIVATE).edit();
editor.putString(String.valueOf(position)+"state", "selected");
editor.apply();


}
}
});

......................
......................
......................


}

更新:

是的,您应该使用传递给适配器的上下文来访问共享优先级:

这:

getSharedPreferences("item", MODE_PRIVATE);

变成:

applicationContext.getSharedPreferences("item", MODE_PRIVATE);

这:

getSharedPreferences("item", MODE_PRIVATE).edit();

变成:

applicationContext.getSharedPreferences("item", MODE_PRIVATE).edit();

推荐阅读