Android 列表视图编辑所有视图外观
Android List View Edit All view apperance
首先我想说我在这里没有使用视图。我只有 5 个视图,我通过两次 selection 单击来交换它们。我在网上浏览了几个问题,其中大部分与 Recycler 和 getChildAt 等有关,但它对我不起作用。
我了解适配器的工作原理,所以我想我必须将我的背景颜色传递到我的适配器中。只是快速了解一下我想在这里做的事情。用户可以随机排列列表项,它们必须对应于它旁边的 table。一旦用户认为答案正确,他们就会点击提交按钮。此时背景颜色应更改为绿色或红色以表示正确和错误。
但是,当我想访问所有视图时,我似乎无法处理它。
正在获取适配器的数据源
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 来使用三联体,最初这是一对,但我决定包括颜色 Int。
填充适配器
//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);
}
原来这是标准的adapter和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 的第三个参数的背景颜色放在这里时,我认为我可以在主 activity 中修改它。
正在尝试修改各个视图并通知
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,然后 select 更改颜色。在 for 循环之后,我通知适配器信息已更改。然后我希望适配器会更新 "getView" 并应用在颜色参数中找到的新参数。不幸的是没有更新。
这里的任何建议都会很好,因为我一直在测试很多不同的方法,但我没有找到。
感谢阅读,我知道这是一个很长的问题。
notifyDataSetChanged()
对您不起作用的主要原因之一是,您的适配器丢失了对列表的引用。你有没有在初始化时调用 testTripletArray = new ...
异常?请总是 testTripletArray.clear()
然后 testTripletArray.addall(theNewObjects)
.
首先我想说我在这里没有使用视图。我只有 5 个视图,我通过两次 selection 单击来交换它们。我在网上浏览了几个问题,其中大部分与 Recycler 和 getChildAt 等有关,但它对我不起作用。
我了解适配器的工作原理,所以我想我必须将我的背景颜色传递到我的适配器中。只是快速了解一下我想在这里做的事情。用户可以随机排列列表项,它们必须对应于它旁边的 table。一旦用户认为答案正确,他们就会点击提交按钮。此时背景颜色应更改为绿色或红色以表示正确和错误。
但是,当我想访问所有视图时,我似乎无法处理它。
正在获取适配器的数据源
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 来使用三联体,最初这是一对,但我决定包括颜色 Int。
填充适配器
//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);
}
原来这是标准的adapter和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 的第三个参数的背景颜色放在这里时,我认为我可以在主 activity 中修改它。
正在尝试修改各个视图并通知
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,然后 select 更改颜色。在 for 循环之后,我通知适配器信息已更改。然后我希望适配器会更新 "getView" 并应用在颜色参数中找到的新参数。不幸的是没有更新。
这里的任何建议都会很好,因为我一直在测试很多不同的方法,但我没有找到。
感谢阅读,我知道这是一个很长的问题。
notifyDataSetChanged()
对您不起作用的主要原因之一是,您的适配器丢失了对列表的引用。你有没有在初始化时调用 testTripletArray = new ...
异常?请总是 testTripletArray.clear()
然后 testTripletArray.addall(theNewObjects)
.