【问题标题】:Unable to update recycler view due to static and non static method conflict由于静态和非静态方法冲突,无法更新回收站视图
【发布时间】:2017-03-06 15:36:36
【问题描述】:

我创建了一个从 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 调用它时,它说你不能从静态上下文调用非静态方法....所以我将 change() 更改为静态...现在它说你不能从静态上下文中调用 notifyItemInserted()...请给我一个解决方案...提前非常感谢...

【问题讨论】:

    标签: android static android-recyclerview


    【解决方案1】:

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

    在 android 中,观察者模式是你最好的朋友。基本上,您使用相同的模式将数据传递给您的活动,然后您让活动使用您定义的方法更新适配器。相同的模式几乎适用于您需要在两个不同的事物之间传递数据的任何时候。当您使用一堆片段和适配器时,请记住您的 Activity 就像指挥周围每个人的指挥官,所有其他部分都可以使用观察者模式传达他们想要更改某些内容。

    【讨论】:

    • 我认为这是最干净和最佳实践的方式。如果您想绕过该活动,您可以将适配器设置为对话侦听器。
    • 谢谢兄弟...如果你不介意你能推荐一些学习android的好资源
    • 这是官方培训指南:developer.android.com/training/index.html。它没有所有解决方案,但它是一个很好的起点。它确实包括我刚刚给你的答案,只是措辞不同。除此之外,如果我在那里找不到答案,我会用谷歌搜索我的问题,如果没有出现任何不令人困惑的问题,我会将教程放在搜索的末尾。
    猜你喜欢
    • 2017-03-02
    • 1970-01-01
    • 2020-12-27
    • 1970-01-01
    • 2016-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多