2016-09-23 75 views
0

試圖使一個searchview工作,用php和mysql。 用戶在搜索視圖/搜索欄中輸入搜索查詢來搜索特定信息,查詢被髮送到php文件,並且在RecyclerView上顯示來自php文件的結果。 不知道什麼是錯進入E/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:無連接適配器;跳過佈局,任何人都可以幫忙?

回答

0

解碼JSON時是否有機會獲得異常並直接跳到catch塊,這會跳過適配器初始化?

如果你想避免建議你創建一個空的適配器,當UI初始化時(例如在onCreate()中)將它設置爲回收視圖,那麼只需要一個方法setData(List數據)並在異步任務完成後使用它來設置數據。在這種情況下,不要忘記在數據更改時調用notifyDataSetChanged(),以便使用新數據更新回收站視圖。這樣,每次調用服務時都不必重新創建適配器。 PS:對於您當前的代碼,每次UI初始化時都會收到該消息,因爲它沒有附加適配器。異步任務完成後,您應該停止看到此消息,而不會解碼json。

相關問題