2017-03-06 13 views
0

sqliteデータベースからデータを取得するリサイクラビューを作成しました。私は2つの編集テキストを含む小さなダイアログを持ち、ポジティブボタンを押した後、これらの値はデータベースに保存され、これらの新しい値に従って私のリサイクラビューが更新されるようにしたい... MyAdapter.javaファイルにメソッドを作成し、この仕事...静的メソッドと非静的メソッドの競合によるリサイクラビューの更新ができません

package bk.acs.RecyclerView; 

import android.content.Context; 
import android.support.v7.widget.RecyclerView; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.TextView; 
import android.widget.Toast; 

import java.util.List; 

import bk.acs.R; 

/** 
* Created by bk on 01-03-2017. 
*/ 

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.Holder>{ 
    List<ListItem> listdata; 
    LayoutInflater inflater; 

    public MyAdapter(List<ListItem> list, Context c) 
    { 
     this.inflater=LayoutInflater.from(c); 
     listdata=list; 
    } 

    @Override 
    public Holder onCreateViewHolder(ViewGroup parent, int viewType) { 

     View view=inflater.inflate(R.layout.subjects_li,parent,false); 
     return new Holder(view); 
    } 
    @Override 
    public void onBindViewHolder(Holder holder, int position) { 
     ListItem item=listdata.get(position); 
     holder.subjectName.setText(item.subName); 
     holder.serialNo.setText(item.sno); 
    } 

    @Override 
    public int getItemCount() { 
     return listdata.size(); 
    } 


    public void change(int pos) 
    { 
     notifyItemInserted(pos-1); 
    } 


    class Holder extends RecyclerView.ViewHolder implements View.OnClickListener 
    { 
     TextView subjectName; 
     TextView serialNo; 
     View container; 
     public Holder(View itemView) { 
      super(itemView); 
      subjectName=(TextView)itemView.findViewById(R.id.subjectTitle); 
      serialNo=(TextView)itemView.findViewById(R.id.sno); 
      container=itemView.findViewById(R.id.cont_root); 
      itemView.setOnClickListener(this); 
     } 

     @Override 
     public void onClick(View view) { 
      listdata.remove(getPosition()); 
      notifyItemRemoved(getPosition()); 
     } 
    } 

} 

は、あなたが見ることができるように変更する方法が明確にリサイクルビューを更新し、私はMyDialog.java

からこのメソッドを呼び出しています。ここではMyDialog.java

package bk.acs.AddingToDatabase; 
import android.app.AlertDialog; 
import android.app.Dialog; 
import android.app.DialogFragment; 
import android.content.ContentValues; 
import android.content.DialogInterface; 
import android.database.sqlite.SQLiteDatabase; 
import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.widget.EditText; 
import android.widget.Toast; 
import bk.acs.R; 
import bk.acs.RecyclerView.MyAdapter; 
import bk.acs.databases.Main; 

/** 
* Created by bk on 27-02-2017. 
*/ 

public class MyDialog extends DialogFragment { 
    View v; 
    EditText et1,et2; 
    ContentValues contentValues=new ContentValues(); 
    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) 
    { 
     LayoutInflater inflater=getActivity().getLayoutInflater(); 
     v=inflater.inflate(R.layout.add_dialog,null); 
     et1=(EditText)v.findViewById(R.id.subjectName); 
     et2=(EditText)v.findViewById(R.id.fname); 
     AlertDialog.Builder builder=new AlertDialog.Builder(getActivity()); 
     builder.setView(v).setPositiveButton("ADD", new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialogInterface, int i) { 
       final String subname=et1.getText().toString(),fname=et2.getText().toString(); 
       Main main=new Main(getActivity(),"subjects_db",1,1); 
       contentValues.put("SubjectName",subname); 
       contentValues.put("FileName",fname); 
       SQLiteDatabase db=main.getWritableDatabase(); 
       long res=db.insert("subjectsTable",null,contentValues); 



       MyAdapter.change(res-1); 




       Toast.makeText(getActivity(), "Number of subjects ="+res, Toast.LENGTH_SHORT).show(); 
      } 
     }).setNegativeButton("CANCEL", new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialogInterface, int i) { 

      } 
     }); 
     return builder.create(); 
    } 
} 
あるん

しかし私の問題は、私が電話しているときですこれはMyDialog.javaから、静的コンテキストから非静的メソッドを呼び出すことはできないと言っています。だから私はchange()を静的に変更しました...今はnotifyItemInserted()を呼び出すことができないと言っています静的コンテキスト...それは、この答えに非常に似ています... ...私に

答えて

0

をたくさん事前に感謝し、この男性のための解決策を教えてください:アンドロイドでhttps://stackoverflow.com/a/4279847/4888701

、オブザーバーパターンがありますあなたの親友。基本的には、同じパターンを使用してデータをアクティビティに伝達し、定義された方法を使用してアクティビティを更新します。同じパターンは、2つの異なるものの間でデータを渡す必要があるときはいつでもうまく動作します。あなたが断片とアダプターの束を使って作業しているときは、あなたのアクティビティは誰でも周りを上司とする指揮官のようであり、オブザーバーのパターンを使って何かを変更したいと他のすべての部分が通信できることを覚えておいてください。

+0

ありがとうたくさんの男...これを達成する他の方法はありますか? –

+0

私はこれが最もクリーンでベストプラクティスの方法だと思います。アクティビティをバイパスしたい場合は、代わりにアダプタをダイアログリスナーにすることができます。 – drawinfinity

+0

ありがとう仲間...アンドロイドを学ぶための良い情報源をお勧めしますか? –

関連する問題