【问题标题】:How to update a ListView that use CursorAdapter when click a button in listview's row单击列表视图行中的按钮时如何更新使用 CursorAdapter 的列表视图
【发布时间】:2015-11-28 13:12:22
【问题描述】:

当我单击“保存”按钮时,我得到了 EditText 的文本,该文本被保存到数据库中,并且光标从数据库返回,然后显示在 Listview 中。所有的保存和获取操作都没有问题。当我单击保存按钮时,列表已动态刷新,但是当我单击列表行中的“删除”按钮时,尽管光标已更新,但列表视图不会自行刷新。

我不知道怎么了... 非常感谢您的帮助...

MainActivity 的 oncreate:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    DB = new DataBase(this,"CursorDatas",null,1);

    ContextWrapper.setContext(getApplicationContext());

    editText =(EditText) findViewById(R.id.edittext);
    btnSave = (Button)findViewById(R.id.btn_save);
    recordsList = (ListView)findViewById(R.id.list);


    cursor = DB.getRecords();


    listAdapter = new ListAdapter(this,cursor);


    recordsList.setAdapter(listAdapter);


    btnSave.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {

            String str = editText.getText().toString();

            DB.addRecord(str);

            cursor = DB.getRecords();

            listAdapter = new ListAdapter(getApplicationContext(),cursor);

            recordsList.setAdapter(listAdapter);


        }
    });


}

我的 ListAdapter 类

public class ListAdapter extends CursorAdapter {

LayoutInflater inf;
ViewHolder vHolder;
DataBase DB;
Cursor cursor;
ListView lW;
ListeAdaptor listAdapter;
Context context;


public ListeAdaptor(Context context, Cursor c) {
    super(context, c);
    // TODO Auto-generated constructor stub

    inf = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View v = inf.inflate(R.layout.activity_main, null);
    lW = (ListView)v.findViewById(R.id.list);
    DB = new DataBase(context,"CursorDatas",null,1);
    this.context = context;

}

@Override
public void bindView(View arg0, Context arg1, Cursor arg2) {
    // TODO Auto-generated method stub


    vHolder = (ViewHolder)arg0.getTag();

    vHolder.tV.setText(arg2.getString(arg2.getColumnIndex("Name")));

    vHolder.btn.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {


            String name = vHolder.tV.getText().toString();

            DB.deleteRecords(isim);

            cursor = DB.getRecords();

            listAdapter = new ListAdapter(ContextWrapper.getContext(),cursor);
            cursor.requery();
            listAdapter.notifyDataSetChanged();
            lW.setAdapter(listAdapter);

        }
    });

}

@Override
public View newView(Context arg0, Cursor arg1, ViewGroup arg2) {
    // TODO Auto-generated method stub

    View v = inf.inflate(R.layout.list_item,null);

    ViewHolder viewHolder = new ViewHolder(v);

    v.setTag(viewHolder);



    return v;
}

}

列表项.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<TextView 
    android:id="@+id/name"
    android:layout_width="100dp"
    android:layout_height="match_parent"
    />

<Button
    android:id="@+id/btn_delete"
    android:layout_width="80dp"
    android:layout_height="50dp"
    android:layout_toRightOf="@id/name"
    android:layout_toEndOf="@id/name"
    android:layout_alignParentRight="true"
    android:layout_alignParentEnd="true"
    android:text="Delete"></Button>

【问题讨论】:

    标签: android listview android-listview android-cursoradapter


    【解决方案1】:

    对此有一个最佳解决方案,您不必费心更新和重新分配您的适配器并一次又一次地将其设置到您的列表视图。 您应该将“CursorLoader”与 CursorAdapter 一起使用,它会自动管理对您的 listview 的更新。这里是链接。 http://developer.android.com/reference/android/content/CursorLoader.html

    【讨论】:

      猜你喜欢
      • 2013-01-13
      • 1970-01-01
      • 2019-02-27
      • 2015-02-14
      • 1970-01-01
      • 2015-07-31
      • 1970-01-01
      • 2022-06-11
      • 1970-01-01
      相关资源
      最近更新 更多