【问题标题】:Unable to upate ListView data无法更新 ListView 数据
【发布时间】:2010-12-17 15:57:08
【问题描述】:

我有一个扩展 Activity 的 A 类。从 A 类,我正在调用扩展 BaseAdapter 的适配器 B 类。

我正在从被覆盖的方法中显示 ListView 数据 public View getView(final int position, View convertView, ViewGroup parent)

我正在从 SQLite 获取 ListView 的数据。现在单击特定列表项的取消按钮,我可以从数据库中删除记录数据,但无法刷新视图。仍在显示数据。但是如果我再次从主屏幕导航到屏幕,数据没有显示,说明数据库没有问题,只是更新显示有问题。

骨架代码如下:

class A extends Activity {

    B adapter ;
    ListView list ;

    public void onCreate(Bundle savedInstanceState) {

        list = (ListView) findViewById(R.id.textList);
        // I am calling the adapter

        adapter = new B(this, txtStr);
        list.setAdapter(adapter);
    }

    class B extends BaseAdapter{
        public View getView(final int position, View convertView, ViewGroup parent){

            // on click of the delete button , record is delated for a specific
            // listitem & the view needs to be updated , but I am unable to update the view

            holder.deleteImage.setOnClickListener(new OnClickListener() {
                    private int pos = position;
                    public void onClick(View v) {// (position)) -- what was this doing here? (dbreslau)

                        sampleDB.execSQL("DELETE FROM " + Constants.TABLE_NAME + " where id = 1");
                        adapter.notifyDataSetChanged();
                    }
                });
        }
    }
}

即使在调用 notifyDataSetChanged 之后,视图也没有得到更新。 如果有人已经实现了相同的功能,请提供帮助。

【问题讨论】:

  • 我刚刚尝试修复您的代码格式,并发现了一些语法错误(请参阅位置外的注释 (position)) 。)我不确定代码是否完整足以分析。
  • Listview 显示项目列表。考虑每个包含 2 个图像按钮的列表项,例如 Delete & Add 。当用户单击列表项的特定按钮时,位置有助于确定特定的列表项。我知道 onListItemClick(ListView l, View v, int position, long id),我们从那里得到 position 。如果用户单击任何列表项的添加或删除按钮,我该如何处理。请提供帮助,因为在删除列表项后我仍然无法更新视图。

标签: android


【解决方案1】:

在你的适配器中声明你的 onClickListener,在活动类中,因为你正在为每个构造的视图创建新的监听器,然后在 onClickListener 的 onClick 方法中这样做:

    class A extends Activity {

                B adapter ;
                ListView list ;

                public void onCreate(Bundle savedInstanceState) {

                    list = (ListView) findViewById(R.id.textList);
                    // I am calling the adapter

                    adapter = new B(this, txtStr);
                    list.setAdapter(adapter);

                    list.setOnItemClickListener (listener);
                }


private OnItemClickListener listener = new OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
         // TODO Auto-generated method stub
         sampleDB.execSQL("DELETE FROM " + Constants.TABLE_NAME + " where id = 1");
         //adapter.notifyDataSetChanged();
         ((B)adapter).notifyDataSetChanged();
    }
};

    **EDIT 1** 
    //with an onCLickListener...
    private OnClickListener deleteListener = new OnClickListener() {
            @Override
            public void onClick(View v) {
                int position = (int)v.getTag();
                            sampleDB.execSQL("DELETE FROM " + Constants.TABLE_NAME + " where id = 1");
                            ((B)adapter).notifyDataSetChanged());
            }
        };


                class B extends BaseAdapter{
                    public View getView(final int position, View convertView, ViewGroup parent){

                        // on click of the delete button , record is delated for a specific
                        // listitem & the view needs to be updated , but I am unable to update the view

    holder.deleteImage.setTag(position);                   
    holder.deleteImage.setOnClickListener(deleteListener);
    //...
    convertView.setTag(holder);
                    }
                }
            }

【讨论】:

  • 感谢佛朗哥的回复。实际上,如果我使用 OnItemClick,然后单击特定列表项,如何获取列表项的位置。此外,在每个列表项中都有多个图像图标,如删除、添加,所以我如何区分单击删除和添加按钮。请指教
  • int position = (int)v.getTag();此行给出错误“无法从 Object 转换为 int”
  • 我没有尝试,我是在浏览器中写的,但这有效 int position = Integer.parseInt(v.getTag().toString());
  • int position = Integer.parseInt(v.getTag().toString()); //该语句提供了一个错误
  • 非常非常奇怪,我也是这样做的,将列表项位置设置为标签并进入我的监听器,并且工作正常
猜你喜欢
  • 2014-01-10
  • 1970-01-01
  • 1970-01-01
  • 2013-04-11
  • 2018-02-22
  • 2022-01-21
  • 1970-01-01
  • 1970-01-01
  • 2011-10-24
相关资源
最近更新 更多