java - ListView 包含复选框滚动问题

标签 java android android-listview android-checkbox

我正在尝试创建一个ListView包含目录名称。 ListView包含 TextView显示文件夹名称和 checkbox 。 列表已成功创建,但当我向上/向下滚动列表时,我遇到了复选框状态的问题。复选框的状态随机变化。 为了保存复选框的状态,我使用 HashMap<String, Boolean>,字符串连续目录名称和 boolean 值 - 复选框状态。

下面是代码(抱歉有点长): MainActivity.java

public class MainActivity extends ListActivity implements OnClickListener {

    Button done, cancel, selectAll;

    ArrayList<String> m_list;
    HashMap<String, Boolean> m_checkedMap;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        m_checkedMap = new HashMap<String, Boolean>();

        done = (Button) findViewById(R.id.bDone);
        cancel = (Button) findViewById(R.id.bCancel);
        selectAll = (Button) findViewById(R.id.bSelAll);
        done.setOnClickListener(this);
        cancel.setOnClickListener(this);

        new AsyncHandler(this).execute();
    }

    @Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
        super.onListItemClick(l, v, position, id);
        Toast.makeText(this, m_list.get(position), Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()) {
        case R.id.bDone:
            //Update CheckedMap in DB
            Toast.makeText(this, m_checkedMap.values().toString(),
                    Toast.LENGTH_LONG).show();
            break;
        case R.id.bCancel:
            this.finish();
            break;
        }
    }

    public class AsyncHandler extends AsyncTask {

        Context context;
        public AsyncHandler(Context c) {
            context = c;
        }

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            Toast.makeText(context, "In onPreExecute()", Toast.LENGTH_SHORT)
                    .show();
        }

        @Override
        protected Object doInBackground(Object... arg0) {
            getList();
            return null;
        }

        @Override
        protected void onPostExecute(Object result) {
            // super.onPostExecute(result);
            setListAdapter(new ElementAdapter(context, m_list, m_checkedMap));
        }

        private void getList() {
            m_list = new ArrayList<String>();
            File root = new File("/");
            File[] files = root.listFiles();
            for (File f : files) {
                if (f.isDirectory() && !f.isHidden()) {
                    m_list.add(f.getName());
                    m_checkedMap.put(f.getName(), false);
                }
            }
            Collections.sort(m_list);
        }
    }
}

适配器类

public class ElementAdapter extends ArrayAdapter {

    LinearLayout rowLayout;
    ArrayList<String> items = new ArrayList<String>();
    TextView tvElement;
    HashMap<String, Boolean> checkedMap;
    CheckBox cBox; 
    Context context;

    public ElementAdapter(Context c, ArrayList<String> elements,
            HashMap<String, Boolean> m_checkedMap) {
        super(c, R.layout.row, elements);
        this.items = elements;
        this.checkedMap = m_checkedMap;
        this.context = c;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        View view = convertView;
        if (view == null) {
            LayoutInflater vi = (LayoutInflater) context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            view = vi.inflate(R.layout.row, null);
        }

        rowLayout = (LinearLayout) view.findViewById(R.id.row);
        tvElement = (TextView) view.findViewById(R.id.tvElement);
        tvElement.setText(items.get(position));
        cBox = (CheckBox) view.findViewById(R.id.checkBox1);
        cBox.setOnClickListener(new OnClickListener() {
            public void onClick(View paramView) {
                if (cBox.isChecked()) {
                    //checkedMap.put(tvElement.getText().toString(), false);
                    checkedMap.put(items.get(position), false);
                } else if (!cBox.isChecked()) {
                    //checkedMap.put(tvElement.getText().toString(), true);
                    checkedMap.put(items.get(position), true);
                }
            }
        });
        cBox.setChecked(checkedMap.get(items.get(position)));
        return view;
    }
}

最佳答案

出于与 ListView 的 CheckBox 滚动问题相同的原因,我创建了一篇博客文章, ListView with CheckBox Scrolling Issue

关于java - ListView 包含复选框滚动问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11430670/

相关文章:

java - 捕获图像,上传到 Firebase 并检索 Java Android Studio

android - 在 Android 的 ListView 中添加页眉

java - 如何在 Android ListView 中显示评级栏?

java - 使用 joda-time new period(long) 时出现 StackOverflowError

java - 有没有办法将 JTextArea 的插入符垂直向上移动?

android - 哪个是在一个插槽中发送 50mb 数据或以任何其他方式向 android 中的服务器发送 50mb json 数据的好方法?

java - 调用notifyDataSetChanged 时,具有customAdapter 的ListView 未更新?

java - 持久 HTTP 连接 Java

java - 从适配器替换时找不到 fragment ID 的 View

java - 运行 Roboelectric 单元测试时出现 NoClassDefFoundError