【问题标题】:Android How to display only certain items in list view from the same array?Android 如何仅在同一数组的列表视图中显示某些项目?
【发布时间】:2012-04-30 17:05:54
【问题描述】:

我一直在关注几个教程,这些教程使我成功地从我的数据库中获取信息,从我的网站到我的应用程序,然后我可以在列表视图中显示它,但我想要做的不是显示完整列表,我想要几个按钮,让我只显示符​​合特定条件的数据,比如底部 1 只显示 medio=Periodicos 的列表项,按钮 2 显示 medio=Radios 的项目,这是我正在使用的代码

在我的主要活动中

FancyAdapter aa = null;
static ArrayList<String> resultRow;

//after onCreate
//this button I'm usin now but I'm getting the hole list!
Button periodicos = (Button) findViewById(R.id.btnPeriodicos);
            periodicos.setOnClickListener(new View.OnClickListener() {
            public void onClick(View view) {
                weballamar = "http://www.mysite.com/mydbjsonstring.php";
                webcall();
            }});

//webcall gets the info from the internet and displays the list
public void webcall(){
    ListView myListView = (ListView) findViewById(R.id.mylistView);
    aa = new FancyAdapter();
    myListView.setOnItemClickListener(onPeriodicosListClick);
    myListView.setAdapter(aa);
    PeriodicosListLayout.setVisibility(View.VISIBLE);
    webLayout.setVisibility(View.GONE);

    try {
        String result = "";
                    try {
                        HttpClient httpclient = new DefaultHttpClient();
                        HttpPost httppost = new HttpPost(weballamar);
                        // httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
                        HttpResponse response = httpclient.execute(httppost);
                        HttpEntity entity = response.getEntity();
                        InputStream webs = entity.getContent();
                        // convert response to string
                        try {
                            BufferedReader reader = new BufferedReader(
                                    new InputStreamReader(webs, "iso-8859-1"), 8);
                            StringBuilder sb = new StringBuilder();
                            String line = null;
                            while ((line = reader.readLine()) != null) {
                                sb.append(line + "\n");
                            }
                            webs.close();

                            result = sb.toString();
                        } catch (Exception e) {
                            Log.e("log_tag", "Error converting result " + e.toString());
                        }
                    } catch (Exception e) {
                        Log.e("log_tag", "Error in http connection " + e.toString());
                    }

                    // parse json data
                    try {
                        JSONArray jArray = new JSONArray(result);
                        for (int i = 0; i < jArray.length(); i++) {
                            JSONObject json_data = jArray.getJSONObject(i);
                            webResult resultRow = new webResult();
                            resultRow._id = json_data.getString("id");
                            resultRow.Name = json_data.getString("Id_Nombre");
                            resultRow.Medio = json_data.getString("Medio");
                            resultRow.Pais = json_data.getString("Pais");
                            resultRow.Estado = json_data.getString("Estado");
                            resultRow.Ciudad = json_data.getString("Ciudad");
                            resultRow.website = json_data.getString("website");
                            resultRow.Url = json_data.getString("Url");
                            resultRow.Url2 = json_data.getString("Url2");
                            resultRow.InfAnex = json_data.getString("InfAnex");
                            arrayOfWebData.add(resultRow);
                        }
                    } catch (JSONException e) {
                        Log.e("log_tag", "Error parsing data " + e.toString());
                    }
    } catch (Exception e) {
        // this is the line of code that sends a real error message to the
        // log
        Log.e("ERROR", "ERROR IN CODE: " + e.toString());
        // this is the line that prints out the location in
        // the code where the error occurred.
        e.printStackTrace();
    }
}

class FancyAdapter extends ArrayAdapter<webResult> {
    FancyAdapter() {
        super(mainActivity.this,
                android.R.layout.simple_list_item_1, arrayOfWebData);
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        if (convertView == null) {
            LayoutInflater inflater = getLayoutInflater();
            convertView = inflater.inflate(R.layout.listitem, null);
            holder = new ViewHolder(convertView);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }
        holder.populateFrom(arrayOfWebData.get(position));

        return (convertView);
    }
}

class ViewHolder {
    public TextView name = null;
    public TextView estado = null;
    public TextView ciudad = null;
    ViewHolder(View row) {
        name = (TextView) row.findViewById(R.id.periodicoName);
        estado = (TextView) row.findViewById(R.id.periodicoEstado);
        ciudad = (TextView) row.findViewById(R.id.periodicoCiudad);
    }

