我得到E/RecyclerView:没有适配器连接;跳过布局,不返回数据,我做错了什么



试图使一个搜索视图的作品,与PHP和mysql。用户在搜索视图/搜索栏中输入搜索查询,搜索特定信息,查询被发送到php文件,php文件的结果显示在RecyclerView上。不知道怎么了

MainActivity

public class MainActivity extends AppCompatActivity {
public static final int CONNECTION_TIMEOUT = 10000;
public static final int READ_TIMEOUT = 15000;
private RecyclerView mRVProd;
private AdapterProd mAdapter;
SearchView searchView = null;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.searchmain, menu);
    MenuItem searchItem = menu.findItem(R.id.action_search);
    SearchManager searchManager = (SearchManager) MainActivity.this.getSystemService(Context.SEARCH_SERVICE);
    if (searchItem != null) {
        searchView = (SearchView) searchItem.getActionView();
    }
    if (searchView != null) {
        searchView.setSearchableInfo(searchManager.getSearchableInfo(MainActivity.this.getComponentName()));
        searchView.setIconified(false);
    }
    return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
    return super.onOptionsItemSelected(item);
}
@Override
protected void onNewIntent(Intent intent) {
    if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
        String query = intent.getStringExtra(SearchManager.QUERY);
        if (searchView != null) {
            searchView.clearFocus();
        }
        new AsyncFetch(query).execute();
    }
}
private class AsyncFetch extends AsyncTask<String, String, String> {
    ProgressDialog pdLoading = new ProgressDialog(MainActivity.this);
    HttpURLConnection conn;
    URL url = null;
    String searchQuery;
    public AsyncFetch(String searchQuery){
        this.searchQuery=searchQuery;
    }
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        pdLoading.setMessage("tLoading...");
        pdLoading.setCancelable(false);
        pdLoading.show();
    }
    @Override
    protected String doInBackground(String... params) {
        try {
            url = new URL("http://192.168.0.2/prod-search.php");
        } catch (MalformedURLException e) {
            e.printStackTrace();
            return e.toString();
        }
        try {
            conn = (HttpURLConnection) url.openConnection();
            conn.setReadTimeout(READ_TIMEOUT);
            conn.setConnectTimeout(CONNECTION_TIMEOUT);
            conn.setRequestMethod("POST");
            conn.setDoInput(true);
            conn.setDoOutput(true);
            Uri.Builder builder = new Uri.Builder().appendQueryParameter("searchQuery", searchQuery);
            String query = builder.build().getEncodedQuery();
            OutputStream os = conn.getOutputStream();
            BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os, "UTF-8"));
            writer.write(query);
            writer.flush();
            writer.close();
            os.close();
            conn.connect();
        } catch (IOException e1) {
            e1.printStackTrace();
            return e1.toString();
        }
        try {
            int response_code = conn.getResponseCode();
            if (response_code == HttpURLConnection.HTTP_OK) {
                InputStream input = conn.getInputStream();
                BufferedReader reader = new BufferedReader(new InputStreamReader(input));
                StringBuilder result = new StringBuilder();
                String line;
                while ((line = reader.readLine()) != null) {
                    result.append(line);
                }
                return (result.toString());
            } else {
                return("Erro");
            }
        } catch (IOException e) {
            e.printStackTrace();
            return e.toString();
        } finally {
            conn.disconnect();
        }

    }
    @Override
    protected void onPostExecute(String result) {
        pdLoading.dismiss();
        List<DataProd> data=new ArrayList<>();
        pdLoading.dismiss();
        if(result.equals("no rows")) {
            Toast.makeText(MainActivity.this, "Nenhum resultado encontrado", Toast.LENGTH_LONG).show();
        }else{
            try {
                JSONArray jArray = new JSONArray(result);
                for (int i = 0; i < jArray.length(); i++) {
                    JSONObject json_data = jArray.getJSONObject(i);
                    DataProd prodData = new DataProd();
                    prodData.nomep = json_data.getString("nomeprod");
                    prodData.marcap = json_data.getString("marcaprod");
                    prodData.pesop = json_data.getInt("pesoprod");
                    prodData.valorp = json_data.getInt("valorprod");
                    prodData.pratp = json_data.getInt("pratprod");
                    data.add(prodData);
                }
                mRVProd = (RecyclerView) findViewById(R.id.listaprodpreco);
                mAdapter = new AdapterProd(MainActivity.this, data);
                mRVProd.setAdapter(mAdapter);
                mRVProd.setLayoutManager(new LinearLayoutManager(MainActivity.this));
            } catch (JSONException e) {
                Toast.makeText(MainActivity.this, e.toString(), Toast.LENGTH_LONG).show();
                Toast.makeText(MainActivity.this, result.toString(), Toast.LENGTH_LONG).show();
            }
        }
    }
}

}

适配器

public class AdapterProd extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private Context context;
private LayoutInflater inflater;
List<DataProd> data= Collections.emptyList();
DataProd current;
int currentPos=0;
public AdapterProd(Context context, List<DataProd> data){
    this.context=context;
    inflater= LayoutInflater.from(context);
    this.data=data;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view=inflater.inflate(R.layout.containerprod, parent, false);
    MyHolder holder=new MyHolder(view);
    return holder;
}
// Bind data
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
    MyHolder myHolder= (MyHolder) holder;
    DataProd current=data.get(position);
    myHolder.textnomep.setText(current.nomep);
    myHolder.textmarcap.setText("Marca: " + current.marcap);
    myHolder.textpesop.setText("Peso: " + current.pesop);
    myHolder.textvalorp.setText("Rs " + current.valorp + "\Und");
    myHolder.textvalorp.setTextColor(ContextCompat.getColor(context, R.color.colorAccent));
    myHolder.textpratp.setText("Prateleira: current.pratprod");
}

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

class MyHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
    TextView textnomep;
    TextView textmarcap;
    TextView textpesop;
    TextView textvalorp;
    TextView textpratp;
    public MyHolder(View itemView) {
        super(itemView);
        textnomep = (TextView) itemView.findViewById(R.id.textnomep);
        textmarcap = (TextView) itemView.findViewById(R.id.textmarcap);
        textpesop = (TextView) itemView.findViewById(R.id.textpesop);
        textvalorp = (TextView) itemView.findViewById(R.id.textvalorp);
        textpratp = (TextView) itemView.findViewById(R.id.textpratp);
        itemView.setOnClickListener(this);
    }
    @Override
    public void onClick(View v) {
        Toast.makeText(context, "Você clicou em um item", Toast.LENGTH_SHORT).show();
    }
}

}

不知道我做错了什么,不断得到这个E/RecyclerView:没有适配器连接;跳过布局,有人能帮忙吗?

是否有任何机会,你得到一个异常,而解码JSON和直接去捕捉块,跳过适配器初始化?

如果你想避免这种情况,我建议你创建一个空适配器,当UI初始化时将其设置为回收器视图(例如在onCreate()中),之后只需有一个方法setData(列表数据),并在异步任务完成后使用它来设置数据。在这种情况下,不要忘记在数据更改时调用notifyDataSetChanged(),以便使用新数据更新回收器视图。这样,您就不必在每次调用服务时都重新创建适配器。

PS:对于您当前的代码,您将获得该消息每次UI初始化,因为它没有适配器连接。一旦异步任务完成并且没有异常解码json.

,您应该停止看到此消息。

最新更新