将数据从数据库显示到cardview列表onclick按钮

时间:2017-03-28 06:01:40

标签: android

我开发了一个搜索功能,它运作成功。负责搜索的类是从onQueryTextSubmit调用的,它没有任何问题。

现在我想在搜索栏的同一活动中添加一个按钮,当它被点击时,数据库中的所有数据都显示在cardView中。当我添加代码时,onQueryTextSubmit方法不再有效,而且按钮没有显示数据。我不知道问题出在哪里。这是整个活动的代码。 PS:由于某种原因,它说从未使用过showdata()方法。

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.find_skill);

        button = (Button) findViewById(R.id.button);
        recyclerView = (RecyclerView) findViewById(R.id.recyclerViewer);
        recyclerView.setHasFixedSize(true);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));


        listView = (ListView) findViewById(R.id.searchList);
        searchView = (SearchView) findViewById(R.id.searchView);
        noData = (ImageView) findViewById(R.id.nodata);
        noNetwork = (ImageView) findViewById(R.id.nonetwork);
        urlAdress = "http://skillsexchangecyprus.com/SEC/ss.php";


        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                progressBar = (ProgressBar) findViewById(R.id.progressBar);
                progressBar.setVisibility(View.VISIBLE);
                getData();
            }
        });


      searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                SenderReceiver sr = new SenderReceiver(FindSkill.this, urlAdress,listView, query,noData,noNetwork);
                sr.execute();
                return false;
            }
          @Override
          public boolean onQueryTextChange(String query) {
              return false;
          }});}

          private void getData() {
              class GetData extends AsyncTask<Void, Void, String> {
                  ProgressDialog progressDialog;

                  @Override
                  protected void onPreExecute() {
                      super.onPreExecute();
                      progressDialog = ProgressDialog.show(FindSkill.this, "Fetching Data", "Please wait...", false, false);
                  }

                  @Override
                  protected void onPostExecute(String res) {
                      super.onPostExecute(res);
                      progressDialog.dismiss();
                      parseJSON(res);

                  }

                  @Override
                  protected String doInBackground(Void... params) {
                      BufferedReader bufferedReader = null;
                      try {
                          URL url = new URL(Config.GET_URL);
                          HttpURLConnection con = (HttpURLConnection) url.openConnection();
                          StringBuilder sb = new StringBuilder();
                          bufferedReader = new BufferedReader(new InputStreamReader(con.getInputStream()));
                          String json;
                          while ((json = bufferedReader.readLine()) != null) {
                              sb.append(json + "\n");
                          }
                          return sb.toString().trim();
                      } catch (Exception e) {
                          return null;
                      }
                  }
              }
              GetData gd = new GetData();
              gd.execute();
          }
    public void showData(){
        adapter = new CardAdapter(Config.skills,Config.ids);
        recyclerView.setAdapter(adapter);
    }


          private void parseJSON(String json) {
              try {
                  JSONObject jsonObject = new JSONObject(json);
                  JSONArray array = jsonObject.getJSONArray(Config.TAG_JSON_ARRAY);

                  config = new Config(array.length());

                  for (int i = 0; i < array.length(); i++) {
                      JSONObject j = array.getJSONObject(i);
                      Config.skills[i] = getSkill(j);
                      Config.ids[i] = getId(j);
                  }

              } catch (JSONException e) {
                  e.printStackTrace();
              }
          }

          private String getSkill(JSONObject j){
              String name = null;
              try {
                  name = j.getString(Config.JSON_NAME);
              } catch (JSONException e) {
                  e.printStackTrace();
              }
              return name;
          }

          private String getId(JSONObject j){
              String id = null;
              try {
                  id = j.getString(Config.JSON_ID);
              } catch (JSONException e) {
                  e.printStackTrace();
              }
              return id;
          }

这是Config类:

public class Config {

        public static String[] skills;
        public static String[] ids;


        public static final String GET_URL = "http://skillsexchangecyprus.com/SEC/mainList.php";
        public static final String JSON_ID = "id";
        public static final String JSON_NAME = "skill";
        public static final String TAG_JSON_ARRAY="result";

        public Config(int i) {
            skills = new String[i];
            ids = new String[i];
        }

        }

卡适配器类:

public class CardAdapter extends RecyclerView.Adapter<CardAdapter.ViewHolder> {

    List<ListItem> items;

    public CardAdapter(String[] skills, String[] ids){
        super();
        items = new ArrayList<>();
        for(int i =0; i<items.size(); i++){
            ListItem item = new ListItem();
            item.setSkill(skills[i]);
            item.setId(ids[i]);
            items.add(item);
        }
    }


    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.list_item, parent, false);
        ViewHolder viewHolder = new ViewHolder(v);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        ListItem myAdapter =  items.get(position);
        holder.skillName.setText(myAdapter.getSkill());
        holder.skillId.setText(String.valueOf(myAdapter.getId()));
    }

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

    class ViewHolder extends RecyclerView.ViewHolder{
        public TextView skillId;
        public TextView skillName;

        public ViewHolder(View itemView) {
            super(itemView);
            skillId = (TextView) itemView.findViewById(R.id.skillId);
            skillName = (TextView) itemView.findViewById(R.id.skillName);

        }
    }
}

1 个答案:

答案 0 :(得分:0)

  1. 您没有调用showData()方法。您需要创建CardAdapter的实例并将此适配器设置为recyclerView
  2.   

    更新OnCreate()方法,如下所示:

        ..............
        ....................
        urlAdress = "http://skillsexchangecyprus.com/SEC/ss.php";
    
        config = new Config(INITIAL_VALUE);
    
        // Adapter
        adapter = new CardAdapter(config.skills,config.ids);
        recyclerView.setAdapter(adapter);
    
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
    
                progressBar = (ProgressBar) findViewById(R.id.progressBar);
                progressBar.setVisibility(View.VISIBLE);
                getData();
            }
        });
        ....................
        ..............................
    
    1. 使用adapter.notifyDataSetChanged()更新recyclerView新项目。
    2.   

      更新parseJson()方法,如下所示:

      private void parseJSON(String json) {
      
        try {
            JSONObject jsonObject = new JSONObject(json);
            JSONArray array = jsonObject.getJSONArray(Config.TAG_JSON_ARRAY);
      
            config = new Config(array.length());
      
            for (int i = 0; i < array.length(); i++) {
                JSONObject j = array.getJSONObject(i);
                config.skills[i] = getSkill(j);
                config.ids[i] = getId(j);
      
                // Update
                adapter.notifyDataSetChanged();
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
      }
      
      1. CardAdapter构造函数中,使用skills.length代替items.size()

        public CardAdapter(String[] skills, String[] ids){
            super();
            items = new ArrayList<>();
        
            for(int i = 0; i < skills.length; i++){
                ListItem item = new ListItem();
                item.setSkill(skills[i]);
                item.setId(ids[i]);
                items.add(item);
            }
        }
        
      2. 希望这会起作用〜