简体   繁体   English

从ArrayAdapter中删除项目

[英]Remove item from ArrayAdapter

I am trying to implement remove item (because it's stating to update from 0 to 1 from listView in Android when user press textView in each item. eg: 我正在尝试实现删除项(因为它说明了当用户在每个项目中按textView时,将Android中的listView从0更新为1。例如:
There are 3 items 有3个项目

  • apple 0 苹果0
  • orrange 0 Orrange 0
  • grape 0 葡萄0

In each item there is a textView as a button. 在每个项目中都有一个textView作为按钮。 When user press textView for Apple, my app will update item 'apple' to 1, and remove it from listView, and in listview 'apple' will be gone. 当用户按下Apple的textView时,我的应用程序会将“ apple”项更新为1,并将其从listView中删除,而在listview中,“ apple”将消失。 This is my list code 这是我的清单代码

public class ListPelangganUnsyncFragment extends ListFragment
{
    AdapterListPelanggan pelangganAdp;
    ArrayList<Pelanggan> pelanggan = null;
    FloatingActionButton fab;
    Button sync;
    int list = 0;
    int newList = 0;
    ListView listView;


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, final Bundle savedInstanceState)
    {
        final View rootView = inflater.inflate(R.layout.list_pelanggan, container, false);
        super.onCreate(savedInstanceState);

        listView = (ListView) rootView.findViewById(android.R.id.list);
//        Buat kalo udah ada login
//        SharedPreferences setting

        pelanggan = new ArrayList<Pelanggan>();

//        Buat ngambil data dari DB lokal
        final DBPelanggan dbpel = new DBPelanggan(getActivity()); // get context dri activity, return null klo fragment ini ga attach
        try
        {
            dbpel.open();
            pelanggan = dbpel.getDataPelanggan();
            dbpel.close();
            list = pelanggan.size();
            Log.d("List", list+"");
        }
        catch (SQLException e)
        {
            e.printStackTrace();
        }

        sync = (Button) rootView.findViewById(R.id.sinkron);
        Button add = (Button) rootView.findViewById(R.id.addPelanggan);
        add.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                Intent intent = new Intent(rootView.getContext(), FormPelangganActivity.class);
                intent.putExtra("fungsi", 0);
                startActivity(intent);
                getActivity().finish();
            }
        });

        sync.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                try
                {
                    dbpel.open();
                    dbpel.updateStat(pelanggan);
                    pelanggan = dbpel.getDataPelanggan();
                    dbpel.close();
                    if(pelanggan != null)
                    {
                        pelangganAdp = new AdapterListPelanggan(getActivity(), R.layout.isi_list_pelanggan, pelanggan);
                        listView.setAdapter(pelangganAdp);
                    }
                    ((MainActivity)getActivity()).selectFragment(0);

                }
                catch (SQLException e)
                {
                    e.printStackTrace();
                }
            }
        });




        //Adapter

        listView.setClickable(true);
        if(pelanggan != null)
        {
            pelangganAdp = new AdapterListPelanggan(getActivity(), R.layout.isi_list_pelanggan, pelanggan);
            listView.setAdapter(pelangganAdp);

            newList = listView.getCount();
            Log.d("List", newList + "");
        }

        return rootView;
    }

and this is my adapter: 这是我的适配器:

public class AdapterListPelanggan extends ArrayAdapter<Pelanggan>
{
    private Context context;
    private int resource;
    private ArrayList<Pelanggan> arPelanggan;
    Holder h = null;
    DBPelanggan db;
    private boolean status;

    // Holder = Object
    static class Holder
    {
        TextView tv_KTP, tv_Nama;
        ImageView syncButton;
    }

    public AdapterListPelanggan(Context context, int resource, ArrayList<Pelanggan> arPelanggan)
    {
        super(context, resource, arPelanggan);

        this.context = context;
        this.resource = resource;
        this.arPelanggan = arPelanggan;

        Log.d("ListAdapter", "Jumlah List c "+arPelanggan.size());
    }

    public AdapterListPelanggan(Context context, int resource, ArrayList<Pelanggan> arPelanggan, boolean status)
    {
        super(context, resource, arPelanggan);

        this.context = context;
        this.resource = resource;
        this.arPelanggan = arPelanggan;
        this.status = status;
    }

    public View getView(final int position, View convertView, ViewGroup parent)
    {
        h = new Holder();
        final Pelanggan pelanggan = arPelanggan.get(position); // Set Data per urutan
        Log.d("ListAdapter", "ID Pelanggan b "+pelanggan.getId_pelanggan()+"");
        if(convertView == null)
        {
            LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(resource, parent, false);

            h.tv_KTP = (TextView)convertView.findViewById(R.id.tv_ktp_isi_lp);
            h.tv_Nama = (TextView)convertView.findViewById(R.id.tv_nama_isi_lp);
            h.syncButton = (ImageView)convertView.findViewById(R.id.syncButton);

            if(status)
            {
                h.syncButton.setVisibility(View.GONE);
            }

            convertView.setTag(h);
        }
        else
        {
            h = (Holder)convertView.getTag();
        }

        // ------------------ Button Sync ------------------

        h.syncButton.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                try
                {
                    db = new DBPelanggan(getContext());
                    db.open();
                    db.updateStatPelanggan(pelanggan);
                    Log.d("ListAdapter", "ID hilang " + pelanggan.getId_pelanggan());
                    arPelanggan.remove(pelanggan);
                    arPelanggan = db.getDataPelanggan();
                    Log.d("ListAdapter", "Jumlah List c "+arPelanggan.size());


         Log.d("ListAdapter", pelanggan.getId_pelanggan()+"ID Sekarang");
                db.close();
                notifyDataSetChanged();
            }
            catch (SQLException e)
            {
                e.printStackTrace();
            }
        }
    });
    // ---------------------------------------------------------------

    h.tv_KTP.setText(pelanggan.getId_pelanggan());
    h.tv_Nama.setText(pelanggan.getNama());

    return convertView;
}


}

