Pertanyaan Penyegaran ListView Android


Saya punya Listview yang menarik dan menampilkan data dari DB sqlite. Data di kolom pertama DB ditampilkan di ListView dan ketika diklik, sebuah Activity mulai menunjukkan sisa kolom yang terkait dengan kolom pertama. Ketika data diedit ListView perlu diperbarui untuk mencerminkan ini, tetapi tidak menunjukkan pembaruan kecuali aplikasi dimulai ulang.

Saya sudah mencoba menelepon, notifyDataSetChanged() dan startActivityForResult() di saya onResume() metode tetapi itu tidak berhasil. Metode apa yang harus saya gunakan untuk menyelesaikan pembaruan ListView dalam kode saya saat ini?

Saya mengerti a SimpleCursorAdapter dapat digunakan dan saya telah mencoba menerapkan kode itu tanpa keberhasilan. Saya seorang pemula dan perlu kode aktual untuk memahami apa yang perlu dilakukan.

public class LoginList extends Activity implements OnClickListener, OnItemClickListener {
    private ListView loginList;
    private Button webLogin;

    private ListAdapter loginListAdapter;

    private ArrayList<LoginDetails> loginArrayList;

    @Override 
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.login_listview);
        loginList = (ListView)
        findViewById(R.id.loginlist);
        loginList.setOnItemClickListener(this);

        webLogin = (Button)
        findViewById(R.id.button3);
        webLogin.setOnClickListener(this);

        loginArrayList = new ArrayList<LoginDetails>();
        loginListAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, populateList());
        loginList.setAdapter(loginListAdapter);
    }

    @Override
    public void onClick (View v) {
        Intent webLoginIntent = new Intent (this, LoginPlusActivity.class);
        startActivity(webLoginIntent);
    }

    public List<String> populateList () {
        List<String> webNameList = new ArrayList<String>();

        dataStore openHelperClass = new dataStore (this);

        SQLiteDatabase sqliteDatabase = openHelperClass.getReadableDatabase();

        Cursor cursor = sqliteDatabase.query(dataStore.TABLE_NAME_INFOTABLE, null, null, null, null, null, dataStore.COLUMN_NAME_SITE, null);

        startManagingCursor(cursor);

        while (cursor.moveToNext()) {
            String sName = cursor.getString(cursor.getColumnIndex(dataStore.COLUMN_NAME_SITE));
            String wUrl = cursor.getString(cursor.getColumnIndex(dataStore.COLUMN_NAME_ADDRESS));
            String uName = cursor.getString(cursor.getColumnIndex(dataStore.COLUMN_NAME_USERNAME));
            String pWord = cursor.getString(cursor.getColumnIndex(dataStore.COLUMN_NAME_PASSWORD));
            String lNotes = cursor.getString(cursor.getColumnIndex(dataStore.COLUMN_NAME_NOTES));

            LoginDetails lpDetails = new LoginDetails();

            lpDetails.setsName(sName);
            lpDetails.setwUrl(wUrl);
            lpDetails.setuName(uName);
            lpDetails.setpWord(pWord);
            lpDetails.setlNotes(lNotes);

            loginArrayList.add(lpDetails);
            webNameList.add(sName);
        }

        sqliteDatabase.close();
        return webNameList;
    }


    @Override
    protected void onResume() {
        super.onResume();

        loginListAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, populateList());
        loginList.setAdapter(loginListAdapter);  

    }


@Override
    public void onItemClick(AdapterView<?> arg0 , View arg1, int arg2, long arg3) {
        Toast.makeText(getApplicationContext(), "Selected ID :" + arg2, Toast.LENGTH_SHORT).show();

        Intent updateDeleteLoginInfo = new Intent (this, UpdateDeleteLoginList.class);
        LoginDetails clickedObject = loginArrayList.get(arg2);

        Bundle loginBundle = new Bundle();
        loginBundle.putString("clickedWebSite",clickedObject.getsName());
        loginBundle.putString("clickedWebAddress",clickedObject.getwUrl());
        loginBundle.putString("clickedUserName",clickedObject.getuName());
        loginBundle.putString("clickedPassWord",clickedObject.getpWord());
        loginBundle.putString("clickedNotes",clickedObject.getlNotes());

        updateDeleteLoginInfo.putExtras(loginBundle);

        startActivityForResult(updateDeleteLoginInfo, 0);   
    }
}

