[英]Why background images of buttons are changing for last list item's button only,when I click on any list item's button?
我已经创建了带有适配器类的列表视图,其中在列表项中,我给出了三个按钮。 我需要更改该按钮和其他按钮的背景图像。 我有5个清单项目,每个项目都有自己的按钮。
现在,当我单击第一,第二至第五个列表项的按钮时,最后一张图像的背景仅在变化。 如果我单击各个按钮,则每个列表项按钮的背景图像应更改,具体取决于逻辑。 它仅在最后一个列表项中发生。
如果有人知道该怎么做,请帮助我。
代码是:
public class MainActivity extends ListActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentView(R.layout.activity_main);
init();
}
private void init() {
LayoutInflater inflater1 = (LayoutInflater)this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = inflater1.inflate(R.layout.datelabel, null);
setListAdapter(new EventListAdapter(this));
ListView listView = getListView();
listView.setOnItemLongClickListener(new OnItemLongClickListener() {
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
Toast.makeText(MainActivity.this, "tapped on position " + position, Toast.LENGTH_SHORT).show();
return false;
}
});
}
@Override
protected void onListItemClick(ListView l, View v, int position, long id)
{
((EventListAdapter)getListAdapter()).toggle(position);
}
private class EventListAdapter extends BaseAdapter {
private static final int VISIBLE = 0;
private static final int GONE = 8;
private TextView textViewForDateHeader;
private TextView textViewTitle;
private TextView textViewDialogue;
private TextView textViewHeader;
private ImageButton buttonForCheckMark;
private ImageButton buttonForDelete;
private View buttonForRemainder;
public EventListAdapter(Context context)
{
mContext = context;
}
public int getCount() {
return mTitles.length;
}
public Object getItem(int position) {
return position;
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View myView, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
myView = inflater.inflate(R.layout.activity_main, null);
textViewTitle = (TextView) myView.findViewById(R.id.textViewTitle);
textViewTitle.setText(mTitles[position]);
textViewDialogue = (TextView) myView.findViewById(R.id.textViewDialog);
textViewDialogue.setText(mDialogue[position]);
textViewDialogue.setVisibility(mExpanded[position] ? VISIBLE : GONE);
buttonForCheckMark = (ImageButton) myView.findViewById(R.id.buttonForCheckMark);
buttonForCheckMark.setVisibility(mExpanded[position] ? VISIBLE : GONE);
buttonForDelete = (ImageButton) myView.findViewById(R.id.buttonForDelete);
buttonForDelete.setVisibility(mExpanded[position] ? VISIBLE : GONE);
buttonForRemainder = (ImageButton) myView.findViewById(R.id.buttonForRemainder);
buttonForRemainder.setVisibility(mExpanded[position] ? VISIBLE : GONE);
buttonForRemainder.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this, "tapped on remainder", Toast.LENGTH_SHORT).show();
}
});
buttonForCheckMark.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this, "tapped on checkMark", Toast.LENGTH_SHORT).show();
buttonForCheckMark.setBackgroundResource(R.drawable.ic_launcher);
buttonForDelete.setBackgroundResource(R.drawable.ic_navigation_cancel);
buttonForCheckMark.setClickable(false);
buttonForDelete.setClickable(true);
}
});
buttonForDelete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this, "tapped on delete", Toast.LENGTH_SHORT).show();
buttonForCheckMark.setBackgroundResource(R.drawable.ic_navigation_accept);
buttonForCheckMark.setClickable(true);
buttonForDelete.setBackgroundResource(R.drawable.ic_drawer);
buttonForDelete.setClickable(false);
}
});
return myView;
}
public void toggle(int position) {
mExpanded[position] = !mExpanded[position];
notifyDataSetChanged();
}
/**
* Remember our context so we can use it when constructing views.
*/
private Context mContext;
/**
* Our data, part 1.
*/
// private ImageButton[] mButtons = {
//
// "R.drawable.remainder",
//
// };
private String[] mHeader =
{
"12 Jan, 2013",
"13 Feb, 2013",
"31 Mar, 2013",
"15 Aug, 2013",
"7 Sep, 2013"
};
/**
* Our data, part 1.
*/
private String[] mTitles =
{
"Event 1",
"Event 2",
"Event 3",
"Event 4",
"Event 5"
};
/**
* Our data, part 2.
*/
private String[] mDialogue =
{
"wuszuogwfuieffufuhuysugdueljwihadghgxdhgyhghsdgyigwuweyuqaGDHGYHGHGAdhgyhigxgxgeuyehu.",
"dgusduugyujguegytgujgdugwjhiuyg7wtqUYGYYgyijyiufufjguhgdugfhgfhgfgfhgfhghfghifgyi,dgwsdtgyfytfiuwt,",
"rtygygghtudggyjhgujtugdhhguyuaUUUUDJYUIDHUJHDIIDUJDHDUJHDIDIOUYhujtdugyhdgg",
"gjhuwjsgudggdudgjqhasdgdhgjdhushjaguhguwegagsdgygydgfgdcgycg",
"fhdgyhdfhfgdyhhwsddgyuduuufguugwugdfgugdgooduiuduiuduuduiuiuidudiiwdiou"
};
/**
* Our data, part 3.
*/
private boolean[] mExpanded =
{
false,
false,
false,
false,
false,
false,
false,
false
};
}
}
而不是在适配器中具有私有iVar。您应该将它们实例化为getView()
方法中的final
变量。当前在侦听器中设置新图像……但是变量指向最后创建的按钮的地址只要。
更新您的代码,这样
private class EventListAdapter extends BaseAdapter {
/// other things
//private TextView textViewForDateHeader; // remove such private vars
.. other methods
public View getView(int position, View myView, ViewGroup parent) {
//other code
final ImageButton buttonForCheckMark = (ImageButton) myView.findViewById(R.id.buttonForCheckMark);
buttonForCheckMark.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
buttonForCheckMark.setBackgroundResource(R.drawable.ic_launcher);
//now the buttonForCheckMark refers to the imageview your instantiated above .. not the private var
//other code
}
});
编辑
为了使高亮持久,请在适配器内部添加一个布尔数组。
private boolean highlighted[];
在EventListAdapter()
内部也将其初始化为mTitles大小
public EventListAdapter(Context context)
{
highlighted = new boolean[mTitles.length];
mContext = context;
}
现在在onListener中..检查highlighted [clickPos] == true ..禁用它,如果它为false ..将其设置为true; 您还可以使用此值将突出显示内容保留在getView()
在getView
方法中移动以下声明。
TextView textViewForDateHeader;
TextView textViewTitle;
TextView textViewDialogue;
TextView textViewHeader;
ImageButton buttonForCheckMark;
ImageButton buttonForDelete;
View buttonForRemainder;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.