提前感谢,如果我在解释问题时误解了某个地方,请原谅我
我有一个Listview和一个自定义ArrayAdapter,自定义ArrayAdapter的布局如下。
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_marginLeft="48dp"
android:layout_marginTop="14dp"
android:text="Medium Text"
android:textAppearance="?android:attr/textAppearanceMedium" />
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/textView1"
android:layout_alignBottom="@+id/textView1"
android:layout_alignParentRight="true"
android:layout_marginRight="43dp"
android:text="Button" />
</RelativeLayout>
和自定义数组适配器java代码如下。
public class CustomArrayAdapter extends ArrayAdapter<String>{
Context context;
ArrayList<String> list=new ArrayList<String>();
public CustomArrayAdapter(Context con,ArrayList<String> data) {
// TODO Auto-generated constructor stub
super(con,R.layout.adapter_layout,data);
this.context=con;
this.list=data;
}
@Override
public View getView(int postion, View arg1, ViewGroup parent) {
// TODO Auto-generated method stub
//LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
//View view=inflater.inflate(R.layout.adapter_layout, parent,false);
Myclass item=new Myclass(context);
/*TextView tv=(TextView)view.findViewById(R.id.textView1);
Button button=(Button)view.findViewById(R.id.button1);
item.SetContextForTextView(tv,list.get(postion));
item.SetContextForTheButton(button);
tv.setText(list.get(postion));*/
item.setView();
//item.setText(list.get(postion));
return item.getView();
}
}
由于我为列表视图的每个项目创建了一个单独的Myclass对象,因此下面给出了Myclass的代码。
public class Myclass {
TextView tv;
Button button;
Context context;
View view;
LayoutInflater inflater;
public Myclass(Context con)
{
context=con;
}
public void setText(String text)
{
this.tv.setText(text);
}
public String getText()
{
return this.tv.getText().toString();
}
public void SetContextForTextView(TextView text,String data)
{
tv=text;
setText(data);
}
public void SetContextForTheButton(Button btn)
{
button=btn;
button.setOnClickListener(button_click);
}
public OnClickListener button_click=new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
setText("hi...");
}
};
public void setView()
{
inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view=inflater.inflate(R.layout.adapter_layout,null);
tv=(TextView)view.findViewById(R.id.textView1);
button=(Button)view.findViewById(R.id.button1);
button.setOnClickListener(button_click);
}
public View getView()
{
return view;
}
}
因为在按钮上单击每个列表项我将TextView的文本更新为“hi ...”它完美地工作但是当我滚动更新的结果时刷新。
我对此进行了大量搜索,但无法找到答案。
请大家帮忙解决这个问题。
在滚动结果之前看起来像这样
滚动后的结果如下所示
答案 0 :(得分:2)
适配器正在刷新,这是正常的方法。
@Override
public View getView(int postion, View convertView, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View v = convertView;
ViewHolder h;
if(v == null){
v=inflater.inflate(R.layout.adapter_layout, parent,false);
h = new ViewHolder();
h.tv = (TextView)v.findViewById(ID);
v.setTag(h);
}else{
h = (ViewHolder) v.getTag();
}
String s = getItem(position);
h.tv.setText(s);
return v;
}
private static class ViewHolder{
TextView tv;
}
答案 1 :(得分:1)
Android ListView
设计为滚动列表项时会更新。实际上,当我们将适配器与ListView
绑定时,会调用自动newview
并绑定所有数据。可能已经注意到listview
正在调用滚动getView()
。观看this官方视频以便清楚了解。