Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
409 views
in Technique[技术] by (71.8m points)

android - How to update data in a Custom Dialog

The user at the moment clicks on a row which contains data and a Dialog with text fields is displayed.
I want the user to update the strings by using this Dialog.

How can I do this?

I have an update method already in my Database Class, but I'm not sure how to implement the update in the Dialog

enter image description here
enter image description here

Database Class

package ie.example.artur.projectrepeat;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteQueryBuilder;

/**
 * Created by family on 06/07/2016.
 */
public class DatabaseClass extends SQLiteOpenHelper {

    public static final String DATABASE_Name = "Product.db2";
    public static final String Table_Name = "product_table2";
    public static final String COL_1 = "ID";
    public static final String COL_2 = "Name";
    public static final String COL_3 = "Quantity";
    public static final String COL_4 = "Category";
    public static final String COL_5 = "Importance";
    Context myContext;


    public DatabaseClass(Context context) {

        super(context, DATABASE_Name, null, 1);

    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("create table " + Table_Name + " (ID INTEGER PRIMARY KEY AUTOINCREMENT,NAME TEXT,Quantity TEXT,Category INTEGER,Importance TEXT);");
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("Drop Table If Exists" + Table_Name);
        onCreate(db);
    }

    public boolean insertData(String name, String quantity, String category,String importance) {
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues contentValues = new ContentValues();
        contentValues.put(COL_2, name);
        contentValues.put(COL_3, quantity);
        contentValues.put(COL_4, category);
        contentValues.put(COL_5, importance);

        long result = db.insert(Table_Name, null, contentValues);

            if (result == -1)
                return false;
            else
                return true;
        }

    public Cursor getAllData() {
        SQLiteDatabase db = this.getWritableDatabase();
        Cursor res = db.rawQuery("select * from " + Table_Name, null);
        return res;
    }

    public boolean updateData(String id,String name,String quantity,String category,String importance ) {
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues contentValues = new ContentValues();
        contentValues.put(COL_1, id);
        contentValues.put(COL_2, name);
        contentValues.put(COL_3, quantity);
        contentValues.put(COL_4, category);
        contentValues.put(COL_5, importance);
        db.update(Table_Name,contentValues,"id =?",new String[]{id});
                return true;
    }

   /* public Cursor getCursor(){
        SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder();

        queryBuilder.setR
    }
*/
   public Integer DeleteData (String id) {
       SQLiteDatabase db = this.getWritableDatabase();
       return db.delete(Table_Name,"ID = ?",new String[]{id});
   }
    public static void DeleteInformation(String item_name, SQLiteDatabase sqLiteDatabase){

        String selection = COL_1+" LIKE ?";
        String [] selection_args = {item_name};
        sqLiteDatabase.delete(Table_Name,selection,selection_args);

    }

    public Cursor getInformation(SQLiteDatabase sqLiteDatabase)
    {
        Cursor cursor;
        String [] Projections = {COL_1,COL_2,COL_4};

        cursor  = sqLiteDatabase.query(Table_Name,Projections,null,null,null,null,null);
        return cursor;

    }

    public Cursor getItem(String item_name ,SQLiteDatabase sqLiteDatabase){
        String [] Projections = {COL_1,COL_2,COL_3,COL_4,COL_5};
        String selection = COL_1+" LIKE ?";
        String [] selection_args = {item_name};
        Cursor cursor = sqLiteDatabase.query(Table_Name,Projections,selection,selection_args,null,null,null);
        return cursor;

    }


}

EditActivity

package ie.example.artur.projectrepeat;

import android.app.Dialog;
import android.app.DialogFragment;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

public class Edit_Activity extends AppCompatActivity implements AdapterView.OnItemClickListener {

    ListView listView;
    SQLiteDatabase sqLiteDatabase;
    DatabaseClass  database;
    Cursor cursor;
    ListDataAdapter listDataAdapter;
    Dialog d;
    EditText editText_name,editText_Quantity,editText_Category,editTextId,editText_Number;


    Button updateBtn;
    EditText nameEditText;


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



        listView = (ListView) findViewById(R.id.list_view);
        listDataAdapter = new ListDataAdapter(getApplicationContext(), R.layout.row_layout);
        listView.setAdapter(listDataAdapter);
        listView.setOnItemClickListener(this);
        database = new DatabaseClass(getApplicationContext());
        editText_name = (EditText) findViewById(R.id.editText_name);
        editText_Quantity = (EditText) findViewById(R.id.editText_Quantity);
        editText_Category = (EditText) findViewById(R.id.editText_Category);
        editText_Number = (EditText)findViewById(R.id.editText_Number);
        editTextId = (EditText) findViewById(R.id.editText_id);
        sqLiteDatabase = database.getReadableDatabase();

        Cursor cursor=database.getInformation(sqLiteDatabase);

