列表视图在Android中滚动列表后刷新

时间:2013-12-31 10:27:52

标签: android listview android-listview android-adapter

提前感谢,如果我在解释问题时误解了某个地方,请原谅我

我有一个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 ...”它完美地工作但是当我滚动更新的结果时刷新。

我对此进行了大量搜索,但无法找到答案。

请大家帮忙解决这个问题。

在滚动结果之前

看起来像这样

enter image description here

滚动后的结果如下所示

enter image description here

2 个答案:

答案 0 :(得分:2)

适配器正在刷新,这是正常的方法。

在你的getView中只有当它为null时才会给视图充气,并创建一个类持有者,这样你就可以随时重用你的Widget视图(TextViews等):

@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官方视频以便清楚了解。