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

时间:2018-09-05 14:10:14

标签: android listview

我正在关注有关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();
    }

}

这是Adapter类:

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

点击列表视图后

enter image description here

3 个答案:

答案 0 :(得分:2)

问题是适配器的getView()回调中的这段代码:

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

这里发生的是,仅当ListView回收项目视图时,您才对setText()进行校准。单击复选框后,所有内容都显示出来的原因是,当您调用notifyDataSetChanged()时,ListView会重新绑定所有内容。

您应该在if / else语句之外调用此方法,以便每次都执行该方法。

if(view == null) {
    ...
}else {
    ...
}

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

答案 1 :(得分:1)

我认为您遇到的问题来自getView()类中的Adapter方法。

由于使用的是ViewHolder回收对象,因此在创建对象if(view == null)之前首先要检查其是否存在。但是,您只是创建它们而没有为TextView对象分配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;
}

答案 2 :(得分:0)

尝试一次

adapter = new Adapter(this,(ArrayList)itemList);

def navigate(command):
    print("Command is:", command)

all_commands = {
    1:  {"command_name" :   "north",
         "description"  :   "Travel north.",
         "hotkey"       :   "n",
         "function"     :   navigate},
    2:  {"command_name" :   "east",
         "description"  :   "Travel east.",
         "hotkey"       :   "e",
         "function"     :   navigate},
}

prompt="command:> "
command_input = input(prompt).lower()
for i in all_commands:
    if command_input in all_commands[i]["hotkey"]:
        all_commands[i]["function"](all_commands[i]["command_name"])
        break

最后设置适配器