【发布时间】:2015-12-03 17:04:34
【问题描述】:
我有一个 GridView,它是通过自定义 GridViewAdapter 创建的,它扩展了 BaseAdapter 以创建其视图。 GridView 中的每个单元格都由一个按钮表示。
在 View 的 getView 方法内部,我使用 ViewHolder 来缓存按钮。
holder.gridPanel.setText(panel.getNumberPanel());
然后我尝试将 OnClickListener 应用于此按钮,但是即使 Toast 通知返回正确的值以将按钮的新文本设置为,按钮的文本似乎也没有改变。
holder.gridPanel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(context, panel.getAlphabetPanel(), Toast.LENGTH_SHORT).show();
holder.gridPanel.setText(panel.getAlphabetPanel());
}
});
更改已存储在 ViewHolder 内的按钮文本的正确方法是什么?
代码:
static class ViewHolder {
Button gridPanel;
}
public class GridViewAdapter extends BaseAdapter {
private Context context;
ArrayList<Panel> panelList;
Panel panel;
public GridViewAdapter(Context context, ArrayList<Panel> panelList){
this.context = context;
this.panelList = panelList;
}
@Override
public int getCount() {
return panelList.size();
}
@Override
public Object getItem(int position) {
return panelList.get(position);
}
@Override
public long getItemId(int position) {
return panelList.indexOf(getItem(position));
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.game_grid_item_layout, parent, false);
holder = new ViewHolder();
holder.gridPanel = (Button) convertView.findViewById(R.id.grid_AlphabetPanel);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
panel = panelList.get(position);
holder.gridPanel.setText(panel.getNumberPanel());
holder.gridPanel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(context, panel.getAlphabetPanel(), Toast.LENGTH_SHORT).show();
holder.gridPanel.setText(panel.getAlphabetPanel());
}
});
return convertView;
}
// below methods are in a different activity
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_game);
ArrayList<Panel> panelList = new ArrayList<>();
ArrayList<String> alphaList = new ArrayList<>();
ArrayList<String> numberList = new ArrayList<>();
alphaList.add("A");
alphaList.add("B");
alphaList.add("C");
alphaList.add("D");
alphaList.add("E");
numberList.add(Integer.toString(1));
numberList.add(Integer.toString(2));
numberList.add(Integer.toString(3));
numberList.add(Integer.toString(4));
numberList.add(Integer.toString(5));
for(int i = 0; i < 5; i++){
String alp = alphaList.get(i);
String numb = numberList.get(i);
Panel panelObject = new Panel(alp, numb);
panelList.add(panelObject);
}
GridView panelGrid = (GridView) findViewById(R.id.gridView_Panel);
GridViewAdapter gridViewAdapter = new GridViewAdapter(this, panelList);
panelGrid.setAdapter(gridViewAdapter);
}
【问题讨论】:
-
您在哪里设置 Panel 对象值?并且您确定 panel.getNumberPanel() 和 panel.getAlphabetPanel() 不会为该职位返回相同的数据?
-
@inner_class7 我正在创建一个包含字母和数字的 ArrayList 作为主要活动中的 Panel 对象,并将其传递给适配器。 getNumberPanel() 和 getAlphabetPanel() 仅包含 A = 1,B = 2,我检查了数据,因为数字是按钮上的文本,单击按钮会生成带有字母表的 Toast(但不会更改文本按钮)
-
你在调用 setNumberPanel(1) & setAlphabetPanel(A) 吗?还是您将两者都设置为1?似乎您必须将数据弄乱,因为您的适配器没有错。能否请您在设置它的位置分享此代码,并显示完整的适配器
-
@inner_class7 我添加了额外的代码,我认为我没有出错,因为 Toast 消息显示了正确的值
标签: android gridview android-adapter android-viewholder