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