【问题标题】:Icons in Listview with custom adapter dont change when an option is selected选择选项时,带有自定义适配器的 Listview 中的图标不会更改
【发布时间】:2017-06-11 01:50:47
【问题描述】:

我制作了一个自定义适配器,它在 Listview 中显示对象,并为列表中的每个项目显示一个图标。列表视图中的项目旁边显示了 3 个图标。用户可以选择选项“Kupljeno”,将对象的状态更改为 1,选项“Nije kupljeno”更改为 0,“Nije dostupno”更改为 2。每个数字代表一个不同的图标,您可以在 Adapter 类的 getView() 函数中使用。适配器类如下所示:

public class ListaAdapter extends ArrayAdapter<Proizvod> {

public ListaAdapter(Context context, ArrayList<Proizvod> proizvodi) {
    super(context, 0, proizvodi);
}

public void remove(int position) {
    this.remove(getItem(position));
}


public View getView(int position, View convertView, ViewGroup parent) {
    Proizvod proizvod = getItem(position);

    if(convertView==null) {
        convertView = LayoutInflater.from(getContext()).inflate(R.layout.shoppinglista_prikazproizvoda,parent,false);

        TextView t = (TextView)convertView.findViewById(R.id.text1);
        t.setText(proizvod.toString());

        switch(proizvod.getStatus())
        {
            case 0:
                t.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.mipmap.ic_nijekupljeno, 0);
                break;
            case 1:
                t.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.mipmap.ic_kupljeno, 0);
                break;
            case 2:
                t.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.mipmap.ic_nedostupno, 0);
                break;
        }
    }
    return convertView;
}

}

您可以看到我在getView() 中设置了每个项目的图标。

用户应该能够使用上下文菜单更改每个 Proizvod 对象的状态,当用户选择对象状态时,列表应该更新并显示适当的图标。

我的 Proizvod 课程是这样的:

public class Proizvod {

private int id;
private String naziv;
private int kolicina=1;
private double cijena;
private String lista;
public int status=0;    //0 - nije kupljeno, 1 - kupljeno, 2 - nedostupno

public Proizvod() {
}

public Proizvod(int id, String naziv, int kolicina, double cijena, String lista, int status) {
    this.id = id;
    this.naziv = naziv;
    this.kolicina = kolicina;
    this.cijena = cijena;
    this.status = status;
}

public String getNaziv() {
    return naziv;
}

public void setNaziv(String naziv) {
    this.naziv = naziv;
}

public int getKolicina() {
    return kolicina;
}

public void setKolicina(int kolicina) {
    this.kolicina = kolicina;
}

public double getCijena() { return cijena; }

public void setCijena(double cijena) {
    this.cijena = cijena;
}

public int getId() {
    return id;
}

public void setId(int id) {
    this.id = id;
}

public String getLista() { return lista; }

public void setLista(String lista) { this.lista = lista; }

public int getStatus() { return status; }

public void setStatus(int status) { this.status = status; }

@Override
public String toString() {
    if(this.kolicina==1) {
        return this.naziv + " ["+ this.kolicina +" komad, ukupno " + this.cijena + " kn ]";
    }
    else {
        return this.naziv + " ["+ this.kolicina +" komada, ukupno " + this.cijena + " kn ]";
    }
}

}

上下文菜单和更改图标(活动)的代码:

