首页 > 解决方案 > 即使在应用程序关闭后如何保存已在回收器视图中选择的那些项目的状态

问题描述

我想要做的是在回收站视图上显示相同的选定项目,即使活动已关闭,并且只有在我再次单击它时才会更改项目颜色。现在我已经实现了点击更改颜色但状态没有保存?

这是我的适配器:

public class LightsRecyclerViewAdapter extends 
RecyclerView.Adapter<LightsRecyclerViewAdapter.ViewHolder> {
  //  private List<Integer> mViewColors;
    private List<String> mAnimals;
    private LayoutInflater mInflater;
    private ItemClickListener mClickListener;

    // data is passed into the constructor
    LightsRecyclerViewAdapter(Context context,  List<String> 
animals) {
        this.mInflater = LayoutInflater.from(context);

        this.mAnimals = animals;

    }

    // inflates the row layout from xml when needed
    @Override
    @NonNull
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup 
parent, int viewType) {
        View view = mInflater.inflate(R.layout.item, parent, 
false);
        return new ViewHolder(view);
    }

     // binds the data to the view and textview in each row
    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int 
position) {
      //  int color = mViewColors.get(position);
        String animal = mAnimals.get(position);
      //  holder.myView.setBackgroundColor(color);
        holder.myTextView.setText(animal);
    }

    // total number of rows
    @Override
    public int getItemCount() {
        return mAnimals.size();
    }

    // stores and recycles views as they are scrolled off screen
    public class ViewHolder extends RecyclerView.ViewHolder 
implements View.OnClickListener {
        View myView;
        TextView myTextView;

        ViewHolder(View itemView) {
            super(itemView);
           // myView = itemView.findViewById(R.id.colorView);
            myTextView = 
itemView.findViewById(R.id.tvAnimalName);
            itemView.setOnClickListener(this);
        }

        @Override
        public void onClick(View view) {
            if (mClickListener != null) 
mClickListener.onItemClick(view, getAdapterPosition());
        }
    }

    // convenience method for getting data at click position
    public String getItem(int id) {
        return mAnimals.get(id);
    }

    // allows clicks events to be caught
    public void setClickListener(ItemClickListener 
itemClickListener) {
        this.mClickListener = itemClickListener;
    }

    // parent activity will implement this method to respond to click events
    public interface ItemClickListener {
        void onItemClick(View view, int position);
    }
}    

这是我的活动:

public class DevicesList extends AppCompatActivity implements         
LightsRecyclerViewAdapter.ItemClickListener{

    private LightsRecyclerViewAdapter adapter,adapter1;
    TextView title;

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

        title = (TextView)findViewById(R.id.textGrid);

        // data to populate the RecyclerView with
        ArrayList<Integer> viewColors = new ArrayList<>();
        viewColors.add(Color.BLUE);
        viewColors.add(Color.YELLOW);
        viewColors.add(Color.MAGENTA);
        viewColors.add(Color.RED);
        viewColors.add(Color.BLACK);

        ArrayList<String> Lab1LightsList = new ArrayList<>();
        Lab1LightsList.add("Light 1");
        Lab1LightsList.add("Light 2");
        Lab1LightsList.add("Light 3");
        Lab1LightsList.add("Light 4");
        Lab1LightsList.add("Light 5");

        ArrayList<String> Lab1ACList = new ArrayList<>();
        Lab1ACList.add("AC 1");
        Lab1ACList.add("AC 2");
        Lab1ACList.add("AC 3");
        Lab1ACList.add("AC 4");
        Lab1ACList.add("AC 5");

        ArrayList<String> Lab2LightsList = new ArrayList<>();
        Lab2LightsList.add("Light 1");
        Lab2LightsList.add("Light 2");
        Lab2LightsList.add("Light 3");
        Lab2LightsList.add("Light 4");
        Lab2LightsList.add("Light 5");
        Lab2LightsList.add("Light 6");

        ArrayList<String> Lab2ACList = new ArrayList<>();
        Lab2ACList.add("AC 1");
        Lab2ACList.add("AC 2");
        Lab2ACList.add("AC 3");
        Lab2ACList.add("AC 4");


        // set up the RecyclerView
        RecyclerView recyclerView = findViewById(R.id.list1);
        RecyclerView recyclerView1 =findViewById(R.id.list2);
        LinearLayoutManager horizontalLayoutManagaer
            = new LinearLayoutManager(DevicesList.this, LinearLayoutManager.HORIZONTAL, false);
        LinearLayoutManager horizontalLayoutManager
            = new LinearLayoutManager(DevicesList.this, LinearLayoutManager.HORIZONTAL, false);
        recyclerView.setLayoutManager(horizontalLayoutManagaer);
        recyclerView1.setLayoutManager(horizontalLayoutManager);

        Intent mIntent = getIntent();
        int intValue = mIntent.getIntExtra("labno", 0);

        if(intValue==0) {
            adapter = new LightsRecyclerViewAdapter(this, Lab1LightsList);
            adapter1 = new LightsRecyclerViewAdapter(this, Lab1ACList);
            adapter.setClickListener(this);
            adapter1.setClickListener(this);
            recyclerView.setAdapter(adapter);
            recyclerView1.setAdapter(adapter1);
        }

        if(intValue==1) {
            adapter = new LightsRecyclerViewAdapter(this, Lab2LightsList);
            adapter1 = new LightsRecyclerViewAdapter(this, Lab2ACList);
            adapter.setClickListener(this);
            adapter1.setClickListener(this);
            recyclerView.setAdapter(adapter);
            recyclerView1.setAdapter(adapter1);
        }

    }

    @Override
    public void onItemClick(View view, int position) {
        Toast.makeText(this, "You clicked " + 
            adapter.getItem(position) + " on item position " + position, 
            Toast.LENGTH_SHORT).show();
        view.setBackgroundColor(getResources().getColor(R.color.colorPrimaryDark));

    }
}    

请帮助解决这个问题。

标签: javaandroidandroid-recyclerview

解决方案


将这些单击的项目位置保存在 Shareprefence 的哈希图中。假设您在返回活动后关闭活动,只需将保存的列表与您的数据传递到适配器中,并将共享偏好列表与您的数据列表进行比较,如果位置或数据匹配,而不是使 itemview 布局着色。

 // save clicked item is a list and save it sharePreference.
 List<Integer> clikedList = new ArrayList<>();
 if (clicked item){
 ClikedList.add(position)
 }
 String value = gson.toJson(list);
 SharedPreferences prefs = context.getSharedPreferences("mylist", 
 Context.MODE_PRIVATE);
 Editor e = prefs.edit();
 e.putString("list", value);
 e.commit();
 // for getting cliked position list from SharePreference

 SharedPreferences prefs = context.getSharedPreferences("mylist", 
 Context.MODE_PRIVATE);
 String value = prefs.getString("list", null);

 GsonBuilder gsonb = new GsonBuilder();
 Gson gson = gsonb.create();
 MyObject[] list = gson.fromJson(value, MyObject[].class);

 @Override
  public void onBindViewHolder(MyViewHolder holder, int position) {
 // suppose clicked position 4 u get from shaved cliked list
 in here u neddd to retreive cliked list position and clored those item

 int select = 4;
 if (select == position) {
    holder.itemView.setBackgroundColor(Color.BLUE);
    Toast.makeText(context, "" + position, Toast.LENGTH_SHORT).show();
  } else {
    holder.itemView.setBackgroundColor(Color.parseColor("#214F4B"));
    Toast.makeText(context, "" + position, Toast.LENGTH_SHORT).show();
 }
 holder.tv_title.setText(data.get(position));
}

推荐阅读