7
2018-02-12 00:51


asal


Jawaban:


Ini persis apa a Loader sangat bagus untuk. Saya sarankan Anda membuat SimpleCursorAdapter untuk mengikat DB ke UI (ListView dalam hal ini), a ContentProvider untuk berinteraksi dengan DB, dan a CursorLoader untuk memantau DB untuk perubahan, dan memperbarui UI bila diperlukan. Itu Loader akan menangani semua perubahan DB dan memperbarui Anda ListView cukup dengan memperbarui adaptor Anda. Sepertinya banyak pekerjaan di depan, tetapi sangat kuat setelah dikonfigurasi, dan akan bekerja melalui seluruh siklus hidup Android.

Tutorial ini harus membantu:


5
2018-02-12 03:36



Edit

private ArrayList<LoginDetails> loginArrayList = new ArrayList<LoginDetails>();;

@Override 
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.login_listview);
    loginList = (ListView)
    findViewById(R.id.loginlist);
    loginList.setOnItemClickListener(this);

    webLogin = (Button)
    findViewById(R.id.button3);
    webLogin.setOnClickListener(this);


    loginListAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,loginArrayList );
    loginList.setAdapter(loginListAdapter);
    populateList();
}

@Override
public void onClick (View v) {
    Intent webLoginIntent = new Intent (this, LoginPlusActivity.class);
    startActivity(webLoginIntent);
}

public void populateList () {
    loginListAdapter.clear();
    loginArrayList.clear();
    dataStore openHelperClass = new dataStore (this);

    SQLiteDatabase sqliteDatabase = openHelperClass.getReadableDatabase();

    Cursor cursor = sqliteDatabase.query(dataStore.TABLE_NAME_INFOTABLE, null, null, null, null, null, dataStore.COLUMN_NAME_SITE, null);

    startManagingCursor(cursor);

    while (cursor.moveToNext()) {
        String sName = cursor.getString(cursor.getColumnIndex(dataStore.COLUMN_NAME_SITE));
        String wUrl = cursor.getString(cursor.getColumnIndex(dataStore.COLUMN_NAME_ADDRESS));
        String uName = cursor.getString(cursor.getColumnIndex(dataStore.COLUMN_NAME_USERNAME));
        String pWord = cursor.getString(cursor.getColumnIndex(dataStore.COLUMN_NAME_PASSWORD));
        String lNotes = cursor.getString(cursor.getColumnIndex(dataStore.COLUMN_NAME_NOTES));

        LoginDetails lpDetails = new LoginDetails();

        lpDetails.setsName(sName);
        lpDetails.setwUrl(wUrl);
        lpDetails.setuName(uName);
        lpDetails.setpWord(pWord);
        lpDetails.setlNotes(lNotes);

        loginArrayList.add(lpDetails);
        webNameList.add(sName);
    }
    loginListAdapter.notifyDatasetChanged();
    sqliteDatabase.close();
}

Anda kehilangan referensi ke listview Anda mengapa daftar Anda tidak diperbarui ...

Lakukan modifikasi ini dalam kode Anda. 1. Inisialisasi ArrayList Anda ketika dinyatakan (secara global).

ArrayList loginArrayList = new ArrayList<LoginDetails>();
  1. Langsung tetapkan daftar tugas ke Adaptor (onCreate)

    loginListAdapter = new ArrayAdapter (ini, android.R.layout.simple_list_item_1, loginArrayList);

  2. panggilan populateList() di onCreate().

  3. Di dalam Anda populateList() alih-alih Menambahkan data ke daftar baru, tambahkan ke daftar yang sudah ada yang dikaitkan dengan Adaptor Anda, yaitu loginArrayList

jika daftar Anda benar-benar panggilan baru adapter.clear() dan loginArrayList.clear() dalam populateList() sebelum menambahkan data ke loginArrayList. Setelah Menambahkan data ke loginArrayList panggilan adapter.notifyDataSetChanged()

Ini harus Bekerja ...


5
2018-02-17 17:01



