Android Recyclerview + Activeandroid
Solution 1:
I had used this library once, but with a ListView
. I think this code should work with the RecyclerView
:
/* The database */@Table(name = "Person")publicclassPersonextendsModel {
@Column(name = "Name")public String name;
@Column(name = "Age")publicint age;
}
/* Your MainActivity */
List<Person> list = newArrayList<>();
private RecyclerView rv;
/* Activity onCreate */@OverrideprotectedvoidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity);
list = getList(15);
rv = (RecyclerView) findViewById(R.id.recycler_view);
rv.setLayoutManager(newLinearLayoutManager(this));
rv.setAdapter(newAdapter());
}
private List<Person> getList(int age){
returnnewSelect()
.from(Person.class)
.where("Age = ?", age)
.orderBy(/* order you like */)
.executeSingle();
}
privateclassAdapterextendsRecyclerView.Adapter<Adapter.Holder> {
@Overridepublic Adapter onCreateViewHolder(ViewGroup parent, int viewType) {
// you should inflate the layout you want be laid in every row of the recycler view. Im just inflating a text view for convinencereturnnewHolder(LayoutInflater.from(parent.getContext()).inflate(android.R.layout.simple_list_item_1, parent, false));
}
@OverridepublicvoidonBindViewHolder(Holder holder, int position) {
// assign values to all view in the holder.
holder.tv.setText(list.get(position).name);
}
@OverridepublicintgetItemCount() {
return list.size();
}
publicclassHolderextendsRecyclerView.ViewHolder {
// here you load all the view in your layout
TextView tv;
publicHolder(View itemView) {
super(itemView);
tv = (TextView) itemView;
}
}
}
Here, I am assuming that you've already created and stored values in the database, as the question ask only to populate from the database.
I haven't tested it, but I think it should work.
Solution 2:
A pattern could be used to implement this. Use BroadcastReceiver to notify your activity whenever the are changes to your database (just send an explicit intent to your activity and implement activity.onNewIntent()).
Use LocalBroadcastManager to sendBroadCast to your BroadCastReceiver when you finished add your changes to database. Hope this help.
Solution 3:
I use eventbus to notify my recyclerview's adapter whenever i add data to my database.
MainActivity.java
publicclassMainActivityextendsAppCompatActivityimplementsView.OnClickListener {
privatefinalStringTAG="MainActivity";
private EditText etName, etAge;
private Button btnAdd;
privateEventBusbus= EventBus.getDefault();
@OverrideprotectedvoidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//declare all views
etName = (EditText) findViewById(R.id.et_name);
etAge = (EditText) findViewById(R.id.et_age);
btnAdd = (Button) findViewById(R.id.btn_add);
//add onClickListener to button
btnAdd.setOnClickListener(this);
android.support.v4.app.FragmentTransactiontransaction= getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.frame_layout, ListFragment.newInstance());
transaction.commit();
}
@OverridepublicvoidonClick(View v) {
intid= v.getId();
switch (id) {
case R.id.btn_add:
PersonModelpersonModel=newPersonModel();
if (isEmpty(etName) || isEmpty(etAge)) {
Toast.makeText(this, "Please fill in all details", Toast.LENGTH_LONG).show();
} else {
personModel.name = etName.getText().toString();
personModel.age = etAge.getText().toString();
//Save data to database
personModel.save();
//Broadcast the event to notify fragment
bus.post("NOTIFY");
}
break;
default:
Log.e(TAG, "Invalid view ID");
break;
}
}
//Check edit text whether is empty or notprivatebooleanisEmpty(EditText etText) {
return etText.getText().toString().trim().length() == 0;
}
}
PersonModel.java
@Table(name = "PersonModel")publicclassPersonModelextendsModel{
@Column(name = "NAME")public String name;
@Column(name = "AGE")public String age;
}
PersonAdapter.java
publicclassPersonAdapterextendsRecyclerView.Adapter<PersonAdapter.MyViewHolder> {
private Context mContext;
private List<PersonModel> models;
publicPersonAdapter(Context context, List<PersonModel> models) {
this.mContext = context;
this.models = models;
}
publicclassMyViewHolderextendsRecyclerView.ViewHolder {
public TextView name, age;
publicMyViewHolder(View itemView) {
super(itemView);
name = (TextView) itemView.findViewById(R.id.name);
age = (TextView) itemView.findViewById(R.id.age);
}
}
@Overridepublic MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
ViewitemView= LayoutInflater.from(mContext).inflate(R.layout.person_cell, parent, false);
returnnewMyViewHolder(itemView);
}
@OverridepublicvoidonBindViewHolder(MyViewHolder holder, int position) {
PersonModelpersonModel= models.get(position);
holder.name.setText(personModel.name);
holder.age.setText(personModel.age);
}
@OverridepublicintgetItemCount() {
return models.size();
}
}
ListFragment.java
publicclassListFragmentextendsFragment {
privatefinalStringTAG="ListFragment";
privateEventBusbus= EventBus.getDefault();
private List<PersonModel> models = newArrayList<PersonModel>();
private Context mContext;
private RecyclerView recyclerView;
private PersonAdapter personAdapter;
publicstatic ListFragment newInstance() {
// Required empty public constructorListFragmentlistFragment=newListFragment();
return listFragment;
}
@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragmentViewrootView= inflater.inflate(R.layout.fragment_list, container, false);
bus.register(this);
recyclerView = (RecyclerView) rootView.findViewById(R.id.list_rv);
//Load and add all data from database to array list
models = getAll();
personAdapter = newPersonAdapter(mContext, models);
RecyclerView.LayoutManagermLayoutManager=newLinearLayoutManager(mContext);
recyclerView.setLayoutManager(mLayoutManager);
recyclerView.setItemAnimator(newDefaultItemAnimator());
recyclerView.setAdapter(personAdapter);
personAdapter.notifyDataSetChanged();
return rootView;
}
//Load all data from databaseprivate List<PersonModel> getAll() {
returnnewSelect()
.all()
.from(PersonModel.class)
.orderBy("NAME ASC")
.execute();
}
//Load the last data added to databaseprivate List<PersonModel> getLast() {
returnnewSelect()
.all()
.from(PersonModel.class)
.orderBy("NAME DESC")
.limit(1)
.execute();
}
//Subscribe to event bus//Receive notification/event from MainActivity when added a data to database@Subscribe(threadMode = ThreadMode.MAIN)publicvoidonEventMainThread(String STATUS) {
switch (STATUS) {
case"NOTIFY":
//Add last added item to current array list
models.add(getLast().get(0));
//refresh recyclerView's adapter
personAdapter.notifyDataSetChanged();
break;
default:
Log.e(TAG, "Invalid STATUS");
}
}
@OverridepublicvoidonAttach(Context context) {
super.onAttach(context);
this.mContext = context;
}
}
Post a Comment for "Android Recyclerview + Activeandroid"