滚动后,Android listView丢失了数据

时间:2013-09-26 09:44:50

标签: android listview

我的listview有问题! 当我更改行值(在textview上)并执行列表的scoll时,我丢失了值(并在第一次设置时返回)! 例如,如果我使用text =“Example no.1”创建一个包含50 textview的列表视图,如果我在滚动列表后更改了值(onItemClick),则textview值为“Example no.1”。

这是我的示例代码:

.............................................
String sItems = new String[50];
HashMap<String,Object> personMap=new HashMap<String, Object>();
.............................................
sItems[iCnt] = "Example no.1";
personMap.put("title", sItems[iCnt]);
data.add(personMap);
.............................................
String[] from={"title"};
int[] to={R.id.rowTextView};
final SimpleAdapter adapter=new SimpleAdapter(getApplicationContext(),data,R.layout.all_textview,from,to);
final ListView listView = (ListView) findViewById(R.id.cd_sel_title_listview_textview);
listView.setAdapter((adapter));

listView.setOnItemClickListener(new AdapterView.OnItemClickListener()
{
  public void onItemClick(AdapterView<?> arg0, View v, int position, long id)
  {
    TextView textView = (TextView) v.findViewById(R.id.rowTextView);
    textView.setText("Example No.2");
  }
});
.............................................

哪里错了? 谢谢

3 个答案:

答案 0 :(得分:2)

事情是:列表中的每个视图都不会永久保存在内存中:

适配器视图允许您拥有非常长的列表,仅在内存中保留您需要显示的列表,因此当您向下滚动并向后滚动时,值将在释放时更改的视图以及使用其默认值重新创建。

您需要做的是,创建一个自定义适配器(例如,从ArrayAdapter扩展的类)并重新实现getView方法。

创建(或重新创建)每行视图的方法。此时您可以将文本重置为正确的值。

代码如下:

public class ListAdapter extends ArrayAdapter<Item> {

...

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    View v = convertView;

    if (v == null) {

        LayoutInflater vi;
        vi = LayoutInflater.from(getContext());
        v = vi.inflate(R.layout.myview, null);

    }

    v.setText("anything you need");

    return v;

}

查看CustomAdapter实现以获取更多信息。

答案 1 :(得分:1)

不是将值设置为TextView,而是将值更改为Array本身,然后调用adapter.notifyDataSetChanged()以通知适配器。

答案 2 :(得分:0)

试试这个:

public void onItemClick(AdapterView<?> arg0, View v, int position, long id)
{
TextView textView = (TextView) v.findViewById(R.id.rowTextView);

textView.setText("Example No.2");
personMap=new HashMap<String, Object>();
personMap.put("title", "Example No.2");
data.set(position,personMap);
}