Передача данных из обзора переработчика в деятельность с помощью курсора - PullRequest
0 голосов
/ 02 мая 2018

У меня есть приложение с recyclervView, которое получает данные из базы данных SQLite с помощью курсора. Теперь я хочу передать эти данные другому виду деятельности, когда мы нажимаем на элемент. Можно передать данные с курсором? И получить идентификатор строки для идентификации данных в базе данных?

Второй вопрос, какое решение лучше для метода itemOnClick? Где я использую этот метод (в классе viewHolder? Или в onBindValue?) Что мне нужно положить в метод putExtra? Мой курсор?

Мой код адаптера и держателя указан ниже, если это может помочь:

public class GroceryAdapter extends RecyclerView.Adapter<GroceryAdapter.GroceryViewHolder> implements View.OnClickListener {

    private Context mContext;
    private Cursor mCursor;
    int id;


    public GroceryAdapter(Context context,Cursor cursor){
        mContext = context;
        mCursor = cursor;
    }

    @Override
    public void onClick(View v) {
    }

    public class GroceryViewHolder extends RecyclerView.ViewHolder{
        public TextView dateItem, colorItem, textItem;
        public ToggleButton lucidItem;


        public GroceryViewHolder(final View itemView) {
            super(itemView);
            dateItem = itemView.findViewById(R.id.date_item);
            colorItem = itemView.findViewById(R.id.color_item);
            textItem = itemView.findViewById(R.id.text_item);
            lucidItem = itemView.findViewById(R.id.lucid_item);

        }


    }

    @NonNull
    @Override
    public GroceryViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        LayoutInflater inflater = LayoutInflater.from(mContext);
        View view = inflater.inflate(R.layout.grocery_item, parent, false);
        return new GroceryViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull GroceryViewHolder holder, int position) {
        if(!mCursor.moveToPosition(position)){
            return;
        }
        final int id = mCursor.getInt(mCursor.getColumnIndex(CarnetDAO.ID_CARNET));
        String text = mCursor.getString(mCursor.getColumnIndex(CarnetDAO.TEXTE_CARNET));
        int color = mCursor.getInt(mCursor.getColumnIndex(CarnetDAO.COULEUR_CARNET));
        String date = mCursor.getString(mCursor.getColumnIndex(CarnetDAO.DATE_CARNET));
        int lucide = mCursor.getInt(mCursor.getColumnIndex(CarnetDAO.LUCIDITE_CARNET));

        holder.dateItem.setText(date);
        holder.colorItem.setBackgroundColor(color);
        holder.textItem.setText(text);

        if(lucide == 1){
            holder.lucidItem.setVisibility(View.VISIBLE);
        }
    }



    @Override
    public int getItemCount() {
        return mCursor.getCount();
    }

    public void swapCursor(Cursor newCursor){
        if(mCursor != null){
            mCursor.close();
        }
        mCursor = newCursor;
        if(newCursor != null){
            notifyDataSetChanged();
        }
    }

}

Моя модель данных:

книжка общедоступного класса {

public Carnet(){
    super();
}

private int id;
private String text;
private String userId;
private int color;
private String method;
private String date;
private int lucid;


public int getId(){
    return id;
}

public void setId(int id){
    this.id = id;
}

public String getText(){
    return text;
}

public void setText(String text){
    this.text = text;
}

public int getLucid(){
    return lucid;
}

public void setLucid(int lucid){
    this.lucid = lucid;
}

public void setMethod(String method){
    this.method = method;
}

public String getMethod(){
    return method;
}

public void setDate(String date){
    this.date = date;
}

public String getDate(){
    return date;
}

public void setColor(int color){
    this.color = color;
}

public  int getColor(){
    return color;
}

}

Я видел Parcelable, но я не знаю, как его использовать и в чем особенность этого.

EDIT

Я пытался поймать свое намерение в новом действии, но приложение зависло. Я получил эту ошибку:

