0

我的列表视图有问题!当我更改行值(在文本视图上)并执行列表的 scoll 时,我丢失了值(并返回我的第一个设置)!例如,如果我创建一个包含 50 个 textview 且 text =“Example no.1”的列表视图,如果我在滚动列表后更改值 (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");
  }
});
.............................................

我哪里错了?谢谢

4

3 回答 3

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 实现以获取更多信息。

于 2013-09-26T09:49:20.307 回答
1

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

于 2013-09-26T09:49:27.570 回答
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);
}
于 2013-09-26T10:25:01.697 回答