【问题标题】:Get values of clicked item in Arrayadapter list [closed]获取 Arrayadapter 列表中单击项目的值 [关闭]
【发布时间】:2018-10-04 14:34:00
【问题描述】:

我正在做一个项目,它只是显示listview 数据来自数据库。

我已经使用 ArrayAdapter 和 AsyncTask 来实现这一点。我的列表正在运行,但我需要在单击时获取该特定列表项的值。

我已将数据库唯一 ID 设置为 listviewitem,我认为这有助于从视图中获取 ID,但我被卡住了。我看过一些视频,他们得到了他们点击的每个列表项的确切数据库 ID 列。但我对这个概念知之甚少。

我的实际看法是这样的

这是我的数据库操作类

    package com.me.doctor.doctor_me;

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

    import com.readystatesoftware.sqliteasset.SQLiteAssetHelper;

    public class DatabaseOperation extends SQLiteAssetHelper {

        public static final int DB_VERSION = 1;
        public static final String DB_NAME= "app_db.db";

        public DatabaseOperation(Context context) {
            super(context, DB_NAME,null, DB_VERSION);
        }

        // Verify user Loggin
        public boolean loginUser(String email, String password) {
            SQLiteDatabase db = this.getReadableDatabase();
            SQLiteQueryBuilder qb = new SQLiteQueryBuilder();

            String sqlTables = "user";
            qb.setTables(sqlTables);

            Cursor c = qb.query(db,null,"email = ? AND password = ?",new String[]{email,password},null,null,null);

            if (c.getCount() > 0) {
                return true;
            } else {
                return false;
            }
        }

        // Reg user
        public boolean registerUser(String user_name,String telephone,String nic,String gender,
                                    String email, String password){
            SQLiteDatabase db = this.getWritableDatabase();
            ContentValues contentValues = new ContentValues();

            contentValues.put("user_name", email);
            contentValues.put("telephone", telephone);
            contentValues.put("nic", nic);
            contentValues.put("gender", gender);
            contentValues.put("email", email);
            contentValues.put("password", password);

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

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

        // Get all infor from the doctor table to display in list view
        public Cursor getInformation(SQLiteDatabase db){
            String[] selectios = {"d_id","d_name","d_hospital","d_category"};
            Cursor cursor = db.query("doctor",selectios,null,null,null,null,null);

            return cursor;
        }

    }

保持列表视图的医生显示类

 package com.me.doctor.doctor_me;

 import android.support.v7.app.AppCompatActivity;
 import android.os.Bundle;

 public class DisplayDoctor extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.display_doctor_layout);
    BackgroundTask backgroundTask = new BackgroundTask(this);
    backgroundTask.execute("get_info");
}

}

这是 AsynTask 类

package com.me.doctor.doctor_me;

import android.app.Activity;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.AsyncTask;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.Toast;

public class BackgroundTask extends AsyncTask<String,Doctor,String> {

Context ctx;
DoctorAdapter doctorAdapter;
Activity activity;
ListView listView;
Doctor doctor;

BackgroundTask(Context ctx){
    this.ctx = ctx;
    activity = (Activity) ctx;
    doctor = new Doctor();
}
@Override
protected String doInBackground(String... strings) {

    String method = strings[0];
    DatabaseOperation databaseOperation = new DatabaseOperation(ctx);
    if(method.equals("get_info")){
        listView = activity.findViewById(R.id.display_list_view);
        SQLiteDatabase db = databaseOperation.getReadableDatabase();
        Cursor cursor = databaseOperation.getInformation(db);
        doctorAdapter = new DoctorAdapter(ctx,R.layout.display_doctor_row);

        String name, category, hospital;
        int id;

        while(cursor.moveToNext()){
            id = cursor.getInt(cursor.getColumnIndex("d_id"));
            name = cursor.getString(cursor.getColumnIndex("d_name"));
            category = cursor.getString(cursor.getColumnIndex("d_category"));
            hospital = cursor.getString(cursor.getColumnIndex("d_hospital"));
            Doctor doctor = new Doctor(id,name,category,hospital);
            publishProgress(doctor);
        }
        return "get_info";
    }
    return null;
}

@Override
protected void onProgressUpdate(Doctor... values) {
    // add each of doctor class object add method inside the adapter class
    doctorAdapter.add(values[0]);
}

@Override
protected void onPostExecute(String s) {
    if(s.equals("get_info")){
        listView.setAdapter(doctorAdapter);

        listView.setOnItemClickListener(new  android.widget.AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                                    final int position, long id) {

                // Stuck at here
            }
        });
    }else{
        Toast.makeText(ctx,s,Toast.LENGTH_LONG).show();
    }
}
}

