3

我有一个 ListView 使用:

setChoiceMode(ListView.CHOICE_MODE_SINGLE)

因此,当用户单击列表项时,它会显示为选中状态。这工作正常并自动选择该项目。

注意:用户单击列表项时的标准操作是更新另一个片段中的某些内容。

但是列表中有一些我不想选择的列表项。我没有更新内容,而是显示一个对话框。问题是,当用户摆脱对话框时,该项目仍被标记为选中,这是我不想要的。事实上,我根本不希望它被选中,并保持之前选中的列表项处于选中状态。

有没有办法以编程方式选择列表项(因此您可以选择是否将其设置为选中),同时使用 CHOICE_MODE_SINGLE 因为这确保当前仅选择列表中的一项?

4

1 回答 1

6

看看这段代码:

mListView.setOnItemClickListener(new OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {
        if (position == 0) {
            mListView.setItemChecked(position, false);
        }
    }
});

如果选择了第一项,它将取消选择列表项。你也可以保存最后一个正确的位置

mListView.setOnItemClickListener(new OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {
        if (position == 0) {
            mListView.setItemChecked(mLastCorrectPosition, true);
        }
        else {
            mLastCorrectPosition = position;
        }
    }
});

编辑

完整的活动

public class MainActivity extends Activity {

    private ListView mListView;
    private String[] mData = new String[] { "xxx", "yyy", "zzz", "aaa" };
    private BaseAdapter mAdapter;
    private int mLastCorrectPosition = -1;
    private int mButtonPosition = 0;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mListView = (ListView) findViewById(R.id.list_view);
        mListView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);

        mAdapter = new ArrayAdapter<String>(this,
                        android.R.layout.simple_list_item_activated_1, mData);
        mListView.setAdapter(mAdapter);
        mListView.setSelector(new ColorDrawable(0));

        mListView.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                            int position, long id) {
                if (position == mButtonPosition) {
                    if (mLastCorrectPosition != -1) {
                        mListView.setItemChecked(mLastCorrectPosition, true);
                    }
                    else {
                        mListView.setItemChecked(mButtonPosition, false);
                    }
                    // here show dialog
                }
                else {
                    mLastCorrectPosition = position;
                    // here refresh fragment
                }
            }
        });
    }
}
于 2013-05-10T14:50:50.387 回答