ФАТАЛЬНОЕ ИСКЛЮЧЕНИЕ: основное Процесс: morpheus.oniri, PID: 6696 java.lang.RuntimeException: Невозможно начать деятельность ComponentInfo {morpheus.oniri / morpheus.oniri.activities.afficherCarnetActivity}: java.lang.NullPointerException: попытка вызвать виртуальный метод 'boolean java.lang.String.isEmpty ()' для ссылки на пустой объект на android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2325) на android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2387) на android.app.ActivityThread.access $ 800 (ActivityThread.java:151) на android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1303) на android.os.Handler.dispatchMessage (Handler.java:102) на android.os.Looper.loop (Looper.java:135) на android.app.ActivityThread.main (ActivityThread.java:5254) в java.lang.reflect.Method.invoke (родной метод) в java.lang.reflect.Method.invoke (Method.java:372) на com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:903) на com.android.internal.os.ZygoteInit.main (ZygoteInit.java:698) Вызывается: java.lang.NullPointerException: попытка вызвать виртуальный метод 'boolean java.lang.String.isEmpty ()' для ссылки на пустой объект at morpheus.oniri.activities.afficherCarnetActivity.getAllData (afficherCarnetActivity.java:113) at morpheus.oniri.activities.afficherCarnetActivity.onCreate (afficherCarnetActivity.java:107) на android.app.Activity.performCreate (Activity.java:5990) на android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1106) на android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2278) на android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2387)на android.app.ActivityThread.access $ 800 (ActivityThread.java:151) на android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1303) на android.os.Handler.dispatchMessage (Handler.java:102) на android.os.Looper.loop (Looper.java:135) на android.app.ActivityThread.main (ActivityThread.java:5254) в java.lang.reflect.Method.invoke (родной метод) в java.lang.reflect.Method.invoke (Method.java:372) на com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:903) на com.android.internal.os.ZygoteInit.main (ZygoteInit.java:698)

Я сделал это в onCreate ().

Intent i = getIntent();
Carnet carnetP;
carnetP = i.getParcelableExtra("data");
notes = carnetP.getText();

Ошибка в этой строке, в моем методе getAllData () вызывается в onCreate ()

if(!notes.isEmpty()){
    dream.setVisibility(View.VISIBLE);
    getDream.setChecked(true);
    getDream.setBackgroundResource(R.color.colorLog);
} else{
    dream.setVisibility(View.GONE);
    getDream.setChecked(false);
    getDream.setBackgroundResource(R.color.colorText);
}

Фактически, когда я делаю Log.d (), моя строковая переменная "notes" равна нулю, но если я делаю Log.d () на "carnetP", я получаю это

morpheus.oniri.model.Carnet@14dbb242 И это не то, что хранится в моей базе данных.

Я сделал свой putExtra на клик, как это

открытый класс GroceryViewHolder расширяет RecyclerView.ViewHolder реализует View.OnClickListener { public TextView dateItem, colorItem, textItem; public ToggleButton lucidItem;

public GroceryViewHolder(final View itemView) {
    super(itemView);
    dateItem = itemView.findViewById(R.id.date_item);
    colorItem = itemView.findViewById(R.id.color_item);
    textItem = itemView.findViewById(R.id.text_item);
    lucidItem = itemView.findViewById(R.id.lucid_item);


    itemView.setOnClickListener(this); //my itemView clik
}


@Override
public void onClick(View v) {
    int pos = getAdapterPosition();
    if(pos != RecyclerView.NO_POSITION){
        Intent intent = new Intent(mContext, afficherCarnetActivity.class);
        intent.putExtra("data", new Carnet());
        mContext.startActivity(intent);
    }

}

}

1 Ответ

0 голосов
/ 02 мая 2018

Это класс Parcelable:

public class Camel implements Parcelable {
private int id;
private String text;
private String userId;
private int color;
private String method;
private String date;
private int lucid;

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

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeInt(this.id);
    dest.writeString(this.text);
    dest.writeString(this.userId);
    dest.writeInt(this.color);
    dest.writeString(this.method);
    dest.writeString(this.date);
    dest.writeInt(this.lucid);
}