        if (cursor.moveToFirst()) {
            do {

                String id, product_name, category;
                id = cursor.getString(0);
                product_name = cursor.getString(1);
                category = cursor.getString(2);
                DataProvider dataProvider = new DataProvider(id, product_name, category);
                listDataAdapter.add(dataProvider);
            } while (cursor.moveToNext()


                    );

        }

    }

    public void loginMethod() {
        // Create an instance of the dialog fragment and show it
        MyDialog dialog = new MyDialog();
        dialog.show(getFragmentManager(),"my_dialog");
    }

/*
    private void showDialog(){
        Dialog dialog = new Dialog(this);
        dialog.setContentView(R.layout.input);
        dialog.setTitle("Here Goes the Title");

        Button updateBtn = (Button) d.findViewById(R.id.updateBtn);


        dialog.show();
    }
*/



    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position , long id) {
        TextView tv = (TextView) view.findViewById(R.id.product_id);



        sqLiteDatabase = database.getReadableDatabase();

        loginMethod();

/*
        listView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View arg0) {

                // custom dialog
                final Dialog dialog = new Dialog(context);
                dialog.setContentView(R.layout.input);
                dialog.setTitle("Title...");


                final EditText nameEditText = (EditText) d.findViewById(R.id.product_name);
                Button updateBtn = (Button) d.findViewById(R.id.updateBtn);


             /*   if (position == -1) {

                    updateBtn.setEnabled(false);
                } else

                    updateBtn.setEnabled(true);


                updateBtn.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {

                    }

                });
                dialog.show();
            }

        });
*/
    /*private void displayInputDialog(final int pos) {
        d = new Dialog(this);
        d.setTitle("List View");
        d.setContentView(R.layout.input);

        final EditText nameEditText = (EditText) d.findViewById(R.id.product_name);
        Button updateBtn = (Button) d.findViewById(R.id.updateBtn);


        if (pos == -1) {

            updateBtn.setEnabled(false);
        } else

            updateBtn.setEnabled(true);


        updateBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

            }
        });*
        }*/
            }




        }

MyDialog Class

package ie.example.artur.projectrepeat;

import android.app.AlertDialog;
import android.app.Dialog;
import android.app.DialogFragment;
import android.content.DialogInterface;
import android.graphics.drawable.LayerDrawable;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;

/**
 * Created by family on 12/08/2016.
 */
public class MyDialog extends DialogFragment{


    LayoutInflater inflater;

    View v;
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {

        inflater = getActivity().getLayoutInflater();
        v= inflater.inflate(R.layout.input,null);
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setView(v).setPositiveButton("Ok", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {

            }
        }).setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {

            }
        });

        return builder.create();
    }
}
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

Here is a neat way to handle custom dialog class!

You can make MyDialog class to contain Builder class so that it handles buttonOnClick methods and text data.

my_dialog_layout.xml should contains 4 editTexts(name, category, quantity, importance) and 3 buttons(update, cancel, ok), as it is shown in your second picture. I won't post the xml code since it's not the critical part.

So in OnItemClickListener of the listView in EditActivity, you can

  1. build the dialog
  2. set default text on edit texts
  3. set onClickListener for buttons

MyDialog class

public class MyDialog extends DialogFragment {

   public static final String SimpleName = MyDialog.class.getSimpleName();
   private EditText name,category, quantity, importance;
   private Button update, positive, negative;
   private Builder builder;

    private static MyDialog instance = new MyDialog();

    public static MyDialog getInstance(){
        return instance;
    }

   @Override
    public void onCreate(Bundle savedInstanceState) {
        this.setCancelable(true);

        if (savedInstanceState != null) {
            if (builder != null) {
                builder = savedInstanceState.getParcelable(Builder.class.getSimpleName());
            }
        }
        setRetainInstance(true);
        super.onCreate(savedInstanceState);
    }