Rekomendasi saya.

  1. Jangan lakukan loop untuk memuat daftar Anda. Jika itu daftar sederhana dengan semua string. Coba gunakan a SimpleCursorAdapter dan akan membuat aplikasi Anda kode lebih cepat dan lebih pendek.
  2. Setelah Anda memperbarui database, maka apa yang Anda lakukan adalah query DB untuk mendapatkan Cursor, dan ke Adapter gunakan.swapCursor(newCursor). Itu akan memperbarui daftar Anda sambil mempertahankan posisi gulir.

0
2018-02-12 01:41



Jika Anda secara manual membuat data backing adaptor (dalam hal ini Anda menggunakan ArrayAdapter - yang benar-benar dapat diterima dalam banyak kasus) maka ketika perubahan basis data Anda perlu merequest database, membuat ulang dataset Anda, mengubah kumpulan data cadangan adaptor Anda, dan beri tahu daftar bahwa kumpulan data telah berubah.

Cara untuk mencapai ini mungkin untuk menyiarkan suatu maksud yang memungkinkan aktivitas Anda tahu untuk melakukan langkah-langkah yang disebutkan di atas (dengan menangkap maksud itu dengan BroadcastReceiver).


0
2018-02-12 02:06



Berikut ini contoh kode saya untuk mengedit setiap baris serta database dari tampilan daftar. Saya berharap ini akan membantu Anda

Pertama buat saya membuat nama Adaptor "ListAdapterItem.java"

     import java.util.ArrayList;
     import java.util.HashMap;

     import android.content.Context;
     import android.view.LayoutInflater;
     import android.view.View;
     import android.view.ViewGroup;
     import android.widget.BaseAdapter;
     import android.widget.RelativeLayout;
     import android.widget.TextView;

     public class ListAdapterItem extends BaseAdapter {

private ArrayList<HashMap<String, Object>> list;
private Context context;
private RelativeLayout ll;
// used to keep selected position in ListView
private int selectedPos = -1; // init value for not-selected
private TextView label,label_id;
String name,id;

public ListAdapterItem (Context context,ArrayList<HashMap<String, Object>> list) {
    this.list = list;
    this.context = context;
}
public void setSelectedPosition(int pos) {
    selectedPos = pos;
    // inform the view of this change
    notifyDataSetChanged();
}
public int getSelectedPosition() {
    return selectedPos;
}
public View getView(int position, View convertView, ViewGroup parent) {
    ll = (RelativeLayout) LayoutInflater.from(this.context).inflate(R.layout.data_list_item, null);
    // get text view
    label = (TextView) ll.findViewById(R.id.txtview_country_name);
    label_id=(TextView) ll.findViewById(R.id.txtview_id);

    id=list.get(position).get("Id").toString();
    name = list.get(position).get("Name").toString();

    label.setText(name);
    label_id.setText(id);
    return ll;
}
public int getCount() {
    return this.list.size();
}
public Object getItem(int position) {
    return position;
}
public long getItemId(int position) {
    return position;
}
}

Dan inilah data_list_item saya

                            <?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="fill_parent"
                android:orientation="vertical"
                android:padding="5dp">
                 <TextView
                    android:id="@+id/txtview_id"
                    android:layout_width="wrap_content"
                    android:layout_height="fill_parent"
                    android:layout_margin="8dp"
                    android:layout_marginRight="2dp"
                    android:textColor="@android:color/black"
                    android:textSize="22dp"
                    android:visibility="invisible"/>
                <TextView
                    android:id="@+id/txtview_country_name"
                    android:layout_width="wrap_content"
                    android:layout_height="fill_parent"
                    android:layout_margin="8dp"
                    android:layout_marginRight="2dp"
                    android:textColor="@android:color/black"
                    android:textSize="22dp" />


            </RelativeLayout>