The problem is when I press textView for 'apple', indeed it was updated in db and gone from my list, but when I press 'orrange' after press 'apple' my app gives error. 问题是当我按textView来获取“ apple”时,确实在db中对其进行了更新并从列表中消失了,但是当我按“ apple”后按了“ orrange”时,我的应用程序给出了错误。

This is my error: 这是我的错误:

11-17 10:34:55.639 5429-5429/com.example.michael.ims_application_apps E/AndroidRuntime: at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:251) 11-17 10:34:55.639 5429-5429/com.example.michael.ims_application_apps E/AndroidRuntime: at java.util.ArrayList.get(ArrayList.java:304) 11-17 10:34:55.639 5429-5429/com.example.michael.ims_application_apps E/AndroidRuntime: at com.example.michael.ims_application_apps.AdapterListPelanggan.getView(AdapterListPelanggan.java:63) 11-17 10:34:55.639 5429-5429/com.example.michael.ims_application_apps E/AndroidRuntime: at android.widget.AbsListView.obtainView(AbsListView.java:2260) 11-17 10:34:55.639 5429-5429/com.example.michael.ims_application_apps E/AndroidRuntime: at android.widget.ListView.makeAndAddView(ListView.java:1769) 11-17 10:34:55.639 5429-5429/com.example.michael.ims_application_apps E/AndroidRuntime: at android.widget.ListView.fillDown(ListView.java:672) 11-17 10:34:55.639 5429-5429/com.example.michael.ims_application_ap 11-17 10:34:55.639 5429-5429 / com.example.michael.ims_application_apps E / AndroidRuntime:at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:251)11-17 10:34:55.639 5429-5429 / com.example.michael.ims_application_apps E / AndroidRuntime:在java.util.ArrayList.get(ArrayList.java:304)11-17 10:34:55.639 5429-5429 / com.example.michael.ims_application_apps E / AndroidRuntime:在com.example.michael.ims_application_apps.AdapterListPelanggan.getView(AdapterListPelanggan.java:63)11-17 10:34:55.639 5429-5429 / com.example.michael.ims_application_apps E / AndroidRuntime:at android.widget.AbsListView.obtainView( AbsListView.java:2260)11-17 10:34:55.639 5429-5429 / com.example.michael.ims_application_apps E / AndroidRuntime:位于android.widget.ListView.makeAndAddView(ListView.java:1769)11-17 10:34 :55.639 5429-5429 / com.example.michael.ims_application_apps E / AndroidRuntime:位于android.widget.ListView.fillDown(ListView.java:672)11-17 10:34:55.639 5429-5429 / com.example.michael。 ims_application_ap ps E/AndroidRuntime: at android.widget.ListView.fillGap(ListView.java:636) 11-17 10:34:55.639 5429-5429/com.example.michael.ims_application_apps E/AndroidRuntime: at android.widget.AbsListView.trackMotionScroll(AbsListView.java:5045) 11-17 10:34:55.639 5429-5429/com.example.michael.ims_application_apps E/AndroidRuntime: at android.widget.AbsListView.scrollIfNeeded(AbsListView.java:3202) 11-17 10:34:55.639 5429-5429/com.example.michael.ims_application_apps E/AndroidRuntime: at android.widget.AbsListView.onTouchEvent(AbsListView.java:3476) ps E / AndroidRuntime:位于android.widget.ListView.fillGap(ListView.java:636)11-17 10:34:55.639 5429-5429 / com.example.michael.ims_application_apps E / AndroidRuntime:位于android.widget.AbsListView。 trackMotionScroll(AbsListView.java:5045)11-17 10:34:55.639 5429-5429 / com.example.michael.ims_application_apps E / AndroidRuntime:在android.widget.AbsListView.scrollIfNeeded(AbsListView.java:3202)11-17 10 :34:55.639 5429-5429 / com.example.michael.ims_application_apps E / AndroidRuntime:位于android.widget.AbsListView.onTouchEvent(AbsListView.java:3476)

Anyone can advice me how to fix it? 任何人都可以建议我如何解决它? Thank you. 谢谢。

check below line of code in your getview. 在您的getview中检查以下代码行。 what value you are getting in position variable, it may be greater than length of your array list-> 您在position变量中获得什么值,它可能大于数组列表的长度->

final Pelanggan pelanggan = arPelanggan.get(position); 

The problem is in this line, 问题在于这条线,

  arPelanggan = db.getDataPelanggan();

You are reloading the data from db after removing. 删除后,您正在从db重新加载数据。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM