Android 是否用自定义适配器替换GridView中按钮单击时的按钮文本?

Android 是否用自定义适配器替换GridView中按钮单击时的按钮文本?,android,gridview,android-adapter,android-viewholder,Android,Gridview,Android Adapter,Android Viewholder,我有一个GridView,它是通过一个自定义GridViewAdapter创建的,它扩展了BaseAdapter来创建它的视图。GridView中的每个单元格都由一个按钮表示 在View-getView方法中,我使用一个ViewHolder来缓存按钮 holder.gridPanel.setText(panel.getNumberPanel()); 然后我尝试将OnClickListener应用于此按钮,但是按钮的文本似乎没有改变,即使Toast通知返回正确的值以将按钮的新文本设置为 hold

我有一个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中的按钮文本的正确方法是什么

代码:

静态类视图保持器{
按钮面板;
}
公共类GridViewAdapter扩展了BaseAdapter{
私人语境;
ArrayList小组成员;
专家组;
公共GridViewAdapter(上下文,ArrayList面板列表){
this.context=上下文;
this.panelList=小组成员;
}
@凌驾
public int getCount(){
返回panelList.size();
}
@凌驾
公共对象getItem(int位置){
返回小组成员。获取(位置);
}
@凌驾
公共长getItemId(int位置){
返回小组成员。indexOf(getItem(position));
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
if(convertView==null){
LayoutFlater充气器=(LayoutFlater)context.getSystemService(context.LAYOUT\u充气器\u服务);
convertView=充气机。充气(R.layout.game\u grid\u item\u layout,parent,false);
holder=新的ViewHolder();
holder.gridPanel=(按钮)convertView.findViewById(R.id.grid\u AlphabetPanel);
convertView.setTag(支架);
}否则{
holder=(ViewHolder)convertView.getTag();
}
panel=panelList.get(位置);
holder.gridPanel.setText(panel.getNumberPanel());
holder.gridPanel.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
Toast.makeText(上下文,panel.getAlphabetPanel(),Toast.LENGTH_SHORT.show();
holder.gridPanel.setText(panel.getAlphabetPanel());
}
});
返回视图;
}
//以下方法位于不同的活动中
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_游戏);
ArrayList panelList=新建ArrayList();
ArrayList alphaList=新的ArrayList();
ArrayList numberList=新的ArrayList();
字母表。添加(“A”);
字母表。添加(“B”);
字母表。添加(“C”);
字母表。添加(“D”);
字母表。添加(“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));
对于(int i=0;i<5;i++){
字符串alp=alphaList.get(i);
字符串numb=numberList.get(i);
面板对象=新面板(alp,NUB);
panelList.add(panelObject);
}
GridView面板Grid=(GridView)findViewById(R.id.GridView\u面板);
GridViewAdapter GridViewAdapter=新的GridViewAdapter(此,小组成员);
panelGrid.setAdapter(gridViewAdapter);
}

因此,如果有人想知道,我会给出一个答案

初始化ViewHolder时调用setOnClickListener是可行的,而在循环之外调用则不允许更改数据

代码:

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);
        holder.gridPanel.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                holder.gridPanel.setText(panel.getAlphabetPanel());
            }
        });

        convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }

您在哪里设置面板对象值?您是否确保Panel.getNumberPanel()和Panel.getAlphabetPanel()不会返回此位置的相同数据?@internal_class7我正在创建一个字母和数字的数组列表,作为主活动中的面板对象,并将其传递给适配器。getNumberPanel()getAlphabetPanel()只包含A=1,B=2,我已经检查了数据,因为数字是按钮上的文本,单击按钮会生成一个带有字母表的土司(但不会更改按钮的文本)。您是否调用setNumberPanel(1)和setAlphabetPanel(A)?或者您是否将两者都设置为1?由于适配器没有错误,您的数据看起来一定是弄乱了。您能否在设置的位置共享此代码,并显示完整的数据adapter@inner_class7我添加了额外的代码,我不认为我错了,因为Toast消息显示了正确的值这不是您的问题。。。我会发布正确的解决方案。这与你的适配器有关,我说你有问题时不对。
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);
        holder.gridPanel.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                holder.gridPanel.setText(panel.getAlphabetPanel());
            }
        });

        convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }