代码之家  ›  专栏  ›  技术社区  ›  mvasco

多项选择列表视图不显示所有对象

  •  0
  • mvasco  · 技术社区  · 6 年前

    我正在学习一个关于android中的多项选择列表视图的教程。

    我想知道那个问题的原因在哪里。

    这是MainActivity类的代码:

    public class MainActivity extends AppCompatActivity {
    
        Toolbar toolbar;
        FloatingActionButton fab;
        ListView list;
        TextView txt_menu;
        String dipilih;
        private static final String TAG = MainActivity.class.getSimpleName();
    
        Adapter adapter;
        ProgressDialog pDialog;
    
        List<Data> itemList = new ArrayList<Data>();
    
        // Sesuaikan dengan IP Address PC/LAptop atau ip emulator bawaan android 10.0.2.2
        private static String url = "https://.../test/menu.php";
    
        public static final String TAG_NAMA = "nama";
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            toolbar = (Toolbar) findViewById(R.id.toolbar);
            setSupportActionBar(toolbar);
    
            fab     = (FloatingActionButton) findViewById(R.id.fab);
            list    = (ListView) findViewById(R.id.list_menu);
    
            fab.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    String checkbox = "";
                    for (Data hold : adapter.getAllData()) {
                        if (hold.isCheckbox()) {
                            checkbox += "\n" + hold.getMenu();
                        }
                    }
                    if (!checkbox.isEmpty()) {
                        dipilih = checkbox;
                    } else {
                        dipilih = "Anda Belum Memilih Menu.";
                    }
    
                    formSubmit(dipilih);
                }
            });
    
            callVolley();
    
            adapter = new Adapter(this, (ArrayList<Data>) itemList);
            list.setAdapter(adapter);
    
            list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    
                @Override
                public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) {
                    adapter.setCheckBox(position);
                }
            });
    
        }
    
        private void formSubmit(String hasil){
            AlertDialog.Builder dialog = new AlertDialog.Builder(this);
            LayoutInflater inflater = getLayoutInflater();
            View dialogView = inflater.inflate(R.layout.form_submit, null);
            dialog.setView(dialogView);
            dialog.setIcon(R.mipmap.ic_launcher);
            dialog.setTitle("Menu Yang Dipilih");
            dialog.setCancelable(true);
    
            txt_menu = (TextView) dialogView.findViewById(R.id.txt_menu);
    
            txt_menu.setText(hasil);
    
            dialog.setNeutralButton("CLOSE", new DialogInterface.OnClickListener() {
    
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    dialog.dismiss();
                }
            });
    
            dialog.show();
        }
    
        private void callVolley(){
            itemList.clear();
            // menapilkan dialog loading
            pDialog = new ProgressDialog(this);
            pDialog.setMessage("Loading...");
            showDialog();
    
            // membuat request JSON
            JsonArrayRequest jArr = new JsonArrayRequest(url, new Response.Listener<JSONArray>() {
                        @Override
                        public void onResponse(JSONArray response) {
                            Log.d(TAG, response.toString());
                            hideDialog();
    
                            // Parsing json
                            for (int i = 0; i < response.length(); i++) {
                                try {
                                    JSONObject obj = response.getJSONObject(i);
    
                                    Data item = new Data();
    
                                    item.setMenu(obj.getString(TAG_NAMA));
    
                                    // menambah item ke array
                                    itemList.add(item);
                                } catch (JSONException e) {
                                    e.printStackTrace();
                                }
                            }
    
                            // notifikasi adanya perubahan data pada adapter
                            adapter.notifyDataSetChanged();
                        }
                    }, new Response.ErrorListener() {
    
                @Override
                public void onErrorResponse(VolleyError error) {
                    VolleyLog.d(TAG, "Error: " + error.getMessage());
                    hideDialog();
                }
            });
    
            // menambah request ke request queue
            AppController.getInstance().addToRequestQueue(jArr);
        }
    
        private void showDialog() {
            if (!pDialog.isShowing())
                pDialog.show();
        }
    
        private void hideDialog() {
            if (pDialog.isShowing())
                pDialog.dismiss();
        }
    
    }
    

    这是适配器类:

    public class Adapter extends BaseAdapter {
    
        private Context activity;
        private ArrayList<Data> data;
        private static LayoutInflater inflater = null;
        private View vi;
        private ViewHolder viewHolder;
    
        public Adapter(Context context, ArrayList<Data> items) {
            this.activity = context;
            this.data = items;
            inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        }
    
        @Override
        public int getCount() {
            return data.size();
        }
    
        @Override
        public Object getItem(int i) {
            return i;
        }
    
        @Override
        public long getItemId(int i) {
            return i;
        }
    
        @Override
        public View getView(int position, View view, ViewGroup viewGroup) {
            vi = view;
            final int pos = position;
            Data items = data.get(pos);
    
            if(view == null) {
                vi = inflater.inflate(R.layout.list_row, null);
                viewHolder = new ViewHolder();
                viewHolder.checkBox = (CheckBox) vi.findViewById(R.id.cb);
                viewHolder.menu = (TextView) vi.findViewById(R.id.nama_menu);
                vi.setTag(viewHolder);
            }else {
                viewHolder = (ViewHolder) view.getTag();
                viewHolder.menu.setText(items.getMenu());
            }
    
            if(items.isCheckbox()){
                viewHolder.checkBox.setChecked(true);
            } else {
                viewHolder.checkBox.setChecked(false);
            }
    
            return vi;
        }
    
        public ArrayList<Data> getAllData(){
            return data;
        }
    
        public void setCheckBox(int position){
            Data items = data.get(position);
            items.setCheckbox(!items.isCheckbox());
            notifyDataSetChanged();
        }
    
        public class ViewHolder{
            TextView menu;
            CheckBox checkBox;
        }
    }
    

    首次发射

    enter image description here

    单击listview后

    enter image description here

    3 回复  |  直到 6 年前
        1
  •  2
  •   Ben P.    6 年前

    问题是适配器的 getView()

    if(view == null) {
        ...
    }else {
        ...
        viewHolder.menu.setText(items.getMenu());
    }
    

    这里发生的事情是你只是 setText() notifyDataSetChanged() .

    if / else

    if(view == null) {
        ...
    }else {
        ...
    }
    
    viewHolder.menu.setText(items.getMenu());
    
        2
  •  1
  •   Barns    6 年前

    我认为你的问题来自 getView() 方法 Adapter

    由于使用ViewHolder回收对象,因此在创建对象之前,首先要检查对象是否存在 if(view == null) . 但是,您只是在创建它们,而不是指定 TextView 对象a String notifyDataSetChanged 导致更新列表。然后在“TextView”中设置值。

    viewHolder.menu.setText(items.getMenu());

    @Override
    public View getView(int position, View view, ViewGroup viewGroup) {
        vi = view;
        final int pos = position;
        Data items = data.get(pos);
    
        if(view == null) {
            vi = inflater.inflate(R.layout.list_row, null);
            viewHolder = new ViewHolder();
            viewHolder.checkBox = (CheckBox) vi.findViewById(R.id.cb);
            viewHolder.menu = (TextView) vi.findViewById(R.id.nama_menu);
            vi.setTag(viewHolder);
        }else {
            viewHolder = (ViewHolder) view.getTag();
        }
    
        viewHolder.menu.setText(items.getMenu());
    
        if(items.isCheckbox()){
            viewHolder.checkBox.setChecked(true);
        } else {
            viewHolder.checkBox.setChecked(false);
        }
    
        return vi;
    }
    
        3
  •  0
  •   varun setia    6 年前

    试试这个

    adapter=新适配器(this,(ArrayList)itemList);

        list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) {
                adapter.setCheckBox(position);
            }
        });
         list.setAdapter(adapter);
    
    }
    

    在末端设置适配器