2013-12-09 77 views
1

我正在測試應用程序,人們可以在其中看到要解決的問題。在問題頁面上,有一個TextView顯示該問題,一個ListView顯示用於在問題之間來回切換的選項和兩個按鈕。在ArrayAdapter的getView方法中調用setSelected方法

我使用SparseArrayListView所選擇的選項位置,質疑從List<Question>mAllQuestions未來位置相關聯。

我也使用AnswerModel看起來是這樣的:

public class AnswerModel 
{ 
    public String mAnswerText; 
    public boolean mIsSelected; 
    public AnswerModel(String answerText) 
    { 
     mAnswerText = answerText; 
    } 
    @Override 
    public String toString() 
    { 
     return mAnswerText; 
    } 
} 

我用AnswerModel創建一個ArrayAdapter,它看起來像這樣:

ArrayAdapter<AnswerModel> adapter = new ArrayAdapter<AnswerModel>(this, android.R.layout.simple_list_item_activated_1) 
{ 
    @Override 
    public View getView(int position, View convertView, 
      ViewGroup parent) { 
     View v =super.getView(position, convertView, parent);; 
     AnswerModel model = getItem(position); 
     // This is where it does not work. 
     v.setSelected(model.isSelected); 
     return v; 
    } 
} 

後,我創造我的ArrayAdapter我執行以下代碼:

List<Answer> answers = getAnswersByQuestionLocation(questionLocation); 
for (int i = 0; i < answers.size(); i++) 
{ 
    answerAdapter.add(new AnswerModel(mOptionLetters[i] +". "+ answers.get(i).getAnswerText())); 
} 

and the cod上述e將項目添加到ArrayAdapter。當在ListView上發生點擊時,我將所選的選項位置和問題位置置於SparseArray,輸入mAnswerLocationByQuestionLocation我使用它來更新選定的選項背景

if (mAnswerLocationByQuestionLocation.indexOfKey(questionLocation) > -1) 
    { 
     MyModel model = (MyModel)mAnswerList.getItemAtPosition(questionLocation); 
     model.isSelected= true; 
     answerAdapter.notifyDataSetChanged(); 
    } 
} 

所以問題是v.setSelected不會更改所選項目的背景顏色在ListView我調試的應用程序和所有isSelected屬性工程,它實際上通過truev.setSelected(model.isSelected)方法調用。

我已經嘗試了很多方法如下,但他們沒有工作:

  1. 調用上ListViewrefreshDrawableState()以及v
  2. 我叫invalidate()postInvalidate()不起作用。
  3. 我叫v.post(new Runnable())並運行v.setSelected(model.isSelected)
  4. 我有一個可繪製的選擇器,它設置選定的狀態背景顏色,但沒有運氣。

如果你問我,爲什麼我就是不說v.setBackgroundColor這不實際工作,但它會導致另一個問題改變v背景顏色。當我從列表中選擇另一個項目時,它會保持突出顯示,並且會導致單個選項選擇列表中的兩個突出顯示的項目。我可以撥打setBackgroundColor(...Color.white)setOnItemClick事件處理程序ListView中的所有項目,但是當我這樣做時,稍後單擊某個項目不會使項目突出顯示。它就像一個兔子洞。

任何想法?

+0

您使用的是像CheckBox還是RadioButton? – VishalKale

回答

2

您需要使用listView.setItemChecked(position, true),如果你想與依賴,如果你想顯示一個或同時選擇多個項目在您ListView選擇模式設定要麼CHOICE_MODE_SINGLECHOICE_MODE_MULTIPLE一起選擇了顯示的項目。從OP

更新:

我標誌着你的答案,因爲實際上這個答案的工作後,我採取了以下路徑:

ArrayAdaptergetView()方法,我訪問ListView變量,並調用它帶有適當參數的setItemChecked()方法。

所以它看起來像這樣:

@Override 
public View getView(int position, View convertView, ViewGroup parent) 
{ 
    View v = super.getView(position, convertView, parent); 
    AnswerModel model = getItem(position); 
    mAnswerList.setItemChecked(position, model.isSelected); 
    return v; 
} 

但這種做法導致另一個問題,所以我不得不更新的ListViewonItemClick事件處理類似以下內容:

@Override 
public void onItemClick(AdapterView<?> parent, View view, int position, 
     long id) 
{ 
    setAnswerModel(mCurrentQuestionLocation, false); 
    mAnswerLocationByQuestionLocation.put(mCurrentQuestionLocation, 
      position); 
    setAnswerModel(mCurrentQuestionLocation, true); 
    mAnswerAdapter.notifyDataSetChanged(); 
} 

其調用setAnswerModel方法,它看起來像這個:

private void setAnswerModel(int questionLocation, boolean isSelected) 
{ 
    if (mAnswerLocationByQuestionLocation.indexOfKey(questionLocation) > -1) 
    { 
     int answerLocation = mAnswerLocationByQuestionLocation 
       .get(questionLocation); 
     AnswerModel model = (AnswerModel) mAnswerAdapter.getItem(answerLocation); 
     model.isSelected = isSelected; 
    } 
} 
0

在AnswerModel類中爲mIsSelected創建getter setter方法,並檢查在適配器的getView()中,然後適當地設置它應該工作。

+0

您認爲它與我在代碼中所做的不同嗎?而不是getter和setter,我直接設置成員本身就足夠了,因爲我不需要在這裏封裝。 – Tarik

+0

如何區別兩個不同的AnswerModels mIsSelected變量,以及爲什麼你創建到AnswerModel類中,沒有必要如果你想用另一種方式像你在上面做的那樣? – VishalKale

相關問題