簡體   English   中英

無法從活動中調用RecyclerView適配器的方法

[英]Cannot call method of RecyclerView adapter from an activity

我正在嘗試為要從AsyncTask顯示的回收者視圖設置數據。 我從內部類AsyncTask的postExecute調用方法setdataEntries。 但是android 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();
        }
    }
}


}

我希望數據庫調用是一項后台任務。 我不希望活動凍結以等待數據庫調用。 有任何想法嗎? 謝謝

像這樣聲明適配器

private EntryAdapter adapter;

代替

private RecyclerView.Adapter adapater;

因為RecyclerView.Adapter類沒有任何名為setdataEntries方法,而只有EntryAdapter類具有此方法,所以只有類型為EntryAdapter的對象才能調用setdataEntries方法。

或者您可以將向下轉換用作

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM