marko kurt
marko kurt

Reputation: 205

my navigation drawer doesn't react correctly

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

Answers (1)

Vesko
Vesko

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

Related Questions