我有一个列表视图,每行上都有一个图像现在我想要的是我想要改变那个图像onclick,现在如果它是两个图像就会非常简单。我可以使用布尔值并设置项目的位置& #39;要更改的图像。 但我的情况涉及两个以上的图像 在第一次单击图像更改为image0 第二次单击图像更改为image1 第3次单击图像更改为image2 并在第4次点击图像更改回图像 并且图像切换非常精细但是一旦重新加载列表,一切都会随着切换图像位置从0变为8而改变,依此类推。我也试过设置默认行为。 所以,这是我的示例代码
@Override
public View getView( int position, View convertView, ViewGroup parent) {
View vi=convertView;
if(convertView==null){
/********** Inflate tabitem.xml file for each row ( Defined below ) ************/
vi = inflater.inflate(R.layout.tabitem, null);
/******** View Holder Object to contain tabitem.xml file elements ************/
holder=new ViewHolder();
holder.text=(TextView)vi.findViewById(R.id.text);
holder.text1=(TextView)vi.findViewById(R.id.text1);
holder.image=(ImageView)vi.findViewById(R.id.image);
holder.image.setOnClickListener(this);
holder.image.setTag(position);
/************ Set holder with LayoutInflater ************/
vi.setTag(holder);
}
else
holder=(ViewHolder)vi.getTag();
if(data.size()<=0)
{
holder.text.setText("No Data");
}
else
{
/***** Get each Model object from Arraylist ********/
tempValues = (ListModel) data.get(position);
Log.i("Mainly at", Integer.toString(position)+"state is "+tempValues.getStatus());
/************ Set Model values in Holder elements ***********/
holder.text.setText(tempValues.getCompanyName());
holder.text1.setText(tempValues.getUrl());
// holder.image.setImageResource(R.drawable.image0);
if(tempValues.getStatus().equals(ListModel.imageStateNone))
{
holder.image.setImageResource(R.drawable.image0);
}
if(tempValues.getStatus().equals(ListModel.imageStateAnotherCase))
{
if(tempValues.getImageStateAtPos()==0){
holder.image.setImageResource(R.drawable.image0);// or what it should be in default
}
if(tempValues.getImageStateAtPos()==1){
holder.image.setImageResource(R.drawable.plus);// or what it should be in default
}
if(tempValues.getImageStateAtPos()==2){
holder.image.setImageResource(R.drawable.minus);// or what it should be in default
}
}
/******** Set Item Click Listner for LayoutInflater for each row ***********/
// vi.setOnClickListener(new OnItemClickListener(position));
}
return vi;
}
@Override
public void onClick(View v) {
int position = (Integer)v.getTag();
tempValues.setStateAsChange();
Log.e("clicked at", Integer.toString(tempValues.getImageStateAtPos())+"Changed state is "+tempValues.getStatus()+"And position"+Integer.toString(position));
tempValues.setImageStateAtPos(tempValues.getImageStateAtPos()+1);
if(tempValues.getImageStateAtPos()>2){
tempValues.setImageStateAtPos(0);
}
// holder.image.setImageResource(R.drawable.plus);
LinearLayout rl = (LinearLayout)v.getParent();
holder.image = (ImageView)rl.getChildAt(0);
// ((ImageView) v).setImageResource(R.drawable.plus);
if(tempValues.getImageStateAtPos()==0){
holder.image.setImageResource(R.drawable.image0);// or what it should be in default
}
if(tempValues.getImageStateAtPos()==1){
holder.image.setImageResource(R.drawable.plus);// or what it should be in default
}
if(tempValues.getImageStateAtPos()==2){
holder.image.setImageResource(R.drawable.minus);// or what it should
}
if(tempValues.getImageStateAtPos()==3){
holder.image.setImageResource(R.drawable.image10);
}
}
}
ListModel代码在这里 private String status =&#34;&#34;;
public static final String imageStateNone="none";
public static final String imageStateAnotherCase="changed";
private int state;
/****
HashMap<Integer, String> set=new HashMap<Integer, String>();
public void setStateAsnone(int pos)
{
set.put(pos,imageStateNone );
}
public void setStateAsChange(int pos)
{
set.put(pos, imageStateAnotherCase);
//this.status = imageStateAnotherCase;
}
public String getStatus(int pos)
{
return set.get(pos);
}
public void setImageStateAtPos(int state){
this.state=state;
}
public int getImageStateAtPos(){
return state;
}
public void setStateAsnone()
{
this.status = imageStateNone;
}
public void setStateAsChange()
{
this.status = imageStateAnotherCase;
}
public String getStatus()
{
return status;
}
最后在mainactivity中添加数据
for (int i = 0; i < 11; i++) {
final ListModel sched = new ListModel();
/******* Firstly take data in model object ******/
sched.setCompanyName("Company "+i);
sched.setImage("image"+i);
sched.setUrl("http:\\\\www."+i+".com");
sched.setImageStateAtPos(0);
sched.setStateAsnone();
/******** Take Model Object in ArrayList **********/
CustomListViewValuesArr.add(sched);
}
enter code here
一切都像魅力一样,直到列表重新加载当列表重新加载尝试使用状态位置指示器使用hashmap时,一切都搞砸了。现在我想知道如何在重新加载listview时停止更改图像切换的位置。 帮忙。
答案 0 :(得分:1)
在ListModel对象中放入一个数据,表示绑定到它的行项是否发生了变化。然后将此语句添加到getView()
这样的内容中:
getView(){
if(model.getImageSate()==ImageState.NONE){
holder.image.setImageResource(R.drawable.image);// or what it should be in default
}
if(model.getImageSate()==ImageState.YetAnotherState){,
holder.image.setImageResource(R.drawable.theOtherImage);
}
...
}
修改强>
我假设您正在为ListItem使用自定义对象。所以这里
class ListModel{
// you may use a String variable or an enumeration for this. ill use a
string field for this example:
public static final String imageStateNone="none";
public static final String imageStateAnotherCase="anothercase";
private String imageState;
//getter - setter for imageState field
}
如果您使用sdk或其他库中的预定义类。 继承它并把你的变量放在这样:
class ExtendedObject extends ListModel{
public static final String imageStateNone="none";
public static final String imageStateAnotherCase="anothercase";
private String imageState;
//getter - setter for imageState field
}
不要忘记使用string.equals(“”)来比较字符串。
答案 1 :(得分:0)
好的,这是非常简单和正统的做法。
创建一个整数变量。并用0初始化它。
Public int flag = 0;
If(flag==0)
{
// change to image 2
flag=flag+1;
} else if (flag==1)
{
// change to image 3
flag=flag+1;
} else if (flag==2)
{
// change to image 4
flag=0;
}