即使关闭应用程序,如何保存在收藏夹视图中已选择的那些项目的状态

时间:2018-07-23 15:10:29

标签: java android android-recyclerview

我想做的是即使在活动已关闭之后,也可以在回收者视图中显示相同的选定项目,并且仅当我再次单击它时才更改项目的颜色。现在,我已经实现了点击颜色的更改,但是状态无法保存?

这是我的适配器:

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));

    }
}    

请对此提供帮助。

3 个答案:

答案 0 :(得分:0)

创建一个选定的项目位置列表,并在应用程序进入后台或关闭状态时将其存储在首选项中。启动应用程序时加载该列表,并在适配器的onBindViewHolder's position参数中对该列表进行比较,并根据比较将其标记为选中/未选中。

答案 1 :(得分:0)

根据我对您的问题的理解,即使关闭应用程序后,您仍要保存所选项目的状态,然后要在再次启动应用程序时重新加载它。您需要参考此链接Android Save Data

对于上述解决方案,可以有多种保存状态的方法,以下是我提到的几种方法:

  1. 使用 SQLite数据库保存所选项目。然后,无论何时加载该应用程序,都要从数据库中获取所有选定的数据,然后使用列表上所需的任何颜色将其标记为选定。
  2. 您还可以使用共享的首选项来存储选择。而且,与上述相同,您可以在应用启动时重新加载数据。
  3. 您还可以将数据以特定格式(例如CSV,JSON,XML等)存储在文件中,然后将其保存在设备的内部存储或外部存储中。启动应用程序后,从文件中获取所有选定的值并进行相应处理。
  4. 您还可以使用网络服务器,Firebase存储或其他云存储服务来保存数据,然后在新应用启动时获取数据。

请注意:所有这些技术都要求您在关闭应用程序之前保存状态。因此,最好是通过单击项目或活动的onPause方法来存储状态。

如果您在使用这些解决方案时遇到任何问题,可以发表另一条评论,我会看一下。

答案 2 :(得分:0)

将这些单击的项目位置保存在Shareprefence的哈希图中。假设您返回活动后关闭活动,只需在适配器中传递带有ur数据的保存列表,并比较位置或数据匹配的共享列表和ur数据列表,而不会使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));
}