从RecyclerView中以SharedPreferences保存数据

时间:2018-07-05 22:22:12

标签: android android-recyclerview

我有一个带有预定义收入类别列表的RecyclerView,但用户还可以添加其他类别(通过选择“新建类别”项)。每当用户添加新类别时,我都希望将其保存在RecyclerView中,这样他就不必每次都添加它。

我知道我应该使用SharedPreferences,但是我不知道该在哪个活动中放置它。

这是适配器。

public class CategoryAdapter extends RecyclerView.Adapter<CategoryAdapter.ViewHolder>{
private Context context;
private List<Category> lista;
private LayoutInflater layoutInflater;
private IncomeCategoryActivity activity;

private static final int CATEGORY_REQUEST=6;

public CategoryAdapter(List<Category> lista, Context context, IncomeCategoryActivity activity) {
    this.context = context;
    this.lista = lista;
    this.activity=activity;
    layoutInflater=LayoutInflater.from(context);
}

@Override
public CategoryAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view=layoutInflater.inflate(R.layout.category_layout, parent, false);
    ViewHolder viewHolder=new ViewHolder(view, activity);

    return viewHolder;
}

@Override
public void onBindViewHolder(CategoryAdapter.ViewHolder holder, int position) {
    holder.imageView.setImageURI(lista.get(position).getUri());
    holder.textView.setText(lista.get(position).getCategory());
    holder.imageViewCheck.setVisibility(View.INVISIBLE);
    holder.position = position;
    holder.category=lista.get(position);
}

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

public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
    public ImageView imageView;
    public TextView textView;
    public ImageView imageViewCheck;
    public int position;
    public Category category;
    public IncomeCategoryActivity activity;


    public ViewHolder(View itemView, IncomeCategoryActivity activity) {
        super(itemView);
        this.activity=activity;

        imageView=itemView.findViewById(R.id.customCategoryImageView);
        textView=itemView.findViewById(R.id.customCategoryTextView);
        imageViewCheck=itemView.findViewById(R.id.customCheckImageView);

        itemView.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        String aux=textView.getText().toString();
        if(aux=="CATEGORIE NOUĂ"){
            Intent intent=new Intent(context, CustomIncomeActivity.class);
            activity.startActivityForResult(intent, CATEGORY_REQUEST);
        }
        else{
            imageViewCheck.setVisibility(View.VISIBLE);
            Intent intent=new Intent(context, AddIncomeActivity.class);
            intent.putExtra("categorie_venit", aux);
            activity.setResult(Activity.RESULT_OK, intent);
            activity.finish();
        }

    }

}

}

这是包含RecyclerView的活动。

public class IncomeCategoryActivity extends AppCompatActivity {
private ImageView iv_back;

private RecyclerView recyclerView;
private CategoryAdapter categoryAdapter;
private ArrayList<Category> lista;

private static final int CATEGORY_REQUEST=6;

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

    iv_back=findViewById(R.id.incomeCatBackImageView);

    loadData();
    saveIncomeCategory();
    lista.add(new Category(Uri.parse("android.resource://com.aplicatie_licenta.finalapp/drawable/"+R.drawable.salary),"Salarii"));
    lista.add(new Category(Uri.parse("android.resource://com.aplicatie_licenta.finalapp/drawable/"+R.drawable.allowance), "Îndemnizații"));
    lista.add(new Category(Uri.parse("android.resource://com.aplicatie_licenta.finalapp/drawable/"+R.drawable.pension), "Pensii"));
    lista.add(new Category(Uri.parse("android.resource://com.aplicatie_licenta.finalapp/drawable/"+R.drawable.rent), "Chirii"));
    lista.add(new Category(Uri.parse("android.resource://com.aplicatie_licenta.finalapp/drawable/"+R.drawable.scholarship), "Burse"));
    lista.add(new Category(Uri.parse("android.resource://com.aplicatie_licenta.finalapp/drawable/"+R.drawable.custom), "CATEGORIE NOUĂ"));

    recyclerView=findViewById(R.id.categoryRecyclerView);
    recyclerView.setHasFixedSize(true);
    categoryAdapter=new CategoryAdapter(lista, this, this);
    recyclerView.setLayoutManager(new LinearLayoutManager(this));
    recyclerView.setAdapter(categoryAdapter);

    iv_back.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            finish();
        }
    });

}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if(requestCode==CATEGORY_REQUEST && resultCode==RESULT_OK){
            int pozitie=lista.size()-1;
            Uri uri = data.getParcelableExtra("icon");
            String category=data.getStringExtra("category");
            Category c=new Category(uri, category);
            lista.add(pozitie, c);
            categoryAdapter.notifyItemInserted(pozitie);
    }
}

private void saveIncomeCategory(){
    SharedPreferences sharedPreferences=getSharedPreferences("sharedPrefIncomeCategoryList", Context.MODE_PRIVATE);
    SharedPreferences.Editor editor=sharedPreferences.edit();
    Gson gson=new Gson();
    String json=gson.toJson(lista);
    editor.putString("incomeCategoryList", json);
    editor.apply();
}

private void loadData(){
    SharedPreferences sharedPreferences=getSharedPreferences("sharedPrefIncomeCategoryList", Context.MODE_PRIVATE);
    Gson gson=new Gson();
    String json=sharedPreferences.getString("incomeCategoryList", null);
    Type type=new TypeToken<ArrayList<Category>>() {}.getType();
    lista=gson.fromJson(json, type);

    if(lista==null){
        lista=new ArrayList<>();
    }
}

}

我看了一些教程,并构建了方法loadData()和saveIncomeCategory(),但是当我开始活动时,我的应用程序崩溃了。

1 个答案:

答案 0 :(得分:0)

通常,您希望将适配器的Click侦听器连接到父活动或片段中。在适配器中,您可能还会定义自己的回调。

CategoryAdapter ... {
   private OnCategoryClickedListener //Call this callback when it's clicked

   public interface OnCategoryClickedListener{
       public void onCategoryClicked(Category cat...)

}

这样,您可以将列表添加到另一个屏幕上,但是单击该屏幕时可能需要进行其他交互。

在您的活动中,您将获得代码

YourActivity implements CategoryAdapter.OnCategoryClickedListener {

@Override
public void onCategoryClicked(Category c){
    //This is where your shared preferences would go, save the Category or w/e it is you want
}

您还只需要从适配器设置onCategoryClickedListener即可,可能在创建适配器时通过构造函数进行设置。理想情况下,您希望将显示逻辑与业务逻辑分离。适配器将具有您的显示逻辑,但您的业务逻辑将在其他地方处理