Android ListView按钮单击获取行

时间:2016-02-16 21:57:38

标签: java android listview

我有一个listview的自定义适配器类,我希望能够通过单击其上的按钮来访问特定行的内容。我试图创建一个ViewHolder,但是当我尝试单击它时出现NPE错误。

static class ViewHolder {
    TextView camera;
    TextView players;
    TextView max_players;
    ImageView privata;
    Button Buton;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {

    String variabile[] = getItem(position).split("\\s+");
    LayoutInflater linflater = LayoutInflater.from(getContext());
        View customView = linflater.inflate(R.layout.custom_row, parent, false);
        final ViewHolder holder = new ViewHolder();
        holder.camera = (TextView) customView.findViewById(R.id.Nume);
        holder.players = (TextView) customView.findViewById(R.id.players);
        holder.max_players = (TextView) customView.findViewById(R.id.max_players);
        holder.privata = (ImageView) customView.findViewById(R.id.privata);
        holder.Buton = (Button) customView.findViewById(R.id.Buton);
        holder.camera.setText(variabile[0]);
        if (!variabile[1].equals("true")) {
            parola = false;
            holder.privata.setVisibility(View.INVISIBLE);
        }
        holder.players.setText(variabile[2]);
        holder.max_players.setText(variabile[3]);
        room_id = variabile[4];
        nume = variabile[5];
        holder.Buton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                hash = new HashMap<String, String>();
                hash.put("name", nume);
                hash.put("room", room_id);
                if (intra) {
                    holder.Buton.setText("Iesi");
                    site = siteul + "/join";
                    intra = false;
                } else {
                    holder.Buton.setText("Intra");
                    site = siteul + "/leave";
                    intra = true;
                }
                new ATask().execute(site);
            }
        });
    return customView;
}

2 个答案:

答案 0 :(得分:0)

你需要检查convertView是否为空,因此它已经被访问过,然后将持有者存储在标签中

    ViewHolder holder;
    if (convertView == null) {
        LayoutInflater linflater = LayoutInflater.from(getContext());
        holder = linflater.inflate(R.layout.custom_row, parent, false);....
        convertView.setTag(holder);
    }else{
      holder = (ViewHolder) convertView.getTag();
    }//Common code

答案 1 :(得分:0)

使用ViewHolder模式时,应检查convertView是否为null或之前是否已在getView方法中创建,之后是否使用 setTag getTag 方法。像这样:

    if (convertView == null) 
    {
        LayoutInflater linflater = LayoutInflater.from(getContext());
        convertView = linflater.inflate(R.layout.your_list_item_view, parent, false);
         viewHolder.textView = (TextView)convertView.findViewById([the id]);
         .
         .
         .

        convertView.setTag(holder);
    }
    else
    {
      holder = (ViewHolder) convertView.getTag();
    }
相关问题