【问题标题】:How to refresh ListView dynamically?如何动态刷新 ListView?
【发布时间】:2012-05-08 10:35:37
【问题描述】:

我正在制作一个 ListView,其中包含 TextView 和每行 1 个删除按钮。

为了填充列表,我使用我的自定义适配器(扩展基本适配器)和 sqlite db 映射到列表中。

我的要求是单击一行中的删除按钮,应删除记录并刷新列表。

我可以从数据库中删除记录,但我的列表不会刷新,直到我旋转设备或从活动中分配我的适配器的新实例。

我已经尝试关注answer 但在我的情况下不起作用。这个答案和我的情况的区别在于我使用的是 baseAdapter 而他使用的是 cursorAdapter。

 public class BookmarksPDFAdapter extends BaseAdapter { 

            public View getView(int position, View convertView, ViewGroup parent) {
            openDatabase();




            btnDelete.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {

                    deleteBookmark(getLocation(v));//getlocation(View) method returns which delete button clicked
                    notifyDataSetChanged();

                }
            });
        }
        closeDatabase();
        return convertView;
    }

我的活动看起来像

public class BookmarkActivity extends Activity {


@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub

    super.onCreate(savedInstanceState);
    setContentView(R.layout.bookmarks);
    btnEdit = (Button) findViewById(R.id.edit_bookmarks);
    btnAdd = (Button) findViewById(R.id.add_bookmarks);

    list = (ListView) findViewById(android.R.id.list);

    adapter = new BookmarksPDFAdapter(this);

    list.setAdapter(adapter);
}

书签.xml

<LinearLayout 
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:weightSum="10.0" 
android:paddingTop="5dp">

<LinearLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical"

    android:padding="3dip"
    android:layout_alignParentLeft="true"
    android:weightSum="1.0" 
    android:layout_marginRight="5dip">

    <ImageView
        android:id="@+id/iconShow"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/delete_icon"
        android:visibility="invisible" 
        android:layout_weight="1.0"/>
</LinearLayout>

<TextView
    android:id="@+id/bookmark_text"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="6dp"
    android:layout_weight="7.0"
    android:gravity="center_horizontal|center_horizontal"
    android:lines="1"
    android:text="@+id/TextView01"
    android:textSize="24dp" />

<Button
    android:id="@+id/btnDelete"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="right"
    android:layout_weight="2.0"
    android:text="@string/btn_txt_delete"
    android:visibility="invisible" >
</Button>

listitem.xml

<LinearLayout 
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:weightSum="10.0" 
android:paddingTop="5dp">

<LinearLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical"

    android:padding="3dip"
    android:layout_alignParentLeft="true"
    android:weightSum="1.0" 
    android:layout_marginRight="5dip">

    <ImageView
        android:id="@+id/iconShow"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/delete_icon"
        android:visibility="invisible" 
        android:layout_weight="1.0"/>
</LinearLayout>

<TextView
    android:id="@+id/bookmark_text"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="6dp"
    android:layout_weight="7.0"
    android:gravity="center_horizontal|center_horizontal"
    android:lines="1"
    android:text="@+id/TextView01"
    android:textSize="24dp" />

<Button
    android:id="@+id/btnDelete"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="right"
    android:layout_weight="2.0"
    android:text="@string/btn_txt_delete"
    android:visibility="invisible" >
</Button>

删除书签方法

void deleteBookmark(int wantedChild) {

    String bookmarkItem = getBookmarkItemText(wantedChild, true);
    datasource.open();
    int check = datasource.deleteBookmark(bookmarkItem);
    if (check == 1) {

        btnDelete = (Button) (viewList.get(wantedChild)
                .findViewById(R.id.btnDelete));

        btnDelete.setText(R.string.btn_txt_deleted);
        btnDelete.setEnabled(false);
    }

    datasource.close();
}

我正在从我的数据库中删除记录并将删除按钮的文本从 delete 更改为 deleted

【问题讨论】:

    标签: android listview baseadapter


    【解决方案1】:
    adapter.notifyDataSetChanged();
    

    您可以随时调用上述方法刷新列表视图。在您从数据库中删除记录后调用它。

    【讨论】:

    • 要设置为适配器的数组列表在哪里?
    • 是的,我猜它还没有从适配器调用 notifyDataSetChanged() 时使用的数组中删除。需要查看 deleteBookmark 的代码
    • 我怀疑他是否在 deleteBookmark 中异步执行任何操作。不过,如果 list.postDelayed( /* New Runnable 确实通知数据集 changed() */, 200);
    • @agrawal 我没有使用 arrayList 我有我的数据库,我从中获取书签。
    • 谢谢大家,我遇到了这个问题。我在适配器的构造函数中初始化光标,因为我的列表没有刷新,但现在我面临其他问题。我也在单独的问题中发布。
    【解决方案2】:

    我通过调用更新列表视图:

    listview.invalidateViews();
    

    【讨论】:

      【解决方案3】:
      notifyDataSetChanged();
      

      对我来说也是唯一的解决方案,现在我的 deleteBookmark 方法看起来像

      void deleteBookmark(int wantedChild,  String bookmarkItem) {
      
          openDatabase();
          int check = datasource.deleteBookmark(bookmarkItem);
          if(check==1)
          Toast.makeText(context, R.string.msg_bookmark_delete, ReaderConstants.TOAST_SHOWTIME).show();
          else
              Toast.makeText(context, R.string.msg_bookmark_delete_failed, ReaderConstants.TOAST_SHOWTIME).show();
          notifyDataSetChanged();
          closeDatabase();
      }
      

      【讨论】:

        【解决方案4】:

        在适配器内部设置更新数据集的自定义方法并通知更改

        public void updateData(ArrayList<DataSet> d) {
        
                this.data = d;
                notifyDataSetChanged();
            }
        

        然后调用Activity内部的方法, (对于我的情况,我在 onResume 方法中调用)

        @Override
                public void onResume(){
                    super.onResume();
                        adapter.updateData(dataList);
                }
        

        【讨论】:

          猜你喜欢
          • 2013-09-16
          • 2018-10-31
          • 1970-01-01
          • 2021-05-04
          • 1970-01-01
          • 1970-01-01
          • 2017-12-15
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多