public Camel() {
}

protected Camel(Parcel in) {
    this.id = in.readInt();
    this.text = in.readString();
    this.userId = in.readString();
    this.color = in.readInt();
    this.method = in.readString();
    this.date = in.readString();
    this.lucid = in.readInt();
}

public static final Parcelable.Creator<Camel> CREATOR = new Parcelable.Creator<Camel>() {
    @Override
    public Camel createFromParcel(Parcel source) {
        return new Camel(source);
    }

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

Теперь вы передаете объект этого класса второму виду деятельности.

intent.putExtra("key",carnetdata );

Не будем обсуждать вашу ошибку NPE.

Эта ошибка возникает из-за того, что вы передаете новый класс Object of Camel, который имеет нулевое значение всех полей. Вы должны передать объект, элемент которого нажал.

public class GroceryAdapter extends RecyclerView.Adapter<GroceryAdapter.GroceryViewHolder> implements View.OnClickListener {

private Context mContext;
private Cursor mCursor;
List<Carnet> mListCarnet;
int id;


public GroceryAdapter(Context context,Cursor cursor){
    mContext = context;
    mCursor = cursor;
    mListCarnet=new ArrayList<>();
}

@Override
public void onClick(View v) {

int pos = getAdapterPosition();
    if(pos != RecyclerView.NO_POSITION){
    Intent intent = new Intent(mContext, afficherCarnetActivity.class);
    intent.putExtra("data", mListCarnet.get(pos));
    mContext.startActivity(intent);
    }
}

public class GroceryViewHolder extends RecyclerView.ViewHolder{
    public TextView dateItem, colorItem, textItem;
    public ToggleButton lucidItem;


    public GroceryViewHolder(final View itemView) {
        super(itemView);
        dateItem = itemView.findViewById(R.id.date_item);
        colorItem = itemView.findViewById(R.id.color_item);
        textItem = itemView.findViewById(R.id.text_item);
        lucidItem = itemView.findViewById(R.id.lucid_item);

        itemView.setOnClickListener(this); 
    }


}

@NonNull
@Override
public GroceryViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    LayoutInflater inflater = LayoutInflater.from(mContext);
    View view = inflater.inflate(R.layout.grocery_item, parent, false);
    return new GroceryViewHolder(view);
}

@Override
public void onBindViewHolder(@NonNull GroceryViewHolder holder, int position) {
    if(!mCursor.moveToPosition(position)){
        return;
    }
    final int id = mCursor.getInt(mCursor.getColumnIndex(CarnetDAO.ID_CARNET));
    String text = mCursor.getString(mCursor.getColumnIndex(CarnetDAO.TEXTE_CARNET));
    int color = mCursor.getInt(mCursor.getColumnIndex(CarnetDAO.COULEUR_CARNET));
    String date = mCursor.getString(mCursor.getColumnIndex(CarnetDAO.DATE_CARNET));
    int lucide = mCursor.getInt(mCursor.getColumnIndex(CarnetDAO.LUCIDITE_CARNET));

    holder.dateItem.setText(date);
    holder.colorItem.setBackgroundColor(color);
    holder.textItem.setText(text);


    Carnet carnet=new Carnet();
    carnet.setId(id);
    carnet.setText(text);
    carnet.setColor(color);
    carnet.setDate(date);
    carnet.setLucide.(lucide);
    mListCarnet.add(carnet);

    if(lucide == 1){
        holder.lucidItem.setVisibility(View.VISIBLE);
    }
}



@Override
public int getItemCount() {
    return mCursor.getCount();
}

public void swapCursor(Cursor newCursor){
    if(mCursor != null){
        mCursor.close();
    }
    mCursor = newCursor;
    if(newCursor != null){
        notifyDataSetChanged();
    }
}

}

...