2017-01-10 65 views
1

我想先說我沒有在這裏使用視圖。我只有5個視圖,我用兩個選擇點擊交換它們。我已經瀏覽了幾個在線的問題,其中大部分都涉及到Recycler和getChildAt等,它不適合我。Android列表視圖編輯全部視圖外觀

我明白適配器是如何工作的,所以我想我必須將我的背景顏色傳遞給我的適配器。只需簡單介紹一下我想在這裏做什麼。用戶可以對列表項進行混洗,並且必須與其旁邊的表相對應。一旦用戶認爲答案是正確的,他們點擊提交按鈕。此時,背景顏色應更改爲綠色或紅色,以確保正確和不正確。

但是,當我想訪問所有的意見,我似乎無法得到它的處理。

讓我的數據源適配器

private ArrayList<Triplet<String, Integer, Integer>> testArray = new ArrayList<>(); 

public ArrayList<Triplet<String, Integer, Integer>> getDefinitionWordsTriplet(){ 
    testArray.add(Triplet.with("Trojan", 0, Color.WHITE)); 
    testArray.add(Triplet.with("Virus", 1, Color.WHITE)); 
    testArray.add(Triplet.with("Spyware", 2, Color.WHITE)); 
    testArray.add(Triplet.with("Ransomware", 3, Color.WHITE)); 
    testArray.add(Triplet.with("Leakware", 4, Color.WHITE)); 
    return testArray; 
} 

所以我使用一個API來使用三重,原來這是一對,但我決定把色彩詮釋。

填充適配器

//TESTING 
private ArrayList<Triplet<String, Integer, Integer>> testTripletArray; 
private DefintionListViewAdapterTriplet leftTripletAdapter; 

private void EstablishTableLists(){ 
    leftDefinitionLV = (ListView) findViewById(R.id.definitionMainGameLeftLV); 
    ListView rightDefinitionLV = (ListView) findViewById(R.id.definitionMainGameRightLV); 

    DefinitionWordList wordAndDefinitionList = new DefinitionWordList(); 
    definitionWordsList = wordAndDefinitionList.getDefinitionWords(); 
    definitionExplanationsList = wordAndDefinitionList.getDefinitionExplanations(); 
    tableLength = definitionWordsList.size(); 

    //TESTING 
    testTripletArray = wordAndDefinitionList.getDefinitionWordsTriplet(); 

    DefintionListViewAdapter rightAdapter = new DefintionListViewAdapter 
      (DefinitionGameMainActivity.this, definitionExplanationsList); 

    //TESTING 
    leftTripletAdapter = new DefintionListViewAdapterTriplet(DefinitionGameMainActivity.this, testTripletArray); 

    //leftDefinitionLV.setAdapter(leftAdapter); 
    rightDefinitionLV.setAdapter(rightAdapter); 

    //TESTING 
    leftDefinitionLV.setAdapter(leftTripletAdapter); 

    leftDefinitionLV.setOnItemClickListener(leftSideItemListener); 

} 

因此,這是標準的適配器和ListView建立。我將我的數據傳遞給適配器,然後給listView我的適配器。

適配器

public class DefintionListViewAdapterTriplet extends ArrayAdapter<Triplet<String, Integer, Integer>> { 

private Context mContext; 
private ArrayList<Triplet<String, Integer, Integer>> mInput; 

public DefintionListViewAdapterTriplet(Context c, ArrayList<Triplet<String, Integer, Integer>> input){ 
    super(c, -1, input); 
    mContext = c; 
    mInput = input; 
    Log.i("Test: ", mInput.get(0).getValue0()); 
} 

@NonNull 
@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(mContext.LAYOUT_INFLATER_SERVICE); 

    View rowView = inflater.inflate(R.layout.definition_table_cell, parent, false); 

    TextView textInputTV = (TextView) rowView.findViewById(R.id.definitionCellTV); 
    LinearLayout borderColour = (LinearLayout) rowView.findViewById(R.id.definitionBackgroundCell); 
    borderColour.setBackgroundColor(mInput.get(position).getValue2()); 
    textInputTV.setText(mInput.get(position).getValue0()); 
/*  if(parent.getId() == R.id.definitionTutorialRightTableLV || parent.getId() == R.id.definitionMainGameRightLV){ 
     borderColour.setBackgroundResource(R.drawable.definition_tutorial_box_border_grey); 
    }else{ 

    }*/ 
    return rowView; 
} 

,沒有什麼與適配器特別看中。我已經評論了邊框背景,因爲我正在測試顏色分配。因此,當我從Triplet的第三個參數中放置背景色時,我認爲我可以在主要活動中對其進行修改。

試圖修改每個視圖,並通知

private void checkAnswerValues(){ 
    for(int i = 0; i < tableLength; i++){ 
     //int leftCell = definitionWordsList.get(i).second; 

     //TESTING 
     int leftCell = testTripletArray.get(i).getValue1(); 
     int rightCell = definitionExplanationsList.get(i).second; 
     //TODO Doesn't work, doesn;t update the colours. No crashing but unsure 
     //TODO Don't think it's getting the right information, need to think how to access a view. 
     if(leftCell == rightCell){ 
      Log.i(LOG_TAG, "Match"); 
      correctAnswerCount++; 
      //TODO CHange border colours in both tables to green 
      testTripletArray.get(i).setAt2(Color.GREEN); 
     }else{ 
      Log.i(LOG_TAG, "No Match"); 
      //TODO Change border colours to red 
      testTripletArray.get(i).setAt2(Color.RED); 
     } 
    } 

    leftTripletAdapter.notifyDataSetChanged(); 

這是我希望用戶能夠按檢查答案按鈕的階段,它循環通過所有的定義和文字,看看他們是否比賽。它基於一個索引集,作爲Triple的第二個參數(如果您從0開始計數的話)。

我終於嘗試用setAt2更改三元組的背景色int,然後選擇顏色。在for循環之後,我通知適配器信息已更改。我當時希望適配器會更新「getView」並應用在color參數中找到的新參數。很遺憾沒有更新。

這裏的任何建議都會很棒,因爲我一直在測試很多不同的方法,但是我已經簡要介紹了。

感謝閱讀,我知道這是一個長期的問題。

回答

1

其中一個主要原因notifyDataSetChanged()不適用於您 - 是,您的適配器失去對您的列表的引用。初始化過程中是否曾經調用過testTripletArray = new ...異常?請始終做testTripletArray.clear(),然後testTripletArray.addall(theNewObjects)

+0

在添加我的單詞列表中的數據之前,我添加了'= new ArrayList'。另外我試圖清除數組列表。我什麼時候可以清除它?我目前根據您的建議將所有編輯的元素添加到持有人的三重陣列列表中。在for循環之後,我清除了我的testTripletArray,然後將數據從持有人arraylist添加到我的testTripleArray。但是,當我嘗試讀取顏色值時,它們都是-1。不知道爲什麼。我也在通知適配器後。將您的建議添加到我的問題的底部。 – CardDeath

+0

你的編輯不是我的意思。我只是想知道,如果你曾經在你的代碼中的其他地方調用'testTripletArray = new ...',我們無法看到。如果是,那麼使用我的解決方案你的編輯不起作用,因爲如果你真的有我描述的問題,你修改另一個對象比在你的適配器。 – beeb

+0

刪除了編輯。這是我的聲明:'private ArrayList > testTripletArray = new ArrayList <>();'在全局範圍內。我的初始化發生在下面的函數中:'testTripletArray = wordAndDefinitionList.getDefinitionWordsTriplet();'。這是我唯一給它賦值的時候。 – CardDeath