Refresh list and adapter when DB changed in custom Adapter - android-fragments

my project is todo
i have 4 tab , 4 fragment with 4 list(Actionbar navigation contain 4 tab and ViewPager).
4 list(tab) use same db table but each of them retrieve different data with categoryID.
i use a Asynctask for all of them ,to read data and set adapter to list.
public class AsyncTaskDB extends AsyncTask<Void, Void, listAdapter> {
Context act;
int Categoryid;
ArrayList<memo> arraymemo;
listAdapter myadapter;
ListView list;
listAdapter listAdp;
public AsyncTaskDB(Context acti, int categoryID) {
this.act = acti;
this.Categoryid = categoryID;
}
#Override
protected listAdapter doInBackground(Void... params) {
MemoDBHelper helper = new MemoDBHelper(act);
// getAllDataByCategoryID
if (Categoryid != CategoryID.Done_ID)
arraymemo = helper.getAllTaskByCategory(Categoryid);
else
arraymemo = (ArrayList<memo>) helper.gatDoneMemo();
myadapter = new listAdapter(act, arraymemo);
if (myadapter == null) {
Toast.makeText(act, "no data", Toast.LENGTH_SHORT).show();
cancel(true);
}
return myadapter;
}
#Override
protected void onPostExecute(listAdapter result) {
switch (Categoryid) {
case CategoryID.Urgent_Imprtant_ID:
list = (ListView) ((Activity) act)
.findViewById(R.id.Urgent_Important_list);
break;
case CategoryID.Urgent_Less_Imprtant_ID:
list = (ListView) ((Activity) act)
.findViewById(R.id.Urgent_Less_Important_list);
break;
case CategoryID.Less_Urgent_Imprtant_ID:
list = (ListView) ((Activity) act)
.findViewById(R.id.Less_Urgent_Imprtant_list);
break;
case CategoryID.Neither_Urgent_Or_Imprtant_ID:
list = (ListView) ((Activity) act)
.findViewById(R.id.Neither_Urgent_Imprtant_list);
break;
case CategoryID.Done_ID:
list = (ListView) ((Activity) act).findViewById(R.id.ArchiveList);
break;
}
list.setAdapter(result);
this.listAdp = result;
}
public listAdapter getlistAdapter() {
return this.listAdp;
}
}
each memo in list have Done CheckBox.when user check and uncheck it,automatically memo update in db.(in custom adapter)
----------------------------
| -- |
| | | memotitle |
| -- |
----------------------------
public class listAdapter extends BaseAdapter implements OnCheckedChangeListener { Context act;
ArrayList<memo> MemoArray;
SparseBooleanArray mcheck;
int pos;
MemoDBHelper helper;
public listAdapter(Context activity, ArrayList<memo> memoarray) {
this.act = activity;
this.MemoArray = memoarray;
mcheck = new SparseBooleanArray(memoarray.size());
helper = new MemoDBHelper(act);
}
#Override
public int getCount() {
// TODO Auto-generated method stub
return MemoArray.size();
}
#Override
public memo getItem(int position) {
// TODO Auto-generated method stub
return MemoArray.get(position);
}
#Override
public long getItemId(int arg0) {
// TODO Auto-generated method stub
return 0;
}
public class viewHolder {
TextView title;
// TextView description;
CheckBox chkstatus;
}
viewHolder it;
#Override
public View getView(int position, View convertView, ViewGroup parent) {
pos = position;
LayoutInflater in = ((Activity) act).getLayoutInflater();
if (convertView == null) {
convertView = in.inflate(R.layout.list_item, null);
it = new viewHolder();
it.title = (TextView) convertView.findViewById(R.id.txt_list_title);
it.chkstatus = (CheckBox) convertView
.findViewById(R.id.chkStatusid);
convertView.setTag(it);
} else {
it = (viewHolder) convertView.getTag();
}
it.title.setText(MemoArray.get(position).GetTitle());
it.chkstatus.setChecked(MemoArray.get(position).GetSattus());
it.chkstatus.setOnCheckedChangeListener(this);
it.chkstatus.setTag(String.valueOf(MemoArray.get(position).GetID()));
return convertView;
}
#Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
mcheck.put(Integer.valueOf((String) buttonView.getTag()), isChecked);
helper.updateStatusByID(Integer.valueOf((String) buttonView.getTag()),
(isChecked));
helper.close();
//after db updatedt ,call method in fragment to notifydatsetchanged!
UrgentImportant_frg.notifyAdapter();
}
}
adapter must notify data changed ,and list don't show done memo.i don't how to do it !
my first fragment :
public class UrgentImportant_frg extends Fragment {
static listAdapter myadp;
ListView list;
// memo selectedmemo;
long[] checkid;
AsyncTaskDB asyn;
ArrayList<memo> selectedMemoArray;
final static int RQS_MoveTo = 10;
#Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootview = inflater.inflate(R.layout.urgentimportant_layout,
container, false);
return rootview;
}
#Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
list.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
selectedMemoArray = new ArrayList<memo>();
list.setMultiChoiceModeListener(new MultiChoiceModeListener() {
#Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
return true;
}
#Override
public void onDestroyActionMode(ActionMode mode) {
// list.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
}
#Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
mode.getMenuInflater().inflate(R.menu.list_select_menu, menu);
/*
* MenuInflater inflater = getActivity().getMenuInflater();
* inflater.inflate(R.menu.list_select_menu, menu);
*/
mode.setTitle("Select Items");
return true;
}
#Override
public boolean onActionItemClicked(final ActionMode mode,
MenuItem item) {
switch (item.getItemId()) {
case R.id.deletemenu:
final int[] myitemsid = getSelectedID();
final MemoDBHelper helper = new MemoDBHelper(getActivity());
AlertDialog.Builder myAlert = new AlertDialog.Builder(
getActivity());
myAlert.setMessage(
"Are you sure to delete " + myitemsid.length
+ " memo ?")
.setPositiveButton("yes", new OnClickListener() {
#Override
public void onClick(DialogInterface dialog,
int which) {
for (int j = 0; j < myitemsid.length; j++) {
helper.deleteRow(myitemsid[j]);
/*
* if (j == myitemsid.length - 1) {
* strid[j] = String
* .valueOf(myitemsid[j]); } else {
* strid[j] = String
* .valueOf(myitemsid[j]) + ","; }
*/
}
mode.finish();
onResume();
}
}).setNegativeButton("no", new OnClickListener() {
#Override
public void onClick(DialogInterface dialog,
int which) {
mode.finish();
}
});
AlertDialog alert = myAlert.create();
alert.show();
// mode.finish();
break;
case R.id.MoveTomenu:
// myadp.getItem(position);
Intent i = new Intent(getActivity(),
MoveToCategory_act.class);
i.putExtra("categoryid", CategoryID.Urgent_Imprtant_ID);
startActivityForResult(i, RQS_MoveTo);
mode.finish();
break;
}
return true;
}
// get selected id to delete and move category
#Override
public void onItemCheckedStateChanged(ActionMode mode,
int position, long id, boolean checked) {
if (myadp == null) {
myadp = asyn.getlistAdapter();
}
int p = ifMemoSelectedBefore(myadp.getItem(position));
if (p != -1) {
selectedMemoArray.remove(p);
} else if (checked) {
selectedMemoArray.add(myadp.getItem(position));
}
final int checkedCount = list.getCheckedItemCount();
switch (checkedCount) {
case 0:
mode.setSubtitle(null);
break;
case 1:
mode.setSubtitle("One Item Selected");
break;
default:
mode.setSubtitle(checkedCount + " Item Selected");
break;
}
}
});
getActivity().getActionBar().setSubtitle("subtitle");
}
public int ifMemoSelectedBefore(memo m) {
return selectedMemoArray.indexOf(m);
}
#Override
public void onViewCreated(View view, Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onViewCreated(view, savedInstanceState);
list = (ListView) view.findViewById(R.id.Urgent_Important_list);
// -------------click item
list.setOnItemClickListener(new OnItemClickListener() {
#Override
public void onItemClick(AdapterView<?> arg0, View arg1,
int position, long arg3) {
if (myadp == null) {
myadp = asyn.getlistAdapter();
}
// Log.d("tag", myadp.getItem(position).GetTitle() + "");
Intent nextintent = new Intent(getActivity(),
EditMemo_act.class);
memo g = myadp.getItem(position);
/*
* MemoDBHelper helper = new MemoDBHelper(getActivity());
* helper.updateStatusByID(g.GetID(), true);
*/
nextintent.putExtra("editmemo", g);
startActivity(nextintent);
}
});
}
#Override
public void onResume() {
asyn = new AsyncTaskDB(getActivity(), CategoryID.Urgent_Imprtant_ID);
asyn.execute();
super.onResume();
}
public int[] getSelectedID() {
int[] SelectedArray_ID = new int[selectedMemoArray.size()];
for (int j = 0; j < selectedMemoArray.size(); j++) {
SelectedArray_ID[j] = selectedMemoArray.get(j).GetID();
// Log.d("id", selectedMemoArray.get(j).GetID() + "");
}
return SelectedArray_ID;
}
//-------------a method to notifymyadpter
public static void notifyAdapter() {
if (myadp != null) {
myadp.notifyDataSetChanged();
Log.d("notify", "here");
}
}
#Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == RQS_MoveTo) {
if (resultCode == Result.RESULT_OK) {
int id = data.getExtras().getInt("NEWCategoryID");
MemoDBHelper helper = new MemoDBHelper(getActivity());
final int[] myitemsid = getSelectedID();
for (int j = 0; j < myitemsid.length; j++) {
helper.updateCategory(myitemsid[j], id);
}
onResume();
}
}
}
}
is there any method in fragment to run after adapter changed?or in myadapter ,after db updated i call a method in fragment to notify data changed ? i think the second solution isn't right >_<
p.s:notifyAdapter() doesn't work,is it because my adapter fill in asyntask ?

