由于静态和非静态方法冲突,无法更新回收器视图



我创建了一个回收视图,该视图从SQLITE数据库中获取数据。我有一个小的对话框,其中包含两个编辑文本,在按下正按钮后,这些值存储在数据库中,我希望我的回收器视图根据这些新值进行更新...因为我在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调用此问题时,它说您不能从静态上下文中调用非静态方法。现在是说您无法从静态上下文中调用NotifyIteminSerted()...请给我一个解决方案...预先感谢...

它与此答案非常相似:https://stackoverflow.com/a/4279847/4888701

在Android中,观察者模式是您最好的朋友。基本上,您使用相同的模式将数据传达给您的活动,然后使用定义的方法进行活动更新适配器。几乎只要您需要在两种不同的东西之间传递数据时,相同的模式几乎可以使用。当您使用一堆片段和适配器时,请记住您的活动就像是指挥官,让每个人周围的每个人都可以交流,他们想使用观察者模式来更改某些东西。

最新更新