有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java无法从活动调用RecyclerView适配器的方法

我正在尝试将recycler视图的数据设置为从异步任务显示。我从内部类AsyncTask的postExecute调用方法setdataEntries。但是安卓 studio向我显示了找不到方法的错误

适配器类

public class EntryAdapter extends RecyclerView.Adapter<EntryAdapter.ViewHolder> {
List<UserTuple> entries;
final private itemClickListener mOnClickListener;
public interface itemClickListener{
    void onItemClick(UserTuple utuple);
}

public EntryAdapter(itemClickListener clickhandler) {
    mOnClickListener = clickhandler;
}
public void setdataEntries(List<UserTuple> Data) {
    entries = Data;
    notifyDataSetChanged();
}
@Override
public EntryAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.singleusertuple,parent,false);
    return new ViewHolder(view);
}

@Override
public void onBindViewHolder(EntryAdapter.ViewHolder holder, int position) {

    holder.Username.setText(entries.get(position).getUsername());
    holder.Password.setText(entries.get(position).getPassword());

}

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

public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

    private TextView Username;
    private TextView Password;
    private CardView card;
    public ViewHolder(View itemView) {
        super(itemView);
        Username = itemView.findViewById(R.id.susername);
        Password=itemView.findViewById(R.id.pass);
        itemView.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        int adapterPosition = getAdapterPosition();
        UserTuple ut=new UserTuple(entries.get(adapterPosition).getUsername(),entries.get(adapterPosition).getPassword());
        mOnClickListener.onItemClick(ut);
    }
}
}

呼叫活动

public class Usertuple extends AppCompatActivity implements EntryAdapter.itemClickListener {
private RecyclerView recyclerView ;
private RecyclerView.Adapter adapater;
private SnapHelper snapHelper;
private List<UserTuple> entries;
private ProgressBar mLoadingIndicator;
private Bundle extras;

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_logins);
    extras = getIntent().getExtras();
    //String site= extras.getString("sitename");
    mLoadingIndicator = (ProgressBar) findViewById(R.id.pb_loading_indicator);

    Log.i("Logins","Size of returned list "+entries.size());
    recyclerView = findViewById(R.id.recycleview);
    recyclerView.setLayoutManager(new LinearLayoutManager(this));
    recyclerView.setHasFixedSize(true);
    adapater = new EntryAdapter(this);
    recyclerView.setAdapter(adapater);
    snapHelper= new LinearSnapHelper();
    snapHelper.attachToRecyclerView(recyclerView);
    dataView();

}
public void dataView() {
    String site= extras.getString("sitename");
    recyclerView.setVisibility(View.VISIBLE);
    new FetchDataTask().execute(site);
}

@Override
public void onItemClick(UserTuple utuple) {

}
private String key(){
    SharedPreferences sharedPref = getSharedPreferences(
            "User", this.MODE_PRIVATE);
    final String passphrase = sharedPref.getString("userid", "none");
    return passphrase;
}
public void showerror(){
    recyclerView.setVisibility(View.GONE);
    Toast.makeText(this,"Error in retrieving",Toast.LENGTH_SHORT).show();

}
public setdata(List<UserTuple> data){
    adapater.setdataEntries(data);
}
public class FetchDataTask extends AsyncTask<String, Void, List<UserTuple>> {

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        mLoadingIndicator.setVisibility(View.VISIBLE);
    }

    @Override
    protected List<UserTuple> doInBackground(String... params) {

        /* If there's no zip code, there's nothing to look up. */
        if (params.length == 0) {
            return null;
        }

        String site = params[0];

        try {
            AppDatabase db = Room.databaseBuilder(getApplicationContext(),AppDatabase.class, "production")
                    .build();
            entries =db.entryDao().getSpecific(site);
            for(UserTuple ut : entries){
                Log.i("password",ut.getPassword());
                String st = new Decryption().decrypt(ut.getPassword(),key());
                Log.i("After decryption",st);
                ut.setPassword(st);
            }
            return entries;

        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    @Override
    protected void onPostExecute(List<UserTuple> Data) {
        mLoadingIndicator.setVisibility(View.INVISIBLE);
        if (Data != null) {
            adapater.setdataEntries(Data);
        } else {
            showerror();
        }
    }
}


}

我希望数据库调用是后台任务。我不希望活动冻结等待数据库调用。有什么想法吗?谢谢


共 (1) 个答案

  1. # 1 楼答案

    声明类适配器

    private EntryAdapter adapter;
    

    而不是

    private RecyclerView.Adapter adapater;
    

    因为RecyclerView.Adapter类没有任何名为setdataEntries的方法,但只有EntryAdapter类有此方法,所以只有EntryAdapter类型的对象可以调用setdataEntries方法

    或者你也可以使用向下投射作为

    ((EntryAdapter)adapater).setdataEntries(data);