Dan kelas utama "Main.java"

                    public class Main extends Activity implements OnClickListener {

                    String name;
                    SQLiteDatabase db;
                    Cursor cursor;

                    private ProgressDialog progressDialog;

                    public ListAdapterItem list_adapter;
                    private ArrayList<HashMap<String, Object>> lst_data;
                    private HashMap<String, Object> hm;
                    private ListView listview;
                    private String list_id;
                    private int counter_id,selectedPosition;
                    private View selectedView;

                    public void onCreate(Bundle savedInstanceState) {
                        super.onCreate(savedInstanceState);
                        setContentView(R.layout.main_layout);
                        lst_data = new ArrayList<HashMap<String, Object>>();
                        listview = (ListView) findViewById(R.id.list);
                        new FetchDB().execute();
                        }
                    private class FetchDB extends AsyncTask<String, Void,ArrayList<HashMap<String, Object>>> {
                        protected void onPreExecute() {
                            progressDialog = ProgressDialog.show(Main.this,"Fetching Data", "Loading,Please wait...", true);
                        }

                        protected ArrayList<HashMap<String, Object>> doInBackground(String... lstStrings)throws IllegalArgumentException {
                            try {
                                db = openOrCreateDatabase("MyDB", MODE_PRIVATE, null);
                                cursor = db.rawQuery("SELECT * FROM person WHERE Id <> ''",null);

                                if (cursor != null && cursor.getCount() > 0) {

                                    if (cursor.moveToFirst()) {
                                        do {
                                            hm = new HashMap<String, Object>();
                                            hm.put("Id",cursor.getInt(cursor.getColumnIndex("Id")));
                                            hm.put("Name", cursor.getString(cursor.getColumnIndex("Name")));
                                            lst_data.add(hm);

                                        } while (cursor.moveToNext());
                                    }// end of cursor.moveToFirst()
                                    cursor.close();
                                }

                            } catch (Exception e) {
                                e.getMessage();
                            }
                            db.close();// database close
                            return lst_data;
                        }// end of doInbackgournd

                        @Override
                        protected void onPostExecute(ArrayList<HashMap<String, Object>> result) {
                            progressDialog.dismiss();
                            list_adapter = new ListAdapterItem(Main.this,result);
                            listview.setAdapter(list_adapter);
                            listview.setOnItemClickListener(new OnItemClickListener() {

                                public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,long arg3) {
                                    list_adapter.setSelectedPosition(arg2);
                                    selectedPosition = arg2;
                                    selectedView = arg1;
                                    list_id=((TextView) selectedView.findViewById(R.id.txtview_id)).getText().toString();
                                }

                            });
                        }
                    }// end of FetchDBTask
                        private class SaveTask extends AsyncTask<String, Void,ArrayList<HashMap<String, Object>>> {
                        @Override
                        protected void onPreExecute() {
                            progressDialog = ProgressDialog.show(Main.this,"Saving Data", "Loading,Please wait...", true);
                        }
                        protected ArrayList<HashMap<String, Object>> doInBackground(String... arg0)throws IllegalArgumentException {
                            counter_id++;
                            name = editext_name.getText().toString();

                            hm = new HashMap<String, Object>();
                            hm.put("Id",counter_id);
                            hm.put("Name",name);
                            lst_data.add(hm);
                            saveDB();
                            return lst_data;
                        }// end of doInbackgournd

                        protected void onPostExecute(ArrayList<HashMap<String, Object>> result) {
                            progressDialog.dismiss();
                            list_adapter = new ListAdapterItem(Main.this,result);
                            listview.setAdapter(list_adapter);
                            listview.setOnItemClickListener(new OnItemClickListener() {
                                public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,long arg3) {
                                    list_adapter.setSelectedPosition(arg2);
                                    selectedPosition = arg2;
                                    selectedView = arg1;
                                    list_id=((TextView) selectedView.findViewById(R.id.txtview_id)).getText().toString();

                                }
                            });

                        }

                    }// end of saveTask
                    public void saveDB(){
                        String sql;
                        db = openOrCreateDatabase("MyDB", MODE_PRIVATE, null);
                        // create table if not e exist
                        db.execSQL("CREATE TABLE IF NOT EXISTS person(Name VARCHAR ,Id INT(3));");
                        sql = "SELECT * FROM person WHERE Id="+list_id; //selected or click row in list item
                        Cursor cursor = db.rawQuery(sql, null);

                        if (cursor.moveToFirst()) {
                            String sqlUpdate = "UPDATE person SET Name=? WHERE Id="+db_id;
                            db.execSQL(sqlUpdate, new Object[] {db_name});
                            cursor.close();
                            db.close();// database close
                        } else {// empty insert
                            String sqlInsert = "INSERT INTO person VALUES (?,"+null+")";
                            db.execSQL(sqlInsert, new Object[] {db_name,db_address,db_phone,db_email,db_license,db_comments,db_company,db_policy,db_phone_insurance,vehc_year,vehc_make,vehc_model,vehc_license,vehc_vinnum,vehc_color,db_position });
                            cursor.close();
                            db.close();// database close

                        }
                    }
                    //Edit by row
                    private class EditData extends AsyncTask<String, Void,ArrayList<HashMap<String, Object>>> {
                        protected void onPreExecute() {
                            progressDialog = ProgressDialog.show(Main.this,"Saving Data", "Loading Please wait...", true);
                        }
                        protected ArrayList<HashMap<String, Object>> doInBackground(String... id)throws IllegalArgumentException {
                            name = editext_name.getText().toString();


                            hm = new HashMap<String, Object>();
                            hm.put("Id",counter_id);
                            hm.put("Name",name);

                            lst_data.set(selectedPosition, hm); //specific row update
                            list_id=Integer.parseInt(edit_counter);
                            saveDB();

                            return lst_data;
                        }// end of doInbackgournd
                        protected void onPostExecute(ArrayList<HashMap<String, Object>> result) {
                            progressDialog.dismiss();
                            list_adapter = new ListAdapterItem(Main.this,result);
                            listview.setAdapter(list_adapter);

                        }
                    }
                }