When the adapter changed, try to call below method.
Once you use FragmentPagerAdapter or ListView, when you change the data, you should call this.
notifyDataSetChanged();
read about it : notifyDataSetChanged

Related

In 3 level Nested Expand/ Collapse Vertical(all) Recyclerview data is not updated in inner Recyclerviews after 1st or subsequent time Qrcode scan data

After first qr code scan i make API call and get data. its work fine. But later when i scan other QRcode the data is retrieved but its not shown in inner recyclerview, mean no expand and collapse function works.
after instantiating recyclerview, adapter & layout manager. i scan qrcode and with result i make api call. then observe it and send data for first binding.
Below is Observer.
//ViewModel Observer
private void observeVIewModel() {
qrTrac_viewModel.getQRTrackListLiveData().observe(this, qrTrackingList -> {
if (qrTrac_viewModel.getSerResponseCodeVModel() != null) {
if (qrTrac_viewModel.getSerResponseCodeVModel().equals(Constants.OK)){
if (qrTrackingList != null) {
Util.Logd(qrTrackingList.getLstQRL0().toString());
progressActivity.dismiss();
Util.Logd("qrtrack viewmodel call");
mLstQRL0Adapter.setLstQRL0List((ArrayList<LstQRL0>) qrTrackingList.getLstQRL0(),(ArrayList<LstQRL1Info>) qrTrackingList.getLstQRL1Info(),
(ArrayList<LstQRTrackingSummary>) qrTrackingList.getLstQRTrackingSummary());
}
} else if(qrTrac_viewModel.getSerResponseCodeVModel().equals(Constants.INTERNAL_SERVER_ERROR)){
progressActivity.dismiss();
Util.Loge("in not found");
Snackbar snackbar = Snackbar.make(view, "Internal Server Error", BaseTransientBottomBar.LENGTH_INDEFINITE).setAction(android.R.string.ok, view -> {
});
snackbar.show();
}
else {
progressActivity.dismiss();
Snackbar snackbar = Snackbar.make(view, qrTrac_viewModel.getSerVModelResponseMsg(), BaseTransientBottomBar.LENGTH_INDEFINITE).setAction(android.R.string.ok, v -> {});
snackbar.show();
}
}
else {
progressActivity.dismiss();
Snackbar snackbar = Snackbar.make(view, "Some Unknown Error occured", BaseTransientBottomBar.LENGTH_INDEFINITE).setAction(android.R.string.ok, v -> {});
snackbar.show();
}
});
}
Here is first Adapter.
public class LstQRL0Adapter extends RecyclerView.Adapter<LstQRL0Adapter.LstQRL0ViewHolder> {
private Context context;
private List<LstQRL0> listQRL0 = new ArrayList<>();
private List<LstQRL1Info> listQRl1Info = new ArrayList<>();
private List<LstQRTrackingSummary> listQRTracSumm = new ArrayList<>();
private View view;
private LayoutInflater inflater;
private ArrayList<LstQRL1Info> templistQRl1Info = new ArrayList<>();
private int oldL0ClickPosition = -1;
//lstQRLInfo
private RecyclerView mLstQRL1InfoRecView;
private LstQRL1InfoAdapter mLstQRL1InfoAdapter;
private LinearLayoutManager mLst1Manager;
public LstQRL0Adapter(Context context) {
inflater = LayoutInflater.from(context);
this.context = context;
}
public void setLstQRL0List(ArrayList<LstQRL0> list, ArrayList<LstQRL1Info> listQRl1Info, ArrayList<LstQRTrackingSummary> listQRTracSumm) {
this.listQRL0 = list;
this.listQRl1Info = listQRl1Info;
this.listQRTracSumm = listQRTracSumm;
oldL0ClickPosition = -1 ;
notifyDataSetChanged();
#NonNull
#Override
public LstQRL0Adapter.LstQRL0ViewHolder onCreateViewHolder(#NonNull ViewGroup parent, int viewType) {
view = inflater.inflate(R.layout.lstqrl0_baseview, parent, false);
return new LstQRL0ViewHolder(view);
}
#Override
public void onBindViewHolder(#NonNull LstQRL0Adapter.LstQRL0ViewHolder holder, int position) {
LstQRL0 myL0List = listQRL0.get(position);
holder.mSeason.setText(myL0List.getNvGDSeason());
holder.mStyle.setText(myL0List.getStyleBriefDescr().replace("<br/>", "\n"));
holder.mVendor.setText(myL0List.getNvPartnerVendor());
mLstQRL1InfoAdapter = new LstQRL1InfoAdapter(context);
mLstQRL1InfoRecView.setAdapter(mLstQRL1InfoAdapter);
mLstQRL1InfoRecView.setLayoutManager(new LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false));
templistQRl1Info.clear();
for (int i = 0; i < listQRl1Info.size(); i++) {
if (listQRl1Info.get(position).getId().equals(listQRl1Info.get(i).getId()) && !listQRl1Info.get(i).getId().isEmpty()) {
Util.Logd(listQRl1Info.get(i).getId() + " is l0 adapter");
templistQRl1Info.add(listQRl1Info.get(i));
}
}
Util.Logd(templistQRl1Info.size() +" is temp l0 size");
mLstQRL1InfoAdapter.setLstQRL1infoList(templistQRl1Info, (ArrayList<LstQRTrackingSummary>) listQRTracSumm);
if (listQRL0.get(position).isL0Expanded()) {
holder.mLstQrL0ImageView.setImageResource(R.drawable.ic_arrow_drop_down);
mLstQRL1InfoRecView.setVisibility(View.VISIBLE);
} else {
holder.mLstQrL0ImageView.setImageResource(R.drawable.ic_arrow_right);
mLstQRL1InfoRecView.setVisibility(View.GONE);
}
view.setOnClickListener(view -> {
if (oldL0ClickPosition >= 0){
if (listQRL0.get(oldL0ClickPosition).isL0Expanded()) {
listQRL0.get(oldL0ClickPosition).setL0Expanded(false);
mLstQRL1InfoRecView.setVisibility(View.GONE);
notifyItemChanged(oldL0ClickPosition);
}
}
if (oldL0ClickPosition == holder.getAdapterPosition()){
oldL0ClickPosition = -1 ;
}else {
oldL0ClickPosition = holder.getAdapterPosition() ;
}
Util.Logd("Old clickc is "+oldL0ClickPosition);
if (oldL0ClickPosition >= 0){
new Handler(Looper.myLooper()).postDelayed(() -> {
listQRL0.get(oldL0ClickPosition).setL0Expanded(!listQRL0.get(oldL0ClickPosition).isL0Expanded());
notifyItemChanged(oldL0ClickPosition);
}, 500);
}
});
}
#Override
public int getItemCount() {
return listQRL0.size();
}
public class LstQRL0ViewHolder extends RecyclerView.ViewHolder {
private TextView mSeason, mStyle, mVendor;
private ImageView mLstQrL0ImageView;
public LstQRL0ViewHolder(#NonNull View itemView) {
super(itemView);
Util.Logd("just check is called");
mSeason = itemView.findViewById(R.id.lstqrl0_season);
mStyle = itemView.findViewById(R.id.lstqrl0_style);
mVendor = itemView.findViewById(R.id.lstqrl0_vendor);
mLstQrL0ImageView = itemView.findViewById(R.id.lstqr10_arrow);
mLstQRL1InfoRecView = itemView.findViewById(R.id.lstqrl1info_rv);
}
}
}
Here is Second Adapter
public class LstQRL1InfoAdapter extends RecyclerView.Adapter<LstQRL1InfoAdapter.LstQRL1InfoViewHolder> {
private Context context;
private List<LstQRL1Info> lstQRL1Infos = new ArrayList<>();
private List<LstQRTrackingSummary> listQRTracSumm = new ArrayList<>();
private ArrayList<LstQRTrackingSummary> tempListQRTracSumm = new ArrayList<>();
private View view;
private LayoutInflater inflater;
private int oldL1ClickPosition = 0; // not used in this case
//LstQRTracingSummary
private RecyclerView mQRLTracSummRV;
private LstQRTracSummAdapter mQrTracSummAdapter;
private LinearLayoutManager mQrTrackSummManager;
public LstQRL1InfoAdapter(Context context) {
this.context = context;
inflater = LayoutInflater.from(context);
}
public void setLstQRL1infoList(ArrayList<LstQRL1Info> list, ArrayList<LstQRTrackingSummary> listQRTracSumm) {
this.lstQRL1Infos = list;
this.listQRTracSumm = listQRTracSumm;
notifyDataSetChanged();
}
#NonNull
#Override
public LstQRL1InfoViewHolder onCreateViewHolder(#NonNull ViewGroup parent, int viewType) {
view = inflater.inflate(R.layout.lstqrl1info_baseview, parent, false);
return new LstQRL1InfoViewHolder(view);
}
#Override
public void onBindViewHolder(#NonNull LstQRL1InfoViewHolder holder, int position) {
holder.bind(lstQRL1Infos.get(position),position);
}
#Override
public int getItemCount() {
return lstQRL1Infos.size();
}
public class LstQRL1InfoViewHolder extends RecyclerView.ViewHolder {
private TextView quantity, info, add_info;
private ImageView mlstqrl1info_arrow;
public LstQRL1InfoViewHolder(#NonNull View itemView) {
super(itemView);
quantity = itemView.findViewById(R.id.lstqr1info_quantity);
info = itemView.findViewById(R.id.lstqr1info_info);
add_info = itemView.findViewById(R.id.lstqrl1info_add_info);
mQRLTracSummRV = itemView.findViewById(R.id.lstqrtracsumm_rv);
mlstqrl1info_arrow = itemView.findViewById(R.id.lstqr1info_arrow);
itemView.setOnClickListener(view -> {
if (lstQRL1Infos.get(oldL1ClickPosition).isL1Expanded()) {
Util.Logd("in expanded check");
lstQRL1Infos.get(oldL1ClickPosition).setL1Expanded(false);
mQRLTracSummRV.setVisibility(View.GONE);
notifyItemChanged(oldL1ClickPosition);
}
oldL1ClickPosition = getAdapterPosition() ;
new Handler(Looper.myLooper()).postDelayed(() -> {
}, 500);
lstQRL1Infos.get(getAdapterPosition()).setL1Expanded(!lstQRL1Infos.get(getAdapterPosition()).isL1Expanded());
notifyItemChanged(getAdapterPosition());
});
}
public void bind(LstQRL1Info lstQRL1Info,int position) {
quantity.setText(Math.round(lstQRL1Info.getmQty())+"");
info.setText(lstQRL1Info.getNvGDActivity());
add_info.setText(lstQRL1Info.getNvAdditionalInfo1());
mQrTracSummAdapter = new LstQRTracSummAdapter(context);
mQRLTracSummRV.setAdapter(mQrTracSummAdapter);
mQRLTracSummRV.setLayoutManager(new LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false));
tempListQRTracSumm.clear() ;
for (int i = 0; i < listQRTracSumm.size(); i++) {
if (lstQRL1Info.getId().equals(listQRTracSumm.get(i).getIdQRTrackingList()) && !listQRTracSumm.get(i).getIdQRTrackingList().isEmpty()) {
tempListQRTracSumm.add(listQRTracSumm.get(i));
Util.Logd(listQRTracSumm.get(i).getIdQRTrackingList() + " is info adapter");
}
}
Util.Logd("in view binding and size is " + lstQRL1Infos.size() + " "+ tempListQRTracSumm.size());
mQrTracSummAdapter.setListQRTracSumm(tempListQRTracSumm);
if (lstQRL1Infos.get(position).isL1Expanded()) {
mlstqrl1info_arrow.setImageResource(R.drawable.ic_arrow_drop_down);
mQRLTracSummRV.setVisibility(View.VISIBLE);
} else {
mlstqrl1info_arrow.setImageResource(R.drawable.ic_arrow_right);
mQRLTracSummRV.setVisibility(View.GONE);
}
}
}
}
Third adapter is also same as like second one.
First Adapter is bit different from second and third as am working on it to achieve what is needed.
Probelem : When i scan second and subsequent times then data from api call is received and i think properly set as well but somewhow its not show recyclerview 2 data.(First recyclerview data is shown properly).
Help me whether its different approach or update in same code.
Thanks in Advance.
UPDATE - Above code is correct , the mistake I was doing is -> I was creating RecyclerView adapter instance in advance when Activity runs for 1st time (Which is advance initialization of adapter) and was updating data later when QrCode is scanned and Api call is made .
So now I was creating instance when data is received by observer . as Shown Below
private void observeVIewModel() {
qrTrac_viewModel.getQRTrackListLiveData().observe(this, qrTrackingList -> {
if (qrTrac_viewModel.getSerResponseCodeVModel() != null) {
if (qrTrac_viewModel.getSerResponseCodeVModel().equals(Constants.OK)){
if (qrTrackingList != null) {
Util.Logd(qrTrackingList.getLstQRL0().toString());
progressActivity.dismiss();
Util.Logd("qrtrack viewmodel call");
// result sent to adapters for binding
mLstQRL0Adapter = new LstQRL0Adapter(this,(ArrayList<LstQRL0>) qrTrackingList.getLstQRL0(),(ArrayList<LstQRL1Info>) qrTrackingList.getLstQRL1Info(),
(ArrayList<LstQRTrackingSummary>) qrTrackingList.getLstQRTrackingSummary());
mLst0Manager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
mLst0RecView.setLayoutManager(mLst0Manager);
mLst0RecView.setNestedScrollingEnabled(false);
mLst0RecView.setRecycledViewPool(sharedPool);
mLst0RecView.setAdapter(mLstQRL0Adapter);
mLstQRL0Adapter.notifyDataSetChanged();
}
} else if(qrTrac_viewModel.getSerResponseCodeVModel().equals(Constants.INTERNAL_SERVER_ERROR)){
progressActivity.dismiss();
Util.Loge("in not found");
Snackbar snackbar = Snackbar.make(view, "Internal Server Error", BaseTransientBottomBar.LENGTH_INDEFINITE).setAction(android.R.string.ok, view -> {
});
snackbar.show();
}
else {
progressActivity.dismiss();
Snackbar snackbar = Snackbar.make(view, qrTrac_viewModel.getSerVModelResponseMsg(), BaseTransientBottomBar.LENGTH_INDEFINITE).setAction(android.R.string.ok, v -> {});
snackbar.show();
}
}
else {
progressActivity.dismiss();
Snackbar snackbar = Snackbar.make(view, "Some Unknown Error occured", BaseTransientBottomBar.LENGTH_INDEFINITE).setAction(android.R.string.ok, v -> {});
snackbar.show();
}
});
}
Same way I was doing for further adapters for nested lists to work better .
1st dapter.
public class LstQRL0Adapter extends RecyclerView.Adapter<LstQRL0Adapter.LstQRL0ViewHolder> {
private Context context;
private List<LstQRL0> listQRL0 = new ArrayList<>() ;
private List<LstQRL1Info> listQRl1Info = new ArrayList<>(); ;
private List<LstQRTrackingSummary> listQRTracSumm = new ArrayList<>();
private View view;
private LayoutInflater inflater;
private ArrayList<LstQRL1Info> templistQRl1Info = new ArrayList<>();
private int oldL0ClickPosition = -1;
private Boolean isFromClose = false ;
//lstQRLInfo
private RecyclerView mLstQRL1InfoRecView;
public LstQRL1InfoAdapter mLstQRL1InfoAdapter;
public LstQRL0Adapter(Context context,ArrayList<LstQRL0> list, ArrayList<LstQRL1Info> listQRl1Info, ArrayList<LstQRTrackingSummary> listQRTracSumm) {
inflater = LayoutInflater.from(context);
this.context = context;
this.listQRL0 = list;
this.listQRl1Info = listQRl1Info;
this.listQRTracSumm = listQRTracSumm;
oldL0ClickPosition = -1;
}
#NonNull
#Override
public LstQRL0Adapter.LstQRL0ViewHolder onCreateViewHolder(#NonNull ViewGroup parent, int viewType) {
view = inflater.inflate(R.layout.lstqrl0_baseview, parent, false);
return new LstQRL0ViewHolder(view);
}
#Override
public void onBindViewHolder(#NonNull LstQRL0Adapter.LstQRL0ViewHolder holder, int position) {
LstQRL0 myL0List = listQRL0.get(position);
holder.mSeason.setText(myL0List.getNvGDSeason());
holder.mStyle.setText(myL0List.getStyleBriefDescr().replace("<br/>", "\n"));
holder.mVendor.setText(myL0List.getNvPartnerVendor());
Util.Logd( "temp l0 size is "+templistQRl1Info.size());
if (!isFromClose){
templistQRl1Info.clear();
if (oldL0ClickPosition >=0){
for (int i = 0; i < listQRl1Info.size(); i++) {
if (listQRL0.get(oldL0ClickPosition).getId().equals(listQRl1Info.get(i).getId())) {
Util.Logd( "temp ids are "+listQRl1Info.get(i).getId());
templistQRl1Info.add(listQRl1Info.get(i));
}
}
}
mLstQRL1InfoAdapter = new LstQRL1InfoAdapter(context,templistQRl1Info, (ArrayList<LstQRTrackingSummary>) listQRTracSumm);
mLstQRL1InfoRecView.setLayoutManager(new LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false));
mLstQRL1InfoRecView.setNestedScrollingEnabled(false);
mLstQRL1InfoRecView.setAdapter(mLstQRL1InfoAdapter);
mLstQRL1InfoAdapter.notifyDataSetChanged();
}
boolean isL0Expanded = myL0List.isL0Expanded();
Util.Logd("Expanded status is "+ position + " " + listQRL0.get(position).isL0Expanded());
if (isL0Expanded) {
holder.mLstQrL0ImageView.setImageResource(R.drawable.ic_arrow_drop_down);
holder.hideShowL0Layout.setVisibility(View.VISIBLE);
} else {
holder.mLstQrL0ImageView.setImageResource(R.drawable.ic_arrow_right);
holder.hideShowL0Layout.setVisibility(View.GONE);
}
holder.itemView.setOnClickListener(view -> {
Util.Logd("////////////////////////");
if (oldL0ClickPosition >= 0) {
if (listQRL0.get(oldL0ClickPosition).isL0Expanded()) {
listQRL0.get(oldL0ClickPosition).setL0Expanded(false);
holder.hideShowL0Layout.setVisibility(View.GONE);
Util.Logd("Id to close is "+listQRL0.get(oldL0ClickPosition).getId());
isFromClose = true ;
notifyItemChanged(oldL0ClickPosition);
}
}
if (oldL0ClickPosition == holder.getAdapterPosition()) {
oldL0ClickPosition = -1;
} else {
oldL0ClickPosition = holder.getAdapterPosition();
}
Util.Logd("New click is " + oldL0ClickPosition);
if (oldL0ClickPosition >= 0 && oldL0ClickPosition != -1) {
new Handler(Looper.myLooper()).postDelayed(() -> {
listQRL0.get(oldL0ClickPosition).setL0Expanded(!listQRL0.get(oldL0ClickPosition).isL0Expanded());
Util.Logd("new data modify is "+listQRL0.get(oldL0ClickPosition).getId());
isFromClose = false ;
notifyItemChanged(oldL0ClickPosition);
},500);
}
});
}
#Override
public int getItemCount() {
return listQRL0.size();
}
public class LstQRL0ViewHolder extends RecyclerView.ViewHolder {
private TextView mSeason, mStyle, mVendor;
private ImageView mLstQrL0ImageView;
private LinearLayout hideShowL0Layout;
public LstQRL0ViewHolder(#NonNull View itemView) {
super(itemView);
mSeason = itemView.findViewById(R.id.lstqrl0_season);
mStyle = itemView.findViewById(R.id.lstqrl0_style);
mVendor = itemView.findViewById(R.id.lstqrl0_vendor);
mLstQrL0ImageView = itemView.findViewById(R.id.lstqr10_arrow);
mLstQRL1InfoRecView = itemView.findViewById(R.id.lstqrl1info_rv);
hideShowL0Layout = itemView.findViewById(R.id.hideShowL0Layout);
}
}
}
There is one more nested adapter but thats also same , so am not posting that here.
If need any help then just post comment.

