繁体   English   中英

我怎样才能让用户能够在 android 的列表视图中编辑项目

[英]how can i make the user be able to edit item in list view in android

我有一个 listView ,每个项目都是一个 textView ,一个数据库包含 3 列(“ID”-“NAME”-“TAG”),列表视图中显示的是名称,用户在编辑框中输入它和与它关联并存储在数据库中的标签现在我想要当用户长按每个项目打开一个新活动包含 2 个编辑框,一个用于名称,一个用于标签并输入它们,以便更新已经点击的那个它..这是我的代码

数据库函数类:

package com.chaos.twittertask;

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

public class DataBase {

    private SQLiteDatabase mDatabase;
    private DB_Helper helper;

    public DataBase(Context context) {
        helper = new DB_Helper(context);
    }

    protected void open() {
        mDatabase = helper.getWritableDatabase();
    }

    public void close() {
        if (mDatabase != null) {
            mDatabase.close();
        }
    }
    public Cursor getAllNames()
    {
        String[] col = { "NAME" };
        Cursor cursor = mDatabase.query(
                "task", // table name
                col, // column names
                null, // where clause
                null, // where params
                null, // groupby
                null, // having
                null // orderby
        );

        return cursor;
    }

    public Cursor getTagByID(int id) {
        String[] columns = { "TAG"};

        return mDatabase.query(
                "task", // table name
                columns, // column names
                "ID" + " = " + id, // where clause // id param. could be here or appended as it is ^
                null, // where params
                null, // groupby
                null, // having
                null // orderby
        );
    }

    public void insertTagAndName(String name,String tag) {

            ContentValues newTask = new ContentValues();
            newTask.put("NAME", name);
            newTask.put("TAG",tag);
            mDatabase.insert("task", null, newTask);

    }


    public void updateNameAndTag(int id,String name,String tag) {
        ContentValues editTask = new ContentValues();
        editTask.put("NAME", name);
        editTask.put("TAG", tag);
        mDatabase.update(
                "task", // table name
                editTask, // values
                "ID" + " = " + id, // where clause
                null // where params
        );
    }
    public void getNameId(String name) {
        mDatabase.execSQL("SELECT ID from task WHERE NAME="+name);
    }
    public void deleteTagById(int id) {
        mDatabase.delete(
                "task", // table name
                "ID" + "=" + id, // where clause
                null // where params
        );
    }

}

活动:

package com.chaos.twittertask;

import android.database.Cursor;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    private Button save;
    private EditText name;
    private EditText tag;
    private TextView headline;
    private ListView list;
    private DataBase dataBase;
    private String[] names;
    private Cursor  cursor;
    private ArrayAdapter<String> adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        save= (Button) findViewById(R.id.save);
        name=(EditText) findViewById(R.id.name);
        tag=(EditText) findViewById(R.id.tag);
        headline=(TextView) findViewById(R.id.tagged_searches);
        list=(ListView) findViewById(R.id.listView);
        dataBase=new DataBase(MainActivity.this);
        save.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dataBase.insertTagAndName(name.getText().toString(), tag.getText().toString());
                name.setText("");
                tag.setText("");
                Toast.makeText(MainActivity.this, "Tag has been added successfully ",
                        Toast.LENGTH_LONG).show();
                loadData();
            }
    });
        list.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {

                return false;
            }
        });
    }

    protected void onResume() {
        super.onResume();
        loadData();
    }


    private void loadData()
    {
        int i=0;
        dataBase.open();
        cursor = dataBase.getAllNames();
        names = new String[cursor.getCount()];
        try {
            cursor.moveToFirst();
            int index_name = cursor.getColumnIndex("NAME");
            do {
                names[i] = cursor.getString(index_name);
                i++;
            }while (cursor.moveToNext());
                    adapter = new ArrayAdapter<String>(
                    this,
                    R.layout.list_item, R.id.name_item,
                    names);
            list.setAdapter(adapter);
        }catch (Exception e) {
            Toast.makeText(getApplicationContext(), e.getMessage(),
                    Toast.LENGTH_LONG).show();
        }
    }

}