Dan main_layout.xml

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

                <ListView
                    android:id="@+id/list"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center_vertical"
                    android:background="@android:color/transparent"
                    android:cacheColorHint="#00000000"
                    android:dividerHeight="2dp"
                    android:paddingTop="8dp"
                    android:transcriptMode="normal" />

            </LinearLayout>

Tentukan id Anda setiap listrow di listview berharap ini menjawab pertanyaan Anda


0
2018-02-14 03:04



Saya pikir bahwa dalam metode populate () sebelum blok sementara Anda harus memanggil loginListAdapter.notifyDataSetChanged () dan loginListAdapter.clear (); Itu akan menghapus adaptor dan memperhatikannya dari daftar data baru.

Blok akan terlihat seperti ini:

 loginListAdapter.notifyDataSetChanged();
 loginListAdapter.clear();
 while (cursor.moveToNext()) {
        String sName = cursor.getString(cursor.getColumnIndex(dataStore.COLUMN_NAME_SITE));
        String wUrl = cursor.getString(cursor.getColumnIndex(dataStore.COLUMN_NAME_ADDRESS));
        String uName = cursor.getString(cursor.getColumnIndex(dataStore.COLUMN_NAME_USERNAME));
        String pWord = cursor.getString(cursor.getColumnIndex(dataStore.COLUMN_NAME_PASSWORD));
        String lNotes = cursor.getString(cursor.getColumnIndex(dataStore.COLUMN_NAME_NOTES));

        LoginDetails lpDetails = new LoginDetails();

        lpDetails.setsName(sName);
        lpDetails.setwUrl(wUrl);
        lpDetails.setuName(uName);
        lpDetails.setpWord(pWord);
        lpDetails.setlNotes(lNotes);

        loginArrayList.add(lpDetails);
        webNameList.add(sName);
    }

Saya Baru mengedit karena pesanan yang Anda beri tahukan pemberitahuan dan jelas tidak benar. Yang jelas harus terjadi setelah memberi tahu, hanya apa yang saya dapatkan dari pengalaman saya, kecuali adaptor tidak akan menggambar ulang daftar.


0
2018-02-14 18:41



Coba kode ini

di area publik tambahkan variabel: List<String> arrayList = new ArrayList<String>();

dan di onCreate () tambahkan ini:

    arrayList = populateList();

// lalu tambahkan variabel di adaptor seperti ini

loginListAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, arrayList );

di onResume () kode ini:

@Override
protected void onResume() {
    super.onResume();

    loginArrayList.clear();

    arrayList.clear();

    arrayList = populateList();

    loginListAdapter.notifyDataSetChanged()

}

Beri tahu kami jika Anda memecahkannya.


0
2018-02-16 18:24