Как переместить одно действие в другое в представлении Recycler? - PullRequest
0 голосов
/ 05 марта 2020

Что ж, у меня проблема (я использую kotlin), мне нужно перейти от Menu_cliente к create_clients_upd с информацией из строки, по которой я щелкаю, я хочу переходите от макета к другому, щелкая в программе recyclerView (элемент «вектор», только иллюстративный), и при щелчке по нему было необходимо указать данные в правильном поле, чтобы можно было изменить информацию (обновить).

это работало по-другому (кроме диалогового окна), но мне нужно улучшить этот способ, и иметь возможность обновлять и удалять из create_clients_upd ..

обновление 2

обновление выполнено

Обновление кода объекта

@Parcelize class clientes (
var codigo_cliente: Int = 0,
var nome_cliente: String? = "",
var morada_cliente: String? = "",
var localidade_cliente: String? = "",
var postal_cliente: String? = "",
var contribuinte_cliente: String? = "",
var telefone_cliente: String? = "",
var pais_cliente: String? = ""): Parcelable


2020-03-06 16:39:42.342 10121-10121/com.example.jetpackteste E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.jetpackteste, PID: 10121
kotlin.NotImplementedError: An operation is not implemented: not implemented
    at com.example.jetpackteste.Dados.IS4.onUpgrade(IS4.kt:53)
    at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:417)
    at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:341)
    at com.example.jetpackteste.Dados.IS4.getClient(IS4.kt:62)
    at com.example.jetpackteste.Menu_Clientes.verClientes(Menu_Clientes.kt:84)
    at com.example.jetpackteste.Menu_Clientes.onCreate(Menu_Clientes.kt:75)
    at android.app.Activity.performCreate(Activity.java:7802)
    at android.app.Activity.performCreate(Activity.java:7791)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1299)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3245)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409)
    at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016)
    at android.os.Handler.dispatchMessage(Handler.java:107)
    at android.os.Looper.loop(Looper.java:214)
    at android.app.ActivityThread.main(ActivityThread.java:7356)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)

Адаптер

class clientesAdapter(mCtx: Context, val clientes: ArrayList<clientes>) :
    RecyclerView.Adapter<clientesAdapter.ViewHolder>() {
    val mCtx = mCtx

    class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        val IDcliente_view = itemView.IDcliente_view
        val Name_view = itemView.Name_view
        //val delete_button = itemView.delete_button
        val info_view = itemView.info_view
    }

    override fun onCreateViewHolder(p0: ViewGroup, p1: Int): clientesAdapter.ViewHolder {
        val v = LayoutInflater.from(p0.context).inflate(R.layout.menu_client_app, p0, false)
        return ViewHolder(v)
    }

    // cria linhas consoante a criação dos dados
    override fun getItemCount(): Int {
        return clientes.size
    }

    override fun onBindViewHolder(p0: clientesAdapter.ViewHolder, p1: Int) {
        val client: clientes = clientes[p1]
        p0.IDcliente_view.text = client.codigo_cliente.toString()
        p0.Name_view.text = client.nome_cliente
    }
}

RecyclerView

    private fun  verClientes(){
        val clienteslista = IS4.getClient(this)
        val adapter = clientesAdapter(this,clienteslista)
        val rv : RecyclerView = findViewById(R.id.rv)
        rv.layoutManager = LinearLayoutManager(this, LinearLayout.VERTICAL,false) as RecyclerView.LayoutManager
        rv.adapter = adapter
    }

    override fun onResume() {
        verClientes()
        super.onResume()
    }

База данных

fun update_cliente(id: String, codigo_cliente: Int, nome_cliente: String, morada_cliente: String, localidade_cliente: String, postal_cliente: String, contribuinte_cliente: String, telefone_cliente: String, pais_cliente: String) : Boolean {
    val db = this.writableDatabase
    val contentValues = ContentValues()
    var result = false
    contentValues.put(DB_Cliente_Codigo,codigo_cliente)
    contentValues.put(DB_Cliente_Nome,nome_cliente)
    contentValues.put(DB_Cliente_Morada,morada_cliente)
    contentValues.put(DB_Cliente_Localidade,localidade_cliente)
    contentValues.put(DB_Cliente_Postal,postal_cliente)
    contentValues.put(DB_Cliente_Contribuinte,contribuinte_cliente)
    contentValues.put(DB_Cliente_Telefone,telefone_cliente)
    contentValues.put(DB_Cliente_Pais,pais_cliente)

    try {
        db.update(CLIENTES_TABLE_NAME, contentValues, "$DB_Cliente_Codigo = ?", arrayOf(id))
        result = true
    } catch (e : Exception){
        Log.e(ContentValues.TAG, "Erro ao atualizar")
        result = false

    }
    return result
}

