Android 动态更改自定义列表项背景
我正在创建一个带有收藏夹功能的自定义列表视图,但我不知道如何在单击时更改收藏夹图像背景。当我简单地更改收藏夹图标的背景时,它会在滚动时自动更改另一个收藏夹图像背景的背景。请检查以下代码:Android 动态更改自定义列表项背景,android,Android,我正在创建一个带有收藏夹功能的自定义列表视图,但我不知道如何在单击时更改收藏夹图像背景。当我简单地更改收藏夹图标的背景时,它会在滚动时自动更改另一个收藏夹图像背景的背景。请检查以下代码: public class CustomArrayAdapter extends BaseAdapter { private Activity activity; private LayoutInflater inflater = null; ArrayList<Customlist
public class CustomArrayAdapter extends BaseAdapter {
private Activity activity;
private LayoutInflater inflater = null;
ArrayList<Customlist> list;
DecimalFormat formatter = new DecimalFormat("#,##,###");
public CustomArrayAdapter(Activity a, ArrayList<Customlist> list) {
activity = a;
inflater = (LayoutInflater) activity
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
this.list = list;
}
public int getCount() {
return list.size();
}
public Object getItem(int position) {
return position;
}
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, View convertView,
final ViewGroup parent) {
TextView txt_unit, txt_state, txt_price, term_left, customr;
TextView install_date;
final ImageView fav;
View view = convertView;
if (convertView == null)
view = inflater.inflate(R.layout.list_item, null);
customr = (TextView) view.findViewById(R.id.customr);
txt_state = (TextView) view.findViewById(R.id.txt_state);
install_date = (TextView) view.findViewById(R.id.install_date);
term_left = (TextView) view.findViewById(R.id.term_left);
txt_price = (TextView) view.findViewById(R.id.txt_price);
fav = (ImageView) view.findViewById(R.id.fav);
txt_unit = (TextView) view.findViewById(R.id.txt_unit);
fav.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
// fav = (ImageView)v.findViewById(R)
fav.setBackgroundResource(R.drawable.favourite_select);
Toast.makeText(activity, "click", 1).show();
}
});
// set values
customr.setText(list.get(position).getCUSTOMER());
txt_state.setText(list.get(position).getSTATE_NAME());
install_date.setText(list.get(position).getINSTALL_DATE());
term_left.setText(list.get(position).getTREM_LEFT());
String price = formatter.format(Integer.parseInt(list.get(position)
.getRUPEES()));
return view;
}
}
公共类CustomArrayAdapter扩展BaseAdapter{
私人活动;
专用充气机=空;
数组列表;
DecimalFormat formatter=新的DecimalFormat(“#,#,#,#,#,##”);
公共CustomArrayAdapter(活动a,ArrayList列表){
活动=a;
充气器=(充气器)活动
.getSystemService(上下文布局\充气机\服务);
this.list=列表;
}
public int getCount(){
返回list.size();
}
公共对象getItem(int位置){
返回位置;
}
公共长getItemId(int位置){
返回位置;
}
@凌驾
公共视图getView(最终整型位置,视图转换视图,
最终视图组(父视图){
text查看文本单位、文本状态、文本价格、术语左、客户;
TextView安装日期;
最终图像视图fav;
视图=转换视图;
if(convertView==null)
视图=充气机。充气(R.layout.list_项,空);
customr=(TextView)view.findViewById(R.id.customr);
txt_state=(TextView)view.findViewById(R.id.txt_state);
install\u date=(TextView)view.findViewById(R.id.install\u date);
term_left=(TextView)view.findViewById(R.id.term_left);
txt\u price=(TextView)view.findViewById(R.id.txt\u price);
fav=(ImageView)view.findViewById(R.id.fav);
txt\u单位=(TextView)view.findViewById(R.id.txt\u单位);
fav.setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图v){
//TODO自动生成的方法存根
//fav=(图像视图)v.findviewbyd(R)
fav.setBackgroundResource(R.drawable.Favorite_select);
Toast.makeText(活动“单击”,1.show();
}
});
//设定值
customr.setText(list.get(position.getCUSTOMER());
txt_state.setText(list.get(position.getSTATE_NAME());
install_date.setText(list.get(position.getINSTALL_date());
term_left.setText(list.get(position.getTREM_left());
String price=formatter.format(Integer.parseInt(list.get)(position)
.getrupes());
返回视图;
}
}
您需要在ViewHolder模式上实现适配器:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
ViewHoldler holder = null;
if (convertView == null) {
convertView = LayoutInflater.from(ctx).inflate(
R.layout.frag_home_gridview_item, null, false);
holder = new ViewHoldler();
holder.iv = (ImageView) convertView
.findViewById(R.id.gridview_item_label);
holder.tv = (TextView) convertView
.findViewById(R.id.gridview_item_name);
convertView.setTag(holder);
} else {
holder = (ViewHoldler) convertView.getTag();
}
holder.tv.setText(getItem(position));
holder.iv.setImageResource(this.ids[position]);
return convertView;
}
private class ViewHoldler {
ImageView iv;
TextView tv;
}
首先,您需要在ViewHolder模式上实现适配器:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
ViewHoldler holder = null;
if (convertView == null) {
convertView = LayoutInflater.from(ctx).inflate(
R.layout.frag_home_gridview_item, null, false);
holder = new ViewHoldler();
holder.iv = (ImageView) convertView
.findViewById(R.id.gridview_item_label);
holder.tv = (TextView) convertView
.findViewById(R.id.gridview_item_name);
convertView.setTag(holder);
} else {
holder = (ViewHoldler) convertView.getTag();
}
holder.tv.setText(getItem(position));
holder.iv.setImageResource(this.ids[position]);
return convertView;
}
private class ViewHoldler {
ImageView iv;
TextView tv;
}
第二次,使用部分刷新机制
更改目标视图
的背景
:
private void refreshPartially(int position){
int firstVisiblePosition = listview.getFirstVisiblePosition();
int lastVisiblePosition = listview.getLastVisiblePosition();
if(position>=firstVisiblePosition && position<=lastVisiblePosition){
View view = listview.getChildAt(position - firstVisiblePosition);
if(view.getTag() instanceof ViewHolder){
ViewHolder vh = (ViewHolder)view.getTag();
//holder.play.setBackgroundResource(resId);//Do something here.
...
}
}
}
仍然遇到同样的问题。我的代码中有什么需要更改的?很紧急。最终ViewHolder ViewHolder=新的ViewHolder();if(convertView==null){view=inflater.inflate(R.layout.list_item,null);}else{view=convertView;((ViewHolder)view.getTag()).fav.setTag(list.get(position));}参见SilentKnight的答案。他创建了ViewHolder。您需要创建ViewHolder类,并在其中包含自定义列表项的所有视图,然后在getView中执行相应的实现。我知道这是一个非常常见且简单的问题,但是是的,我创建了ViewHolder类并在holder类中添加了所有视图。我不知道我做错了什么?我已经拉刷新类列表视图,所以它将保持相同位置的图像背景?