Change button in listview with reference to data

i can speak english just little..
i made listview with sqlite db.
I want to implement this function
ex)
i have sqlite db (with listview. i made already. and listview have button)
rowId 1, 2, 3
number 0, 1, 0
i need like this
if ( number == 0) {
button.backgroundResource(R.drawble.icon1);
} else if ( number == 1) {
button.backgroundResource(R.drawble.icon2);
}
Attached pictures for easier understanding.
enter image description here
and this is my listadapter
public class ListAdapter extends BaseAdapter implements View.OnClickListener {
public interface ListBtnClickListener {
void onListBtnClick(int position, View view);
}
public ListAdapter(Context mContext, ArrayList<SongList> mList, ListBtnClickListener clickListener) {
this.mContext = mContext;
this.mList = mList;
this.listBtnClickListener = clickListener;
layoutInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mSelectedItemsIds = new SparseBooleanArray();
}
#Override
public int getCount() {
return mList.size();
}
#Override
public Object getItem(int position) {
return mList.get(position);
}
#Override
public long getItemId(int position) {
return position;
}
#Override
public View getView(final int position, View convertView, final ViewGroup parent) {
View view = convertView;
if (view == null) {
viewHolder = new ViewHolder();
view = layoutInflater.inflate(R.layout.list_item, null);
viewHolder.relativeLayout = (RelativeLayout) view.findViewById(R.id.listview_item);
view.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) view.getTag();
}
_url = (TextView) view.findViewById(R.id.song_url);
_name = (TextView) view.findViewById(R.id.song_name);
_time = (TextView) view.findViewById(R.id.song_time);
_img = (ImageView) view.findViewById(R.id.song_thumbnail);
favorite = (Button) view.findViewById(R.id.favorite);
Bitmap bitmap = BitmapFactory.decodeByteArray(mList.get(position).get_img(), 0, mList.get(position).get_img().length);
_img.setImageBitmap(bitmap);
final SongList listViewItem = mList.get(position);
if (mList != null) {
_url.setText(listViewItem.get_url());
_name.setText(listViewItem.get_name());
_time.setText(listViewItem.get_time());
}
final SongList songList = mList.get(position);
favorite.setTag(position);
favorite.setOnClickListener(this);
return view;
}
#Override
public void onClick(View view) {
if (this.listBtnClickListener != null) {
this.listBtnClickListener.onListBtnClick((int) view.getTag(), view);
}
}
public class ViewHolder {
private RelativeLayout relativeLayout = null;
}
}
I assume you have some method like SongList.getNumber(). You can change your code in if block like this:
if (mList != null) {
_url.setText(listViewItem.get_url());
_name.setText(listViewItem.get_name());
_time.setText(listViewItem.get_time());
// assuming you have getNumber() method
int number = listViewItem.getNumber();
// checking if number is equal to 0
if(number == 0){
favorite.backgroundResource(R.drawble.icon1);
} else{
favorite.backgroundResource(R.drawble.icon2);
}
}
Edit: If you are storing number variable for only changing the background of button, then you can just use position parameter provided in getView() method. All you have to do is check if position is even or odd and change the background of the button accordingly.