create_clients_upd edittext var

IDinput_upd

Nomeinput_upd

Moradainput_upd

Localidadeinput_upd

cod1_upd

Contribuinteinput_upd

Telefoneinput_upd

Zonainput_upd

Ответы [ 2 ]

0 голосов
/ 06 марта 2020

сначала измените адаптер следующим образом:

class clientesAdapter(mCtx: Context, val clientes: ArrayList<clientes>, val onItemClick: (clientes) -> Unit) :
    RecyclerView.Adapter<clientesAdapter.ViewHolder>() {
    val mCtx = mCtx

    override fun onCreateViewHolder(p0: ViewGroup, p1: Int): clientesAdapter.ViewHolder {
        val v = LayoutInflater.from(p0.context).inflate(R.layout.menu_client_app, p0, false)
        return ViewHolder(v, onItemClick)
    }

    // cria linhas consoante a criação dos dados
    override fun getItemCount(): Int {
        return clientes.size
    }

    override fun onBindViewHolder(p0: clientesAdapter.ViewHolder, p1: Int) {
        val client: clientes = clientes[p1]
        p0.IDcliente_view.text = client.codigo_cliente.toString()
        p0.Name_view.text = client.nome_cliente
        p0.itemView.setOnClickListener {
            p0.onItemClick(client)
        }
    }

    class ViewHolder(itemView: View, val onItemClick: (clientes) -> Unit) : RecyclerView.ViewHolder(itemView) {
        val IDcliente_view = itemView.IDcliente_view
        val Name_view = itemView.Name_view
        //val delete_button = itemView.delete_button
        val info_view = itemView.info_view
    }
}

Я добавил параметр Unit для конструкторов адаптеров и виджетов. Модуль работает как интерфейсный слушатель в Java.

, затем измените метод, в котором вы назначаете адаптер для просмотра переработчика:

   private fun  verClientes(){
        val clienteslista = getClient(this)
        val adapter = clientesAdapter(this, clienteslista) { cliente ->
            val intent = Intent(this, DetailActivity::class.java)
            intent.putExtra("cliente_key", cliente)
            startActivity(intent)
        }
        val rv : RecyclerView = findViewById(R.id.rv)
        rv.layoutManager = LinearLayoutManager(this, LinearLayout.VERTICAL,false) as RecyclerView.LayoutManager
        rv.adapter = adapter
    }

измените ваш cliente объект:

@Parcelize
class clientes(...your params...): Parcelable

если вы не сможете импортировать @Parcelize добавьте это в свой build.gradle. https://android.jlelse.eu/yet-another-awesome-kotlin-feature-parcelize-5439718ba220

вы получите переданный cliente объект в методе getAtent () DetailActivity, который вы будете использовать для отображения своих данных:

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val cliente = intent.extras?.getParcelable<cliente>("cliente_key")
}

use cliente модель для заполнения полей ввода

0 голосов
/ 06 марта 2020

Я не привык к kotlin, но вы можете преобразовать следующий код из kotlin в java.

Вы можете создать интерфейс в классе RecyclerView Adapter примерно так:

public interface onItemClick{
 void onClick(View v,ModelClass modelclass);
}

В классе ViewHolder добавьте прослушиватель кликов к векторному изображению, например

imageView.setOnClickLister(v->onItemClick.onClick(v, listItems.get(getAdapterPosition())))

. Конструктор clientesAdapter должен иметь в качестве параметра onItemClick.

Теперь в вашей MainActivity

recyclerView.setLayoutManager(new LinearManager(this));
recyclerView.setAdapter(arrayList,new OnItemClick){
 @Override
        public void onClick(View view, ReflectionsMainItems reflectionsMainItems) {
            if (view.getID==R.id.imageView) {
                startActivity(new Intent(getApplicationContext(), 
                SecondActivity.class).putExtras("ID",id));
            }
        }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...