Java Android ListView点击按钮获取行
我有一个用于listview的自定义适配器类,我希望能够通过单击特定行上的按钮来访问该行的内容。我试图创建一个ViewHolder,但是当我尝试单击它时,我得到了一个NPE错误Java Android ListView点击按钮获取行,java,android,listview,Java,Android,Listview,我有一个用于listview的自定义适配器类,我希望能够通过单击特定行上的按钮来访问该行的内容。我试图创建一个ViewHolder,但是当我尝试单击它时,我得到了一个NPE错误 static class ViewHolder { TextView camera; TextView players; TextView max_players; ImageView privata; Button Buton; } @Override public View g
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;
}
静态类视图保持器{
文本视图摄像机;
文本视图播放器;
TextView max_播放器;
ImageView privata;
巴顿;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
字符串variabile[]=getItem(position).split(\\s+);
LayoutInflater linflater=LayoutInflater.from(getContext());
视图customView=linflater.flate(R.layout.custom_行,父项,false);
最终视图持有者=新的视图持有者();
holder.camera=(TextView)customView.findViewById(R.id.Nume);
holder.players=(TextView)customView.findViewById(R.id.players);
holder.max\u players=(TextView)customView.findViewById(R.id.max\u players);
holder.privata=(ImageView)customView.findViewById(R.id.privata);
holder.Buton=(按钮)customView.findViewById(R.id.Buton);
holder.camera.setText(变量[0]);
如果(!variabile[1].equals(“true”)){
帕罗拉=假;
持有者.privata.setVisibility(视图.不可见);
}
holder.players.setText(variabile[2]);
holder.max_players.setText(variabile[3]);
房间id=可变[4];
nume=可变[5];
holder.Buton.setOnClickListener(新视图.OnClickListener(){
公共void onClick(视图v){
hash=新的HashMap();
hash.put(“name”,nume);
hash.put(“房间”,房间id);
如果(内部){
持有人:Buton.setText(“Iesi”);
site=siteul+“/join”;
内部=假;
}否则{
持有人:Buton.setText(“内部”);
site=siteul+“/离开”;
内部=真;
}
新建ATask().execute(站点);
}
});
返回自定义视图;
}
您需要检查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
当使用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();
}
上面说holder不能是linflater。充气(…),因为它应该是一个视图。同样,holder不能是linflater。充气(…),因为它应该是一个视图。现在它工作了,但我遇到了另一个错误。当我按下按钮时,文本显示正确,但无论按下哪个按钮,我声明的全局保持器似乎与最后一行的保持器相等。我正在尝试从其他函数修改其内容。请将新错误添加为新问题或编辑您的问题,包括完整的适配器实现。这样我们就能知道出了什么问题