Correcting a null object reference while adding a recyclerview into a fragment

Trying to implement a recycleview inside of a fragment using a custom adapter and receiving the following error.
java.lang.NullPointerException: Attempt to invoke interface method 'int java.util.List.size()' on a null object reference. AtStoreAdapter.getItemCount(StoreAdapter.java:xx)
I have looked around SO, but have not seen anything that is leading to a solution. Any help would be appreciated.
Android app - Attempt to invoke interface method 'int java.util.List.size()' on a null object reference
and a few others
StoreAdapter
public class StoreAdapter extends RecyclerView.Adapter<StoreAdapter.StoreHolder>{
private LayoutInflater mInflator;
private List<Store> mStore= Collections.emptyList();
private Context mContext;
public StoreAdapter(Context mContext, List<Store> mStore){
mInflator = LayoutInflater.from(mContext);
this.mStore = mStore;
this.mContext = mContext;
}
// Simple nested class that holds the various view components for the adapter
// and as specified in *layout.xml .
public class StoreHolder extends RecyclerView.ViewHolder{
TextView mStoreTitle, mStoreDetails, mStoreCategory;
public StoreHolder (View itemView){
super(itemView);
mStoreTitle = (TextView) itemView.findViewById(R.id.title);
mStoreDetails = (TextView) itemView.findViewById(R.id.details);
mStoreCategory = (TextView) itemView.findViewById(R.id.category);
}
}
// Called when the RecyclerView needs a new RecyclerView.ViewHolder (*Holder)
// to represent an item. We inflate the XML layout and return our view (*Holder)
#Override
public StoreHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = mInflator.inflate(R.layout.todo_list_row, parent,false);
return new StoreHolder(view);
}
// Called by RecyclerView to display the data at the specified position.
// This method needs to update the contents of the view to reflect the item at the
// given position e.g. we are updating the view here with the data
#Override
public void onBindViewHolder(StoreAdapter.StoreHolder holder, int position) {
holder.mStoreTitle.setText(mStore.get(position).getStoreTitle());
holder.mStoreDetails.setText(mStore.get(position).getStoreDetails());
holder.mStoreCategory.setText(mStore.get(position).getStoreCategory());
}
public void setData(List<Store> store){
this.mStore = store;
}
public void delete(int position){
mStore.remove(position);
notifyItemRemoved(position);
}
#Override
public int getItemCount() {
return mStore.size();
}
}
StoreSectionLoader
public class StoreSectionLoader extends AsyncTaskLoader<List<Store>> {
private static final String LOG_TAG = StoreSectionLoader.class.getSimpleName();
private List<Store> mStore;
private ContentResolver mContentResolver;
private Cursor mCursor;
public StoreSectionLoader(Context context, Uri uri, ContentResolver contentResolver){
super(context);
mContentResolver = contentResolver;
}
#Override
public List<Store> loadInBackground() {
String[] projection = {BaseColumns._ID,
RetailFinderContract.RetailFinderColumns.STORE_COMPLETE,
RetailFinderContract.RetailFinderColumns.STORE_CREATED,
RetailFinderContract.RetailFinderColumns.STORE_TITLE,
RetailFinderContract.RetailFinderColumns.STORE_DETAILS,
RetailFinderContract.RetailFinderColumns.STORE_CATEGRORY};
List<Store> entry = new ArrayList<>();
Uri uri = RetailFinderContract.URI_LOCATION_TABLE;
mCursor = mContentResolver.query(uri, projection, null, null, null);
if(mCursor != null){
if(mCursor.moveToFirst()){
do {
int _id = mCursor.getInt(mCursor.getColumnIndex(BaseColumns._ID));
String store_title = mCursor.getString(
mCursor.getColumnIndex(RetailFinderContract.RetailFinderColumns.STORE_TITLE));
String store_details = mCursor.getString(
mCursor.getColumnIndex(RetailFinderContract.RetailFinderColumns.STORE_DETAILS));
String store_category = mCursor.getString(
mCursor.getColumnIndex(RetailFinderContract.RetailFinderColumns.STORE_CATEGRORY));
Store store = new Store(_id,store_title,store_details,store_category);
entry.add(store);
} while (mCursor.moveToNext());
}
}
return entry;
}
#Override
public void deliverResult(List<Store> store) {
if(isReset()){
if (mStore != null){
mCursor.close();
}
}
List<Store> oldStoreList = mStore;
if(mStore == null || mStore.size() == 0 ){
Log.d(LOG_TAG, "+++++++++++++++ No Data returned");
}
mStore = store;
if(isStarted()){
super.deliverResult(store);
}
if(oldStoreList != null && oldStoreList != store){
mCursor.close();
}
}
#Override
protected void onStartLoading() {
if(mStore != null){
deliverResult(mStore);
}
if(takeContentChanged() || mStore == null){
forceLoad();
}
}
#Override
protected void onStopLoading() {
cancelLoad();
}
#Override
protected void onReset() {
onStopLoading();
if(mCursor != null){
mCursor.close();
}
mStore = null;
}
#Override
public void onCanceled(List<Store> store) {
super.onCanceled(store);
if(mCursor != null){
mCursor.close();
}
}
#Override
public void forceLoad() {
super.forceLoad();
}
}
StoreFragment
public class StoreFragment extends Fragment implements
LoaderManager.LoaderCallbacks<List<Store>> {
private static final String LOG_TAG = StoreListFragment.class.getSimpleName();
private StoreAdapter mAdapter;
private static final int LOADER_ID = 1;
private ContentResolver mContentReslover;
private List<Store> mStore;
private Context mContext;
protected RecyclerView mRecyclerView;
private static final String TAG = "RecyclerViewFragment";
private static final String KEY_LAYOUT_MANAGER = "layoutManager";
private enum LayoutManagerType {
GRID_LAYOUT_MANAGER,
LINEAR_LAYOUT_MANAGER
}
protected LayoutManagerType mCurrentLayoutManagerType;
protected RecyclerView.LayoutManager mLayoutManager;
// end added
#Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
setHasOptionsMenu(true);
mContentReslover = getActivity().getContentResolver();
getLoaderManager().initLoader(LOADER_ID, null, this);
}
#Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.store_list_row, container, false);
rootView.setTag(TAG);
mRecyclerView = (RecyclerView) rootView.findViewById(R.id.t_recycler);
mLayoutManager = new LinearLayoutManager(getActivity());
mCurrentLayoutManagerType = LayoutManagerType.LINEAR_LAYOUT_MANAGER;
if (savedInstanceState != null) {
// Restore saved layout manager type.
mCurrentLayoutManagerType = (LayoutManagerType) savedInstanceState
.getSerializable(KEY_LAYOUT_MANAGER);
}
setRecyclerViewLayoutManager(mCurrentLayoutManagerType);
mAdapter = StoreAdapter(getContext(), mStore); //issue
mRecyclerView.setAdapter(mAdapter);
return rootView;
}
public void setRecyclerViewLayoutManager(LayoutManagerType layoutManagerType) {
int scrollPosition = 0;
// If a layout manager has already been set, get current scroll position.
if (mRecyclerView.getLayoutManager() != null) {
scrollPosition = ((LinearLayoutManager) mRecyclerView.getLayoutManager())
.findFirstCompletelyVisibleItemPosition();
}
switch (layoutManagerType) {
case LINEAR_LAYOUT_MANAGER:
mLayoutManager = new LinearLayoutManager(getActivity());
mCurrentLayoutManagerType = LayoutManagerType.LINEAR_LAYOUT_MANAGER;
break;
default:
mLayoutManager = new LinearLayoutManager(getActivity());
mCurrentLayoutManagerType = LayoutManagerType.LINEAR_LAYOUT_MANAGER;
}
mRecyclerView.setLayoutManager(mLayoutManager);
mRecyclerView.scrollToPosition(scrollPosition);
}
#Override
public void onSaveInstanceState(Bundle savedInstanceState) {
// Save currently selected layout manager.
savedInstanceState.putSerializable(KEY_LAYOUT_MANAGER, mCurrentLayoutManagerType);
super.onSaveInstanceState(savedInstanceState);
}
#Override
public Loader<List<Store>> onCreateLoader(int id, Bundle args) {
mContentReslover = getActivity().getContentResolver();
return new StoreSectionLoader(getActivity(), RetailFinderContract.URI_STORES_TABLE, mContentReslover);
}
#Override
public void onLoadFinished(Loader<List<Store>> loader, List<Store> store) {
mAdapter.setData(store);
mStore = store;
}
#Override
public void onLoaderReset(Loader<List<Store>> loader) {
mAdapter.setData(null);
}
}

