我的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");
}
});
.............................................
哪里错了? 谢谢
答案 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);
}