I'm trying to create a list where each element on that list has 6 buttons. When I'm at second position of that list, the buttons that I set OnClickListener are overriding the functionality of the buttons of the 1st position.
I implemented the getView function in the adapter like this:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder mViewHolder = null;
System.out.println("position: "+position);
if (convertView == null) {
mViewHolder = new ViewHolder();
convertView = inflater.inflate(R.layout.activity_card_query, parent, false);
mViewHolder.buttons[0] = (Button) convertView.findViewById(R.id.button1);
mViewHolder.buttons[1] = (Button) convertView.findViewById(R.id.button2);
mViewHolder.buttons[2] = (Button) convertView.findViewById(R.id.button3);
mViewHolder.buttons[3] = (Button) convertView.findViewById(R.id.button4);
mViewHolder.buttons[4] = (Button) convertView.findViewById(R.id.button5);
mViewHolder.buttons[5] = (Button) convertView.findViewById(R.id.button6);
convertView.setTag(mViewHolder);
}else{
mViewHolder = (ViewHolder) convertView.getTag();
}
int j;
if(cant<=6) j=cant;
else if(getCount()-1!=position)j=6*position+6;
else j=cant;
System.out.println("Caso: "+6*position+" "+j);
for(int i=6*position;i<j;i++){
System.out.println("Bank: "+data.get(i).mID+" "+data.get(i).mDicName);
mViewHolder.buttons[i%6].setGravity(Gravity.CENTER_HORIZONTAL);
if(data.get(i).mDicName.equals("Mercantil")) {
mViewHolder.buttons[i%6].setBackgroundResource(R.drawable.bank_mercantil);
mViewHolder.buttons[i%6].setText(data.get(i).mName);
mViewHolder.buttons[i%6].setTextColor(Color.WHITE);
//button.setHint(Integer.toString(data.get(i).mID));
mViewHolder.buttons[i%6].setHint(Integer.toString(i));
mViewHolder.buttons[i%6].setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
Intent i = new Intent(inflater.getContext(), Advertisement.class);
//i.putExtra("id", ((Button) v).getHint().toString());
i.putExtra("id", Integer.toString(data.get(Integer.parseInt(((Button) v).getHint().toString())).mID));
i.putExtra("name", data.get(Integer.parseInt(((Button) v).getHint().toString())).mName);
i.putExtra("bank", BanksInfo.MERCANTIL);
inflater.getContext().startActivity(i);
}
});
}
if(data.get(i).mDicName.equals("Venezuela")) {
mViewHolder.buttons[i%6].setBackgroundResource(R.drawable.bank_venezuela);
mViewHolder.buttons[i%6].setText(data.get(i).mName);
mViewHolder.buttons[i%6].setTextColor(Color.BLACK);
//button.setHint(Integer.toString(data.get(i).mID));
mViewHolder.buttons[i%6].setHint(Integer.toString(i));
mViewHolder.buttons[i%6].setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
Intent i = new Intent(inflater.getContext(), Advertisement.class);
//i.putExtra("id", ((Button) v).getHint().toString());
i.putExtra("id", Integer.toString(data.get(Integer.parseInt(((Button) v).getHint().toString())).mID));
i.putExtra("name", data.get(Integer.parseInt(((Button) v).getHint().toString())).mName);
i.putExtra("bank", BanksInfo.VENEZUELA);
inflater.getContext().startActivity(i);
}
});
}
if(data.get(i).mDicName.equals("Provincial")) {
mViewHolder.buttons[i%6].setBackgroundResource(R.drawable.bank_bbva);
mViewHolder.buttons[i%6].setTextColor(convertView.getResources().getColor(android.R.color.black));
mViewHolder.buttons[i%6].setText(data.get(i).mName);
//button.setHint(Integer.toString(data.get(i).mID));
mViewHolder.buttons[i%6].setHint(Integer.toString(i));
mViewHolder.buttons[i%6].setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
Intent i = new Intent(inflater.getContext(), Advertisement.class);
//i.putExtra("id", ((Button) v).getHint().toString());
i.putExtra("id", Integer.toString(data.get(Integer.parseInt(((Button) v).getHint().toString())).mID));
i.putExtra("name", data.get(Integer.parseInt(((Button) v).getHint().toString())).mName);
i.putExtra("bank", BanksInfo.BBVA);
inflater.getContext().startActivity(i);
}
});
}
if(data.get(i).mDicName.equals("Commerce")) {
mViewHolder.buttons[i%6].setBackgroundResource(R.drawable.bank_commerce);
mViewHolder.buttons[i%6].setTextColor(convertView.getResources().getColor(android.R.color.white));
mViewHolder.buttons[i%6].setText(data.get(i).mName);
//button.setHint(Integer.toString(data.get(i).mID));
mViewHolder.buttons[i%6].setHint(Integer.toString(i));
mViewHolder.buttons[i%6].setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
Intent i = new Intent(inflater.getContext(), Advertisement.class);
//i.putExtra("id", ((Button) v).getHint().toString());
i.putExtra("id", Integer.toString(data.get(Integer.parseInt(((Button) v).getHint().toString())).mID));
i.putExtra("name", data.get(Integer.parseInt(((Button) v).getHint().toString())).mName);
i.putExtra("bank", BanksInfo.COMMERCE);
inflater.getContext().startActivity(i);
}
});
}
}
if(getCount()-1==position)
if(cant%6!=0){
for(int i=(cant%6);i<6;i++){
mViewHolder.buttons[i].setBackgroundResource(R.drawable.extra);
mViewHolder.buttons[i].setText("");
mViewHolder.buttons[i].setHint("");
mViewHolder.buttons[i].setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
}
});
}
}
return convertView;
}
Thanks
Never ever attach onClicklistener in getView
. Instead use:
yourGridView.setOnItemClickListener(..
That's because getView
reuses old views and their on click methods. So after some scrolling your image views are correct but your on click methods are totally messed up and could be behind every image! Hope it helps.