java - Android listActivity onListItemClick 与 CheckBox

标签 java android xml checkbox listactivity

我的问题是如何访问和更改列表 Activity 中任何项目的复选框模式。我有一个带有复选框和 TextView 的 XML 模板文件,它们定义了一行。这是我到目前为止正在尝试的:

@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
    super.onListItemClick(l, v, position, id);
        Toast.makeText(this, "You selected: " + Integer.toString(position), Toast.LENGTH_LONG).show();

        CheckBox checkbox = (CheckBox) findViewById(R.id.checkbox); 
        if (checkbox.isChecked() == false) {
            checkbox.setChecked(true); 
        } else {
            checkbox.setChecked(false); 
        }

}

显然,虽然使用 R.id.checkbox 仅切换第一个复选框(实际上,它会切换我在屏幕上查看的列表的任何部分的第一个复选框)。我不确定使用什么函数来获取任何行的复选框。顺便说一句,Toast 工作得很好,所以至少它可以正确注册位置。

感谢您的帮助。

编辑 - 我现在尝试子类化 SimpleCursorAdapter 以更好地控制我想要的行为。这是该子类:

public class musicPlaylist extends SimpleCursorAdapter {

private Cursor c;
private Context context;
private ArrayList<String> checkList = new ArrayList<String>();
private final static int SELECTED = 1;
private final static int NOT_SELECTED = 0;

public musicPlaylist(Context context, int layout, Cursor c,
        String[] from, int[] to) {
    super(context, layout, c, from, to);
    this.c = c;
    this.context = context;

}

public View getView(int pos, View inView, ViewGroup parent) {
    View v = inView;
    if (v == null) {
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        v = inflater.inflate(R.layout.song_item, null);
    }

    this.c.moveToPosition(pos);     
    int columnIndex = this.c.getColumnIndexOrThrow(MediaStore.Audio.Media.DISPLAY_NAME);
    String song = this.c.getString(columnIndex);

    TextView sTitle = (TextView) v.findViewById(R.id.text1);
    sTitle.setText(song);
    v.setId(NOT_SELECTED);
    v.setTag(song); 
    v.setOnClickListener(new OnClickListener() {



        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub


            if (v.getId() == NOT_SELECTED) {
                v.setId(SELECTED);
                Toast.makeText(context, "Test: " + v.getId(), Toast.LENGTH_SHORT).show();  
                v.setBackgroundColor(Color.parseColor("#FFFFFF"));

            } else {
                v.setId(NOT_SELECTED);
                Toast.makeText(context, "Test: " + v.getId(), Toast.LENGTH_SHORT).show();  
                v.setBackgroundColor(Color.parseColor("#000000"));
            }

        }
    });

    return v; 
}

}

作为引用,这里是我正在制作的 ListActivity 的 XML:

<?xml version="1.0" encoding="utf-8"?>

 <ListView android:id="@android:id/list"
           android:layout_width="fill_parent"
           android:layout_height="fill_parent"
           android:layout_weight="1"
           android:drawSelectorOnTop="false"
           android:fastScrollEnabled="true"
           android:cacheColorHint="#00000000"
           />

 <TextView android:id="@android:id/empty"
           android:layout_width="fill_parent"
           android:layout_height="fill_parent"
           android:text="No data"/>

当前行为:SD 卡中的歌曲列表被制作成一个漂亮的可滚动列表。我确实从 getView() 的 onClick 中得到了一些正确的响应:第一次单击某个项目时,它会提示其标签为“1”并且其背景变为白色,而第二次我提示同一项目时,我会得到“0”,背景变黑,这是预期的。

问题是,如果我选择 item1 (使其背景为白色)然后向下滚动,我会注意到 item11、item21、item31 等也有白色背景。但当我点击它们时,它们的 ID 属性变为“1”,这意味着从技术上讲它们以前从未被点击过!所以基本上当滚动“刷新”到下一个 10 个列表时,它会复制前 10 个的配色方案......?

希望我解释清楚。

最佳答案

我认为这是一个更深层次的问题,不需要直接回答。

你想实现什么目标?您真的只想仅选中您在屏幕上看到的复选框吗?请注意,这可能是相当随机的 - ListView 仅保存屏幕上可见的复选框的项目 View ,并且每当项目滚动到屏幕外时,它们就会被重用于其他项目。

我想说,几乎可以肯定,您需要更改列表中所有复选框(即使是那些不可见的复选框)或其某些子集(如部分)的状态。这真正转化为应该完成的正确方式:

  • 适当修改您的数据模型 标记在相应数据模型元素中选择的适当标志 (您为每个项目存储的一些 boolean 值)
  • 在适配器上调用notifyDataSetChanged()。

因此, ListView 将重新创建屏幕上可见的所有 View 。假设适配器中的“getView()”编写正确,它将读取正确的模型并相应地更新项目的检查状态。 通过notifyDataSetChanged - 如果屏幕上有 10 个可见项目,则将为每个可见项目调用 10 次 getView() 。

关于java - Android listActivity onListItemClick 与 CheckBox,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6484964/

相关文章:

java - 将上下文从 Service 传递到 Asynctask 而不会泄漏

Android 模拟器您的设备目前没有健康的互联网连接

java - Android Studio 更新 Activity 位于 'Run'

android - 在我的应用程序中设置自定义文本样式时出错

java - 如何更改 Sprite 随机出现在场景中的位置?

java - Apache Solr 通过 SSL 进行分布式搜索

java - 在 Java 中导出 XML 提取中的特定字段

sql-server - 当 URI 未知时,XPath 是否有定义的方法从 namespace 的缩写检索 URI?

xml - 对于ajax请求,json vs xml的优缺点是什么?

java - Spring:为什么我们 Autowiring 接口(interface)而不是实现的类?