这是适配器类

package com.me.doctor.doctor_me;

import android.content.Context;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.List;

public class DoctorAdapter extends ArrayAdapter {

List list = new ArrayList();
public DoctorAdapter(@NonNull Context context, int resource) {
    super(context, resource);
}

// Add each object of doctor to the list object
public void add(@Nullable Doctor object) {
    list.add(object);
    super.add(object);
}

@Override
public int getCount() {
    return list.size();
}

@Nullable
@Override
public Object getItem(int position) {
    return list.get(position);
}

@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
    View row = convertView;
    DoctorHolder doctorHolder;

    if(row == null){
        LayoutInflater layoutInflater = (LayoutInflater) this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        row = layoutInflater.inflate(R.layout.display_doctor_row,parent,false);

        doctorHolder = new DoctorHolder();
        doctorHolder.tx_name = row.findViewById(R.id.t_name);
        doctorHolder.tx_category = row.findViewById(R.id.t_category);
        doctorHolder.tx_hospital = row.findViewById(R.id.t_hospital);
        doctorHolder.tx_id = row.findViewById(R.id.t_id);
        row.setTag(doctorHolder);
    }else{
        doctorHolder = (DoctorHolder) row.getTag();
    }

    Doctor doctor = (Doctor)getItem(position);
    doctorHolder.tx_id.setText(Integer.toString(doctor.getId()));
    doctorHolder.tx_name.setText(doctor.getName().toString());
    doctorHolder.tx_category.setText(doctor.getCategory().toString());
    doctorHolder.tx_hospital.setText(doctor.getHospital().toString());

    return row;
}
static class DoctorHolder{
    TextView tx_name, tx_category, tx_hospital, tx_id;
}
}

我认为不需要附加 XML,因为我已经发布了最终视图。如果他们需要,请告诉我。我实际上需要获取每个可点击的项目数据库 id 列值,因为使用该 id 我在另一个活动中做了更多的处理。

【问题讨论】:

  • 考虑不使用SQliteAssetHelper 类。由于不再维护:更多信息:github.com/jgilfelt/android-sqlite-asset-helper
  • 我正在使用 SQliteAssetHelper 类,但这会影响存档吗?
  • @SahanPasinduNirmal 您的setOnItemClickListener 是否被调用?
  • 是的,我已经检查过了
  • 不,可以使用,但由于现在没有维护,以后可能会出现未解决的问题。 我的问题你的setOnItemClickListener在哪里?

标签: android sqlite arraylist android-arrayadapter


【解决方案1】:

试试这个

listView.setOnItemClickListener(new  android.widget.AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                                final int position, long id) {

           Doctor doctor = (Doctor)parent.getItemAtPosition(position);
           String ID = Integer.toString(doctor.getId());


        }
    });

【讨论】:

  • 让我检查一下这段代码先生,谢谢您的努力。 :)
  • 编辑器向我显示错误,例如“无法解析方法 getItem(int)”
  • 如有错误欢迎更新..!
  • 编辑很高兴帮助考虑在未来的编码中使用Recylerview 它有很多功能和更新的小部件..
  • 编码愉快 :)
【解决方案2】:

getView 方法中的 OnClickListener

        row.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View v) {
      Toast.makeText(view.getContext(),doctor.getHospital().toString(),Toast.LENGTH_LONG).show();


    }
});

希望这会对你有所帮助......祝你有美好的一天

【讨论】:

  • 先生,这显示了两个错误,例如“视图无法解析符号”和“变量医生在内部类中被访问,需要声明为 final”
  • @SahanPasinduNirmal 这些错误与您对Java的基础缺乏了解有关,例如变量可见性以及能够区分具有相同名称的变量和类这个例子。我强烈建议您在继续使用 Android 之前开始获取这些内容。
  • 酷,让我问一些我没见过的代码,在这里我没有使用医生对象,或者我不是创建的。你更喜欢我应该创建它吗?和这样的视图是android概念不仅仅是java。
【解决方案3】:

在您的onBindViewHolder 中,您需要调用 OnClickListener

holder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
          String name = list.get(position).getValueName();

        }
    });

【讨论】:

  • 正确看代码。没有onBindViewHolder
  • 先生,onBindViewHolder 方法在哪里?
  • 在您的 getView 方法中,getView 是您的 Viewholder
  • 那么先生,您说我在 getView 方法中使用此代码?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-30
  • 2013-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-01
相关资源
最近更新 更多