    void populateFrom(webResult r) {
        name.setText(r.Name);
        estado.setText(r.Estado);
        ciudad.setText(r.Ciudad);
    }
}

如您所见,我在列表视图中显示了名称庄园和城市列的完整列表,但该列表包含的项目在 medio 列中要么是周期性的,要么是无线电的,所以我怎样才能让我的适配器区分和选择只显示那些女巫 medio=periodico,从那里我也许可以做相反的事情来选择 medio=radio 塔恩克斯

【问题讨论】:

    标签: android listview android-arrayadapter listadapter


    【解决方案1】:

    无法测试此代码,但这里有一些可行的方法

    1) 创建另一个列表,仅包含过滤后的项目

    public ... ArrayList<webResult> FilteredArrayOfWebItems;
    

    2) 在您的适配器中创建一个方法,让您设置“类型”(periodico 或 radio) 字符串类型;

    public void SetType(String type)
    { 
         /* Maybe something like this */
         //Clear the FilteredArrayOfWebItems first. Not on eclipse, at the moment, but I suspect FilteredArrayOfWebItems.clear() might be call you need
    
        for(JSONObject currentItem: arrayOfWebItems)
        {
            //Check if the Medio property of the current item matches the typ
            if(currentItem.Medio.equals(type))
            {
                //Add it to the Filtered list
                FilteredArrayOfWebItems.add(currentItem);
    
            }
         }
    

    }

    3) 您可能需要重写 getCount() 方法来获取过滤项目的计数,而不是完整列表

    4) 在您的 get View 中,从过滤后的列表中读取信息

    holder.populateFrom(FilteredArrayOfWebItems.get(position)); 
    

    5) 每当您想更改过滤器时,从您的主方法调用 SetType

    6) 更改过滤器后,在 main 方法中调用适配器上的adapter.notifyDataSetChanged()

    【讨论】:

    • 这听起来像我正在寻找的,但我怎样才能为 steType() 编写代码?我的意思是如何让它只提取符合我的条件的项目
    • 我为 SetType(...) 方法添加了一个实现。您可能应该将其用作伪代码来构建您的真实方法,但希望它能让您了解该做什么。
    • 搞定了!谢谢 Gophermofur!,我刚刚也将 FilteredArrayOfWebItems 添加到了适配器中。
    【解决方案2】:

    在自定义列表活动中,删除您不需要的元素并将列表存储到某个临时列表中,然后将该临时列表传递给您的适配器。

    【讨论】:

      【解决方案3】:

      在布局文件夹中创建一个xml fake.xml

      <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent"> 
      

      public View getView(int position, View convertView, ViewGroup parent) {
              ViewHolder holder;
      
      
          if (convertView == null) {
              LayoutInflater inflater = getLayoutInflater();
              convertView = inflater.inflate(R.layout.listitem, null);
              holder = new ViewHolder(convertView);
              convertView.setTag(holder);
      
      
      
          /*****  add this code in your getView method() ********/
            if(position ==3)
            {
                  LayoutInflater inflater = getLayoutInflater();
                  convertView = inflater.inflate(R.layout.fake, null);
                  convertView.setTag(holder);
                  returns convertview;
             }
           /*****  add this code in your getView method() ********/
      
      
      
          } else {
              holder = (ViewHolder) convertView.getTag();
          }
          holder.populateFrom(arrayOfWebData.get(position));
      
          return (convertView);
      }
      

      【讨论】:

      • 还没有,我现在没有电脑,但我会试试看。
      • 你能解释一下它是如何工作的吗?它在哪里过滤列表?谢谢
      • 这里说的是 if(position ==3) 对吧?所以不应该是 if(position =="Periodicos") 还是 if(position =="Radio")?
      • @zvzej:它会跳过特定的数据。它使 FAKE 布局膨胀,因此您可以获得所需的输出。位置是一个整数。我刚刚给你举个例子,你想跳过第三行。 ....它的工作原理只是尝试告诉我如果你发现任何问题
      【解决方案4】:

      只要你这样做就足够了:

      if(position >2)
        {
              return convertView;
         }
      

      它不会显示超过 3 个结果 (0,1,2)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-17
        • 2021-07-30
        • 2018-04-22
        • 1970-01-01
        • 1970-01-01
        • 2014-09-01
        相关资源
        最近更新 更多