【问题标题】:Why a ListView automatically unselect selected items?为什么 ListView 会自动取消选择选定项目?
【发布时间】:2012-05-20 04:15:29
【问题描述】:

每次选择项目时都会发生这种情况。我有一个带有 OnItemClickListener 的 ListView,当事件被触发时,它会将 TextView 上的属性文本更改为某个随机字符串,之后所选项目变为未选中。

但是,如果我注释了更改文本的行,请再次运行应用程序并再次触发相同的事件,该项目将保持选中状态。

这是代码,我将其简化为最简单的方式。

public class TestsActivity extends Activity {
ListView optionsListView;
TextView text;
String[] stringArray = { "Option 1", "Option 2", "Option 3", "Option 4",
        "Option 5", "Option 6", "Option 7", "Option 8", "Option 9",
        "Option 10" };
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.list_layout);       
    optionsListView = (ListView) findViewById(R.id.list);
    OptionsAdapter ItemsAdapter = new OptionsAdapter(this, R.id.list,stringArray);
    optionsListView.setAdapter(ItemsAdapter);
    text = (TextView)findViewById(R.id.textView);
    optionsListView.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int position,
                long id) {
            Toast.makeText(getApplicationContext(), "Clicked" + position, Toast.LENGTH_SHORT).show();
            text.setText("Something"); // <- If you comment this, it will work
        }
    });
}

private class OptionsAdapter extends BaseAdapter {
    String[] options;

    public OptionsAdapter(Context context, int textViewResourceId,
            String[] options) {
        this.options = options;
    }

     @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        if (convertView == null) {
            LayoutInflater vi = LayoutInflater.from(getApplicationContext());
            convertView = vi.inflate(R.layout.list, null);
        }
        TextView post = (TextView) convertView.findViewById(R.id.post);
        post.setText(options[position]);
        return convertView;
    }

    public int getCount() {
        return options.length;
    }

    public Object getItem(int position) {
        return position;
    }

    public long getItemId(int position) {
        return position;
    }
}
}

list_layout.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:weightSum="2" >

<TextView
    android:id="@+id/textView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:gravity="center"
    android:text="textView" >
</TextView>

<ListView
    android:id="@+id/list"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:listSelector="#AABBCC" >
</ListView>

</LinearLayout>

list.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="fill_parent"
   android:layout_height="wrap_content" >

   <TextView
       android:id="@+id/post"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:gravity="center_vertical" />

</LinearLayout>

如果您从 list_layout.xml 中删除“android:layout_weight="1"” 行,则选择将正常工作,但我需要在我的真实布局中使用那段代码,这只是一个示例

【问题讨论】:

    标签: android android-layout android-listview selection unselect


    【解决方案1】:

    当您更改文本时,视图会因为内容的变化而重新布局,尤其是权重也需要重新定位元素。这就是重设焦点的原因。这是根本原因……

    也许您应该考虑使 TextView 不可聚焦或保存并恢复列表视图项的焦点。

    【讨论】:

    • 我假设您在事件处理程序中恢复了焦点,这是行不通的,因为如果在事件处理程序之后中继完成。很抱歉,我不知道具体如何解决,但我了解问题的原因。
    猜你喜欢
    • 2013-07-19
    • 1970-01-01
    • 1970-01-01
    • 2015-10-19
    • 2011-07-02
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 2018-09-18
    相关资源
    最近更新 更多