public class KreiranjeListeActivity extends AppCompatActivity {

ArrayList<Proizvod> ShoppingLista = new ArrayList<Proizvod>();

EditText nazivProizvoda;
EditText kolicina;
EditText cijena;
Button dodaj;
Button ocisti;
Button spremi;

ListView lista;
ListaAdapter adapter;

//Funkcija vraća ukupan iznos svih stavki u listi
public void AzurirajUkupniTrosak() {

    DecimalFormat zaokruzi=new DecimalFormat("0.00");
    double ukupniIznos=0;

    for(Proizvod p : ShoppingLista)
    {
        ukupniIznos+=p.getCijena();
    }

    String ukupniIznosString=zaokruzi.format(ukupniIznos);
    TextView prikazUkupnogIznosa=(TextView)findViewById(R.id.textView_ukupaniznos);
    prikazUkupnogIznosa.setText("Ukupno: " + ukupniIznosString + " kn");
}

//Funkcija otvara meni dužim pritiskom na stavku u listi i nudi opciju brisanja stavke
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
    if (v.getId() == R.id.shoppinglista2_list) {
        ListView lv = (ListView) v;
        AdapterView.AdapterContextMenuInfo acmi = (AdapterView.AdapterContextMenuInfo) menuInfo;
        Proizvod proizvod = (Proizvod) lv.getItemAtPosition(acmi.position);
        menu.add(200,201,1,"Obriši");
        menu.add(200,202,2,"Kupljeno");
        menu.add(200,203,3,"Nije kupljeno");
        menu.add(200,204,4,"Proizvod je nedostupan");
        menu.add(200,205,5,"Zatvori prozor");
    }
}

//funkcija u kojoj se sa adaptera briše odabrana stavka, iste promjene se automatski primijene i na listu
@Override
public boolean onContextItemSelected(MenuItem item) {
    AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
    switch (item.getItemId()) {
        case 201:
            adapter.remove(info.position);
            adapter.notifyDataSetChanged();
            AzurirajUkupniTrosak();
            return true;
        case 202:
            ShoppingLista.get(info.position).setStatus(1);
            adapter.notifyDataSetChanged();
            return true;
        case 203:
            ShoppingLista.get(info.position).setStatus(0);
            adapter.notifyDataSetChanged();
            return true;
        case 204:
            ShoppingLista.get(info.position).setStatus(2);
            adapter.notifyDataSetChanged();
            return true;
    }
    return true;
}

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

    final DBHandler db = new DBHandler(this);

    nazivProizvoda=(EditText)findViewById(R.id.nazivproizvoda_text);
    kolicina=(EditText)findViewById(R.id.kolicinaproizvoda_text);
    cijena=(EditText)findViewById(R.id.cijenaproizvoda_text);
    dodaj=(Button)findViewById(R.id.dodaj_gumb);
    ocisti=(Button)findViewById(R.id.ocisti_gumb);
    spremi=(Button)findViewById(R.id.spremi_gumb);

    lista=(ListView)findViewById(R.id.shoppinglista2_list);

    registerForContextMenu(lista);

    adapter = new ListaAdapter(this,ShoppingLista);
    lista.setAdapter(adapter);

    dodaj.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            /////////////PROVJERE KOD UPISA ///////////////////////

            if(TextUtils.isEmpty(nazivProizvoda.getText())) {
                nazivProizvoda.setError("Unesite naziv proizvoda!");
                return;
            }

            if(TextUtils.isEmpty(cijena.getText())) {
                cijena.setError("Unesite cijenu!");
                return;
            }

            if(TextUtils.isEmpty(kolicina.getText())) {
                kolicina.setError("Unesite količinu!");
                return;
            }

            if((kolicina.getText().toString()).contains(".")) {
                kolicina.setError("Unesite ispravan broj!");
                return;
            }

            /////////////PROVJERE KOD UPISA -KRAJ ////////////////////////

            DecimalFormat zaokruzi=new DecimalFormat("0.00");
            Proizvod p = new Proizvod();
            p.setNaziv(nazivProizvoda.getText().toString());
            p.setKolicina(Integer.parseInt(kolicina.getText().toString()));
            String ukupnaCijena=zaokruzi.format(Float.parseFloat(cijena.getText().toString())*Integer.parseInt(kolicina.getText().toString())).toString();
            p.setCijena(Double.parseDouble(ukupnaCijena)); //množi se količina sa cijenom jednog komada proizvoda
            ShoppingLista.add(p);
            adapter.notifyDataSetChanged();
            AzurirajUkupniTrosak();

            Toast.makeText(getApplicationContext(), "Proizvod dodan u listu!",
                    Toast.LENGTH_SHORT).show();

            nazivProizvoda.setText("");
            kolicina.setText("");
            cijena.setText("");

        }
    });

    ocisti.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            ShoppingLista.clear();
            adapter.notifyDataSetChanged();
            AzurirajUkupniTrosak();

            Toast.makeText(getApplicationContext(), "Proizvodi su obrisani!",
                    Toast.LENGTH_SHORT).show();
        }
    });

    spremi.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // get prompts.xml view
            LayoutInflater li = LayoutInflater.from(KreiranjeListeActivity.this);
            View promptsView = li.inflate(R.layout.spremanje_liste, null);

            AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(
                    KreiranjeListeActivity.this);

            // set prompts.xml to alertdialog builder
            alertDialogBuilder.setView(promptsView);

            final EditText nazivListe = (EditText) promptsView
                    .findViewById(R.id.nazivListe);

            // set dialog message
            alertDialogBuilder
                    .setCancelable(false)
                    .setPositiveButton("Spremi",
                            new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog,int id) {

                                    ShoppingLista shoppinglista = new ShoppingLista(nazivListe.getText().toString(),"TEST DATUMA");

                                    /////POSTAVLJANJE UKUPNOG IZNOSA U NOVOSTVORENU LISTU
                                    DecimalFormat zaokruzi=new DecimalFormat("0.00");
                                    double ukupniIznos=0;
                                    for(Proizvod p : ShoppingLista)
                                    {
                                        ukupniIznos+=p.getCijena();
                                    }
                                    //////////////////////////////////////////////////////
                                    db.dodajListu(shoppinglista);

                                    for(Proizvod p : ShoppingLista)
                                    {
                                        db.dodajProizvod(p,nazivListe.getText().toString());
                                    }

                                    Intent i = new Intent(KreiranjeListeActivity.this, PopisListaActivity.class);
                                    startActivity(i);

                                }
                            })
                    .setNegativeButton("Otkaži",
                            new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog,int id) {
                                    dialog.cancel();
                                }
                            });

            // create alert dialog
            AlertDialog alertDialog = alertDialogBuilder.create();

            // show it
            alertDialog.show();
        }
    });

}

}