Realm Array of Strings in Android

I have been trying to store an array of strings in Realm database programmatically as given below:
Model Class:
public class Station extends RealmObject {
private String name;
// ... Generated getters and setters ...
}
Saving Data:
realm.executeTransactionAsync(new Realm.Transaction() {
#Override
public void execute(Realm realm) {
Station station1 = realm.createObject(Station.class)
station1.setName(name1);
Station station2 = realm.createObject(Station.class)
station2.setName(name2);
//goes on till station8000
}
}, new Realm.Transaction.OnSuccess() {
#Override
public void onSuccess() {
// ...
});
Is there an alternate best way for this?
Why yes of course there is
public class Station extends RealmObject {
private String name;
// ... Generated getters and setters ...
}
and
// field variable
RealmResults<Station> stations;
// field variable
RealmChangeListener<RealmResults<Station>> changeListener = new RealmChangeListener<RealmResults<Station>>() {
#Override
public void onChange(RealmResults<Station> results) {
// handle onSuccess()
}
}
and
stations = realm.where(Station.class).findAll();
stations.addChangeListener(changeListener);
realm.executeTransactionAsync(new Realm.Transaction() {
#Override
public void execute(Realm realm) {
Station station = new Station();
for(String stationName : listOfStationNames) {
station.setName(stationName);
realm.insert(station);
}
}
});
EDIT: Check out this sexy spinner.
public class DropdownSpinnerAdapter
extends BaseAdapter
implements SpinnerAdapter {
private static final String TAG = "DropdownSpinnerAdapter";
private boolean isItemSelected;
RealmResults<Station> content;
public ResultDropdownSpinnerAdapter(RealmResults<Station> objects) {
this.content = objects;
}
#Override
public int getCount() {
if(content == null || !content.isValid()) {
return 1;
}
return content.size() + 1;
}
#Override
public String getItem(int position) {
if(position <= 0) {
return "";
}
return content.get(position - 1);
}
#Override
public long getItemId(int position) {
return position;
}
public int findPosition(Station selectedItem) {
for(int i = 0, s = content.size(); i < s; i++) {
Station item = content.get(i);
if(item.equals(selectedItem)) {
return i + 1;
}
}
return 0;
}
static class ViewHolder {
TextView textView;
ImageView imageView;
public ViewHolder(View convertView) {
textView = ButterKnife.findById(convertView, R.id.dropdown_textview);
imageView = ButterKnife.findById(convertView, R.id.dropdown_arrow);
}
}
#Override
public View getView(int position, View convertView, ViewGroup parent) {
if(convertView != null) {
if(!(convertView instanceof DropdownHeaderView)) {
convertView = null;
}
}
if(convertView == null) {
convertView = LayoutInflater.from(parent.getContext())
.inflate((isItemSelected) ? R.layout.dropdown_selected : R.layout.dropdown,
parent,
false);
ViewHolder viewHolder = new ViewHolder(convertView);
convertView.setTag(viewHolder);
}
ViewHolder viewHolder = (ViewHolder) convertView.getTag();
viewHolder.textView.setText(getItem(position).getName());
return convertView;
}
public void setItemSelected(boolean selected) {
this.isItemSelected = selected;
}
#Override
public View getDropDownView(int position, View convertView, ViewGroup parent) {
if(convertView != null) {
if(!(convertView instanceof DropdownView)) {
convertView = null;
}
}
if(convertView == null) {
convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.dropdown_noarrow, parent, false);
ViewHolder viewHolder = new ViewHolder(convertView);
convertView.setTag(viewHolder);
}
ViewHolder viewHolder = (ViewHolder) convertView.getTag();
viewHolder.textView.setText(getItem(position).getName());
return convertView;
}
public void updateContent(RealmResults<Station> content) {
this.content = content;
notifyDataSetChanged();
}
}

ListView/adapter throwing IndexOutOfBound

I have a listview with a getCount() of 7. I want all 7 items to be shown regardless if any data from my database is available to populate them. If no data is available then an item should just be blank with predetermined text.
When I have not hardcoded 7 database entries beforehand to go into the 7 views then I get an indexoutofbound exception when running the app due to the 7 items not being able to be populated accordingly. This happens in ListMealsAdapter.java when method Meal currentItem = getItem(position); is called and triggers public Meal getItem(int position).
I am looking for a condition statement that I can use for my listview/adapter that can handle an empty database so that the index does not go out of bounds. Also, is the BaseAdapter suited for what I want to do?
MainActivity.java
public class MainActivity extends BaseActivity {
public static final String TAG = "MainActivity";
private ListView mListviewMeals;
private MealDAO mMealDao;
private List<Meal> mListMeals;
private ListMealsAdapter mAdapter;
private SQLiteDatabase mDatabase;
DatabaseHelper mDbHelper;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
activateToolbar(1);
// initialize views
initViews();
// fill the dailyListView
mMealDao = new MealDAO(this);
mListMeals = mMealDao.getAllMeals();
mAdapter = new ListMealsAdapter(this, mListMeals, MainActivity.this);
mListviewMeals.setAdapter(mAdapter);
}
private void initViews() {
this.mListviewMeals = (ListView) findViewById(R.id.view_daily_list);
}
ListMealsAdapter.java
public class ListMealsAdapter extends BaseAdapter {
public static final String TAG = "ListMealsAdapter";
Activity mActivity;
private List<Meal> mItems;
private LayoutInflater mInflater;
public ListMealsAdapter(Context context, List<Meal> listMeals, Activity activity) {
super();
mActivity = activity;
this.setItems(listMeals);
this.mInflater = LayoutInflater.from(context);
}
#Override
public int getCount() {
return 7;
}
#Override
public Meal getItem(int position) {
return (getItems() != null && !getItems().isEmpty()) ? getItems().get(position) : null;
}
#Override
public long getItemId(int position) {
return (getItems() != null && !getItems().isEmpty()) ? getItems().get(position).getId() : position;
}
#Override
public View getView(int position, final View convertView, final ViewGroup parent) {
View v = convertView;
final ViewHolder holder;
if (v == null) {
v = mInflater.inflate(R.layout.list_item_daily, parent, false);
holder = new ViewHolder();
holder.txtDescription = (TextView) v.findViewById(R.id.txtBreakfast);
v.setTag(holder);
} else {
holder = (ViewHolder) v.getTag();
}
// fill row data
Meal currentItem = getItem(position);
if (currentItem != null) {
holder.txtDescription.setText(currentItem.getDescription());
}
return v;
}
public List<Meal> getItems() {
return mItems;
}
public void setItems(List<Meal> mItems) {
this.mItems = mItems;
}
class ViewHolder {
TextView txtDescription;
}
}
Meal.java
public class Meal implements Serializable {
public static final String TAG = "Meal";
private static final long serialVersionUID = -7406082437623008161L;
private long mId;
private int mType;
private String mDescription;
public Meal() {
}
public Meal(int type, String description) {
this.mType = type;
this.mDescription = description;
}
public long getId() {
return mId;
}
public void setId(long mId) {
this.mId = mId;
}
public int getType() {
return mType;
}
public void setType(int mType) {
this.mType = mType;
}
public String getDescription() {
return mDescription;
}
public void setDescription(String mDescription) {
this.mDescription = mDescription;
}
}
MealDAO.java
public class MealDAO {
public static final String TAG = "MealDAO";
private SQLiteDatabase mDatabase;
private DatabaseHelper mDbHelper;
private Context mContext;
private String[] mAllColumns = { DatabaseHelper.COLUMN_MEAL_ID,
DatabaseHelper.COLUMN_MEAL_TYPE, DatabaseHelper.COLUMN_MEAL_DESCRIPTION};
public MealDAO(Context context) {
this.mContext = context;
mDbHelper = new DatabaseHelper(context);
// open the database
try {
open();
} catch (SQLException e) {
Log.e(TAG, "SQLException on opening database " + e.getMessage());
e.printStackTrace();
}
}
public void open() throws SQLException {
mDatabase = mDbHelper.getWritableDatabase();
}
public void close() {
mDbHelper.close();
}
public List<Meal> getAllMeals() {
List<Meal> listMeals = new ArrayList<Meal>();
Cursor query = mDatabase.rawQuery("SELECT * from meal", null);
if(query.moveToFirst()) {
do {
// Cycle through all records
Meal meal = cursorToMeal(query);
listMeals.add(meal);
} while(query.moveToNext());
}
return listMeals;
}
public Meal getMealById(long id) {
Cursor cursor = mDatabase.query(DatabaseHelper.TABLE_MEALS, mAllColumns,
DatabaseHelper.COLUMN_MEAL_ID + " = ?",
new String[] { String.valueOf(id) }, null, null, null);
if (cursor != null) {
cursor.moveToFirst();
}
Meal meal = cursorToMeal(cursor);
return meal;
}
protected Meal cursorToMeal(Cursor cursor) {
Meal meal = new Meal();
meal.setId(cursor.getLong(0));
meal.setType(cursor.getInt(1));
meal.setDescription(cursor.getString(2));
return meal;
}
}
After a LOT of trial and error I finally found an acceptable solution to my problem. What I did was to add a default row to my database for the view items that I wanted to have a predetermined database entry when no data had been entered beforehand.
I then made sure to start at index 2, making sure that index 1 would be reserved for my default value. If the index comes out of bounds then the exception is caught and the default database entry will be added to the array.
public Meal getItem(int position) {
Meal result;
try {
result = (getItems() != null && !getItems().isEmpty()) ? getItems().get(position) : null;
} catch (Exception e) {
Meal default = getItem(0);
return default;
}
return result;
}
Meal currentItem = getItem(position + 1);
if (currentItem != null) {
holder.txtDescription.setText(currentItem.getDescription());
}
With that change things have been running smooth ever since. I hope this can help someone else as well.

Resources