Reputation: 205
I have problem with my navigation drawer. When user click one button, I want to change icon of element that user clicked. Can anybody help me. Here is my navigation list adapter
public class NavigationListAdapter extends ArrayAdapter<NavDrawerItem>{
private LayoutInflater inflater;
private NavMenuPitanjaHolder navMenuPitanjaHolder;
public NavigationListAdapter(Context context, int textViewResourceId,
ArrayList<NavDrawerItem> objects) {
super(context, textViewResourceId, objects);
this.inflater = LayoutInflater.from(context);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = null;
NavDrawerItem menuItem = this.getItem(position);
if (menuItem.getType() == NavigationItem.ITEM_TYPE) {
view = getItemView(position, convertView, parent, menuItem);
}
else if (menuItem.getType() == NavigationPitanja.PITANJA_TYPE){
view = getPitanjaView(position, convertView, parent, menuItem);
}
else {
view = getSectionView(position, convertView, parent, menuItem);
}
return view;
}
public View getItemView(int position, View convertView, ViewGroup parentView,
NavDrawerItem navDrawerItem) {
NavigationItem menuItem = (NavigationItem) navDrawerItem;
NavMenuItemHolder navMenuItemHolder = null;
if (convertView == null) {
convertView = inflater.inflate(R.layout.drawer_list_item, parentView,
false);
TextView labelView = (TextView) convertView
.findViewById(R.id.navmenuitem_label);
ImageView i = (ImageView) convertView
.findViewById(R.id.navmenuitem_icon);
navMenuItemHolder = new NavMenuItemHolder();
navMenuItemHolder.labelView = labelView;
navMenuItemHolder.image = i;
convertView.setTag(navMenuItemHolder);
}
if (navMenuItemHolder == null) {
navMenuItemHolder = (NavMenuItemHolder) convertView.getTag();
}
navMenuItemHolder.labelView.setText(menuItem.getLabel().toString());
navMenuItemHolder.image.setImageResource(menuItem.getIcon());
return convertView;
}
public View getSectionView(int position, View convertView, ViewGroup parentView,
NavDrawerItem navDrawerItem) {
NavigationSection menuSection = (NavigationSection) navDrawerItem;
NavMenuSectionHolder navMenuItemHolder = null;
if (convertView == null) {
convertView = inflater.inflate(R.layout.darwer_list_section,
parentView, false);
TextView labelView = (TextView) convertView
.findViewById(R.id.navmenusection_label);
navMenuItemHolder = new NavMenuSectionHolder();
navMenuItemHolder.labelView = labelView;
convertView.setTag(navMenuItemHolder);
}
if (navMenuItemHolder == null) {
navMenuItemHolder = (NavMenuSectionHolder) convertView.getTag();
}
navMenuItemHolder.labelView.setText(menuSection.getLabel().toString());
return convertView;
}
public View getPitanjaView(int position, View convertView, ViewGroup parentView, NavDrawerItem navDrawerItem){
NavigationPitanja pitanjaSection = (NavigationPitanja) navDrawerItem;
navMenuPitanjaHolder = null;
if (convertView == null){
convertView = inflater.inflate(R.layout.drawer_list_pitanja, parentView, false);
TextView naslovView = (TextView) convertView.findViewById(R.id.naslovPitanja);
TextView textView = (TextView) convertView.findViewById(R.id.textPitanja);
ImageView i = (ImageView) convertView.findViewById(R.id.tocno_netocno_imageView);
navMenuPitanjaHolder = new NavMenuPitanjaHolder();
navMenuPitanjaHolder.naslovPitanja = naslovView;
navMenuPitanjaHolder.textPitanja = textView;
navMenuPitanjaHolder.image = i;
convertView.setTag(navMenuPitanjaHolder);
}
if (navMenuPitanjaHolder == null) {
navMenuPitanjaHolder = (NavMenuPitanjaHolder) convertView.getTag();
}
navMenuPitanjaHolder.naslovPitanja.setText(pitanjaSection.getNaslov().toString());
if (pitanjaSection.getText().toString().length() < 20)
navMenuPitanjaHolder.textPitanja.setText(pitanjaSection.getText().toString());
else
navMenuPitanjaHolder.textPitanja.setText(pitanjaSection.getText().substring(0, 20).toString() + "...");
return convertView;
}
public void iconized(Pitanja item, int id){
if (item.getIdPitanja() == id){
navMenuPitanjaHolder.image.setImageResource(R.drawable.correct);
}
}
@Override
public int getViewTypeCount() {
return 3;
}
@Override
public int getItemViewType(int position) {
return this.getItem(position).getType();
}
@Override
public boolean isEnabled(int position) {
return getItem(position).isEnabled();
}
private static class NavMenuItemHolder {
private TextView labelView;
private ImageView image;
}
private static class NavMenuSectionHolder {
private TextView labelView;
}
private static class NavMenuPitanjaHolder {
private TextView naslovPitanja, textPitanja;
private ImageView image;
}
}
and here is my main activity
@SuppressLint("UseSparseArrays")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
previous.setOnClickListener(this);
informacije.setOnClickListener(this);
odgovori.setOnClickListener(this);
next.setOnClickListener(this);
//uputa = (RelativeLayout) findViewById(R.id.relativeLayoutUputa1);
getAllImages = db.getAllPitanjaImages();
odgBrojPitanja = new HashMap<Integer, List<Integer>>();
updateDisplay(broj);
}
@Override
protected void onNavItemSelected(int id) {
if ( id > 200){
Toast.makeText(getApplicationContext(), "kliknuo si na pitanje" + id + " toliki je id", Toast.LENGTH_SHORT).show();
updateDisplay(id-200-1);
} else {
Toast.makeText(getApplicationContext(), "kliknuo si na izbornik" + id, Toast.LENGTH_SHORT).show();
}
}
@Override
protected NavDrawerActivityConfiguration getNavDrawerConfiguration() {
intent = getIntent();
getAllPitanja = db
.getAllPitanja(intent.getStringExtra("id_kategorije"));
m = new ArrayList<NavDrawerItem>();
m.add(NavigationItem.create(100, "Profil", R.drawable.ikona_profil_bez_okvira_01_01, this));
m.add(NavigationItem.create(200, "Teme", R.drawable.ikona_kategorije_bez_okvira_01_01,this));
m.add(NavigationItem.create(300, "Ispiti", R.drawable.ikona_ispit_bez_okvira_01, this));
m.add(NavigationItem.create(400, "Znakovi", R.drawable.ikona_znakovi_bez_okvira_01, this));
m.add(new NavigationSection(200, "PITANJA"));
for (int i=0;i<getAllPitanja.size();i++){
m.add(NavigationPitanja.create((200+i+1), "Pitanje " + (i+1), getAllPitanja.get(i).getTextPitanja(), this));
}
NavDrawerActivityConfiguration navDrawerActivityCOnfiguration = new NavDrawerActivityConfiguration();
navDrawerActivityCOnfiguration.setLayout(R.layout.activity_pitanje);
navDrawerActivityCOnfiguration.setDrawerLayoutId(R.id.drawer_layout_pitanja);
navDrawerActivityCOnfiguration.setLeftDrawer(R.id.listaDesnoPitanja);
navDrawerActivityCOnfiguration.setNavigationItem(m);
adapte = new NavigationListAdapter(this, R.layout.drawer_list_item, m);
navDrawerActivityCOnfiguration.setBaseAdapter(adapte);
return navDrawerActivityCOnfiguration;
}
@SuppressLint("SdCardPath")
public void updateDisplay(int z) {
odgovorList = db.getAllOdgovore(Integer.toString(getAllPitanja.get(z)
.getIdPitanja()));
adapter = new PitanjaAdapter(this,
R.layout.pitanja_entry, odgovorList);
listView = (ListView) findViewById(R.id.listView);
listView.setAdapter(adapter);
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.previousButton:
broj--;
if (broj < 0) {
broj = getAllPitanja.size() - 1;
}
updateDisplay(broj);
break;
case R.id.odgovoriButton:
postaviPitanje(broj);
break;
case R.id.nextButton:
broj++;
if (broj > (getAllPitanja.size() - 1)) {
broj = 0;
}
updateDisplay(broj);
break;
}
}
private void postaviPitanje(int z) {
for (int i = 0; i < odgovorList.size(); i++) {
Odgovor odgovor = odgovorList.get(i);
if (Integer.parseInt(odgovor.getIs_correct()) == 0
&& odgovor.isSelected()
|| Integer.parseInt(odgovor.getIs_correct()) == 1
&& !odgovor.isSelected()) {
tocno = false;
}
}
if (tocno){
getAllPitanja.get(z).setTocno(true);
Toast.makeText(getApplicationContext(), "Tocno ste odgovorili na pitanje cij je id " + getAllPitanja.get(z).getIdPitanja() + 200, Toast.LENGTH_SHORT).show();
Log.i("Sljedeci mjenjeam", String.valueOf(200+getAllPitanja.get(z).getIdPitanja()));
adapte.iconized(getAllPitanja.get(z), getAllPitanja.get(z).getIdPitanja());
Log.i("Sljedeci item sam iconizirao", getAllPitanja.get(z).getTextPitanja());
}
else {
getAllPitanja.get(z).setNetocno(true);
Toast.makeText(getApplicationContext(), "Niste tocno odgovorili", Toast.LENGTH_SHORT).show();
}
}
}
Anybody know's why my public method in adapter changle every seventh picture in drawer layout. If I have 37 items. every seven items icon is changed. Anybody have solutions. Can you help me please.
Upvotes: 0
Views: 164
Reputation: 3760
The problem is that you are using a single instance of navMenuPitanjaHolder
in your adapter, which is generally a bad practice. The idea of the ViewHolder pattern you're trying to implement is to have an instance of the ViewHolder class (in your case NavMenuPitanjaHolder
) for every distinct convertView, but you're NOT doing so in getPitanjaView()
.
Once you set the image via iconized()
you're setting an image for the navMenuPitanjaHolder
, so all views that use it will get the image. It's every X item, because Android is trying to reuse views as much as possible. In short - this method is conceptually wrong and you should remove it.
A better approach would be to add a variable in your NavigationPitanja
class, which will hold info if the answer is right or wrong. Then in getPitanjaView()
you'll have something like:
if (pitanjaSection.isAnswerCorrect()) {
navMenuPitanjaHolder.image.setImageDrawable(R.drawable.correct);
} else {
navMenuPitanjaHolder.image.setImageDrawable(R.drawable.false);
}
Hope this points you in the right direction for solving your problem!
Upvotes: 1