问题是图标根本没有改变。即使我使用了 adapter.notifyDataSetChanged(); ,所选对象的 Status 值也会改变,但图标不会改变怎么了?

【问题讨论】:

  • 您准备在 ListAdaptor 构造函数中初始化的列表的代码在哪里: public ListaAdapter(Context context, ArrayList proizvodi) { super(context, 0, proizvodi); }
  • @smit 更新并添加了活动中的整个代码。
  • @BernardPolman 在您的TextView 上执行 onClick 事件时,您的图标没有改变?
  • @Yupi 图标不会改变,但 Status 的值会改变。
  • 你有你的项目在 GitHub 上还是我会去看看的地方?

标签: java android adapter


【解决方案1】:
Here change this in your code in your List adapter class:

First create a list of type Proizvod 
List<Proizvod> dataList = new ArrayList<>();

then
public ListaAdapter(Context context, ArrayList<Proizvod> proizvodi) {
    super(context, 0, proizvodi);
this.dataList = proizvodi;
}

In place of Proizvod proizvod = getItem(position);

use 

Proizvod proizvod = dataList.getItem(position);


Hope it helps!!!

【讨论】:

  • 只是为了确保在初始化后尝试在 ListaAdaptor 类中打印您的列表。当前代码的问题是您没有使用保存在列表中的数据。当你在你的适配器类中调用 proizvod.getStatus 时,它总是会给你零,因为你已经在你的类中初始化了:public int status=0;
  • 不,它并不总是给我零。我可以通过上下文菜单更改 Status 的值,但图标保持不变,这就是问题所在。
  • 尝试在此行 switch(proizvod.getStatus()) 之前打印 proizvod.getStatus() 的值并分享你得到的值
猜你喜欢
  • 2021-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多