2017-01-10 38 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