【问题标题】:Replace the text of a button on button click from a GridView with a custom adapter?用自定义适配器替换 GridView 中按钮单击时的按钮文本?
【发布时间】: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


【解决方案1】:

所以如果有人想知道,我来回答一下。

在初始化 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();
    }

【讨论】:

  • 这不是您遇到的问题...我将发布正确的解决方案。这和你的适配器有关,我说你有问题的时候是不对的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-05
相关资源
最近更新 更多