这并不难做到。
您的 ListView 项目将包含一个 TextView,即名称。
最好的方法是创建两个东西,一个自定义适配器和一个对话框片段。 那么让我们开始吧。

创建一个将保存数据的新类,在您的情况下,它是名称和标志。

    public class ListItem{

    String name;
    String flag;

        public ListItem(String name, String flag) {
            this.name= name;
            this.flag= flag;
        }
    }

好的。 现在您的自定义适配器将需要此类的实例而不是字符串。 它将做与常规适配器相同的事情,但使用 ListItem。
像这样创建一个新类:

    public class ListItemAdapter extends ArrayAdapter<ListItem>{


    public ListItemAdapter(Context context, List<ListItem> items) {
        super(context, 0, items);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        Context context = getContext();
        ListItem item = getItem(position);
        View rootView = LayoutInflater.from(context).inflate(R.layout.list_item, parent, false);


        TextView name = (TextView) rootView.findViewById(R.id.your_text_view_item);
        name.setText(item.name);

        return rootView;
    }
}


现在自定义适配器已创建。 它需要一个有 2 个值的 ListItem,但只使用 1 个。另一个将在以后使用。

使用自定义适配器就像普通适配器一样。 但是在“< >”中使用String使用ListItem

现在您需要一个对话框片段来显示您的 2 个 EditText。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical">

<EditText
    android:id="@+id/dialog_name_edit_text"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginBottom="4dp"
    android:layout_marginLeft="4dp"
    android:layout_marginRight="4dp"
    android:layout_marginTop="4dp"/>

<EditText
    android:id="@+id/dialog_flag_edit_text"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginBottom="4dp"
    android:layout_marginLeft="4dp"
    android:layout_marginRight="4dp"
    android:layout_marginTop="4dp"
    android:inputType="textPassword"" />

您将通过接口的抽象方法将数据从 Fragment 传递到您的 Activity。 像这样:

public interface MyCallback{
    void callback(String name, String flag);
}

public class ListViewDialogFragment extends DialogFragment {



    MyCallback myCallback;
    EditText nameEditText;
    EditText flagEditText;

    public ListViewDialogFragment() {

    }

    public static ListViewDialogFragment newInstance(String title, MyCallback callback){
        ListViewDialogFragment fragment = new ListViewDialogFragment ();
        Bundle args = new Bundle();
        args.putString("title", title);
        fragment.setArguments(args);
        myCallback = callback;
        return fragment;
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {

    View rootView = getActivity().getLayoutInflater().inflate(R.layout.xml_we_just_created, null);
    nameEditText= (EditText) rootView.findViewById(R.id.dialog_name_edit_text);
    flagEditText= (EditText) rootView.findViewById(R.id.dialog_flag_edit_text);

    final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    builder.setView(rootView);

        String title = getArguments().getString("title");

        builder.setTitle(title);
        builder.setPositiveButton("Confirmar", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialogInterface, int i) {
            String name = nameEditText.getText.toString();
            String flag = flagEditText.getText.toString();
            if(!name.equals("") && !flag.equals(""))
                myCallback.callback(name, flag);
        }
    });
    }
}


伟大的! 现在,只要您想编辑 listItem,就需要调用它。
调用方式为:

    ListViewDialogFragment fragment = ListViewDialogFragment.newInstance("Your_Title", new ListViewDialogFragment.MyCallback(){
        @Override
        public void callback(String name, String flag){
            //Do whatever you want with the name and flag.
            //You can create a ListItem with these 2 and update your adapter.
        }
    });
    fragment.show(getFragmentManager(), "");

并将数据发送到数据库只需执行以下操作:

adapter.getItem(i).name;

adapter.getItem(i).flag;

其中“i”是来自 ListView 的索引。 ;)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM