2012-05-11 52 views
0

每次選擇一個項目時都會發生這種情況。我有一個帶有OnItemClickListener的ListView,當事件被觸發時,它將TextView上的屬性文本更改爲一些隨機字符串,之後所選項目變爲未選中狀態。爲什麼ListView會自動取消選擇所選項目?

但是,如果我對文本發生更改的行進行註釋,請再次運行該應用程序,並再次觸發該項目將保持選中的相同事件。

這是代碼,我將它簡化爲最簡單的方式。

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刪除行 「機器人:layout_weight =」 1 「」 選擇將正常工作,但我需要在我的真實佈局中的一段代碼,它只是一個例子

回答

0

當您更改文本時,視圖由於內容的變化而重新出現,特別是重量也需要重新定位元素。這就是爲什麼焦點被重置。這是根本原因...

也許你應該考慮使TextView不可聚焦或保存並恢復listview項目的焦點。

+0

我做了兩件事,但沒有奏效。 – Nexs

+0

我假設你恢復了事件處理程序中的焦點,這不會起作用,因爲它在事件處理程序之後如果完成了中繼。我很抱歉,我不知道如何解決它,但我明白問題的原因。 –