    @NonNull
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        Dialog dialog = super.onCreateDialog(savedInstanceState);
        // make the dialog's default background transparent so that you can customize the window
        dialog.getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));
        dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE);
        return dialog;
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.my_dialog_layout, container, false);
    }

    @Override
    public void onViewCreated(View view, @Nullable final Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        initViews(view);
        if (builder != null) {

            if (builder.getTextName() != null) {
                name.setText(builder.getTextName());
            }
            if (builder.getTextCategory() != null) {
                category.setText(builder.getTextCategory());
            }
            if (builder.getTextQuantity() != null) {
                quantity.setText(builder.getTextQuantity());
            }
            if (builder.getTextImportance() != null) {
                importance.setText(builder.getTextImportance());
            }



            update.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    builder.getOnUpdateClicked().OnClick(view, getDialog());
                }
            });

            positive.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                   builder.getOnPositiveClicked().OnClick(view, getDialog());
                }
            });

            negative.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                  builder.getOnNegativeClicked().OnClick(view, getDialog());
                }
            });

        }
    }

    private void initViews(View view) {       
        name = (EditText) view.findViewById(R.id.editText_name);
        category = (EditText) view.findViewById(R.id. editText_category);
        quantity = (EditText) view.findViewById(R.id. editText_quantity);
        importance = (EditText) view.findViewById(R.id.editText_importance);
        update = (Button) view.findViewById(R.id.update);
        positive = (Button) view.findViewById(R.id.positive);
        negative = (Button) view.findViewById(R.id.negative);

    }

    private Dialog show(Activity activity, Builder builder) {             
         this.builder = builder;
         if (!isAdded()){
             show(((AppCompatActivity) activity).getSupportFragmentManager(), SimpleName);
         }
         return getDialog();
     }

    public static class Builder implements Parcelable  {

        private OnPositiveClicked onPositiveClicked;
        private OnNegativeClicked onNegativeClicked;
        private OnUpdateClicked onUpdateClicked;

        private textName;
        private textCategory;
        private textQuantity;
        private textImportance;

        private Context context;

        protected Builder(Parcel in) {
            textName = in.readString();
            textCategory = in.readString();
            textQuantity = in.readString();
            textImportance = in.readString();
        }

        public static final Creator<Builder> CREATOR = new Creator<Builder>() {
            @Override
            public Builder createFromParcel(Parcel in) {
                return new Builder(in);
            }

            @Override
            public Builder[] newArray(int size) {
                return new Builder[size];
            }
        };

        public Context getContext() {
            return context;
        }

        public Builder setActivity(Context context) {
            this.context = context;
            return this;
        }

        public Builder(Context context) {
            this.context = context;
        }

        public Builder setTextName(String textName) {
            this.textName = textName;
            return this;
        }

        public String getTextName() {
            return textName;
        }

        public Builder setTextCategory(String textCategory) {
            this.textCategory = textCategory;
            return this;
        }

        public String getTextCategory() {
            return textCategory;
        }

        public Builder setTextQuantity(String textQuantity) {
            this.textQuantity = textQuantity;
            return this;
        }

        public String getTextQuantity() {
            return textQuantity;
        }

        public Builder setTextImportance(String textImportance) {
            this.textImportance = textImportance;
            return this;
        }

        public String getTextImportance() {
            return textImportance;
        }


        public OnPositiveClicked getOnPositiveClicked() {
            return onPositiveClicked;
        }

        public Builder setOnPositiveClicked(OnPositiveClicked onPositiveClicked) {
            this.onPositiveClicked = onPositiveClicked;
            return this;
        }

        public OnNegativeClicked getOnNegativeClicked() {
            return onNegativeClicked;
        }

        public Builder setOnNegativeClicked(OnNegativeClicked onNegativeClicked) {
            this.onNegativeClicked = onNegativeClicked;
            return this;
        }

        public OnUpdateClicked getOnUpdateClicked() {
            return onUpdateClicked;
        }

        public Builder setOnUpdateClicked(OnUpdateClicked onUpdateClicked) {
            this.onUpdateClicked = onUpdateClicked;
            return this;
        }

        public Builder build() {
            return this;
        }

        public Dialog show() {
            return getInstance().show(((Activity) context), this);
        }

        @Override
        public int describeContents() {
            return 0;
        }

        @Override
        public void writeToParcel(Parcel parcel, int i) {
            parcel.writeString(textName);
            parcel.writeString(textCategory);
            parcel.writeString(textQuantity);
            parcel.writeString(textImportance);
        }

    }

    public interface OnPositiveClicked {
        void OnClick(View view, Dialog dialog);
    }

    public interface OnNegativeClicked {
        void OnClick(View view, Dialog dialog);
    }


}

EditActivity

build and show MyDialog in a listview OnItemClickListner.

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
            MyDialog.Builder dialog=null;

            // TODO get the strings from database at the position i
            String name = 
            String category = 
            String quantity = 
            String importance = 

            dialog.setTextName(name)
                .setTextCategory(category)
                .setTextQuantity(quantity)
                .setTextImportance(importance)
                .setOnPositiveClicked(new MyDialog.OnPositiveClicked() { 
                             @Override
                            public void OnClick(View view, Dialog dialog) {

                            }
                        })
                .setOnNegativeClicked(new MyDialog.OnNegativeClicked() { 
                            @Override
                            public void OnClick(View view, Dialog dialog) {

                            }
                        })
                .setOnUpdateClicked(new MyDialog.OnUpdateClicked() { 
                            @Override
                            public void OnClick(View view, Dialog dialog) {
                                // TODO update database here
                            }
                        })

                .build();
                dialog.show();
        }
    });

Hope it helps. Let me know if there is a mistake or a better way.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

2.1m questions

2.1m answers

60 comments

57.0k users

...