2

我一直在关注几个教程,这些教程让我成功地从我的数据库中获取信息,从我的网站到我的应用程序,然后我可以在列表视图中显示它,但我想要做的不是显示完整列表,我想有几个按钮让我只显示符​​合某些标准的数据,比如底部 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 Tahnks

4

4 回答 4

4

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

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

public ... ArrayList<webResult> FilteredArrayOfWebItems;

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

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)从主方法中,adapter.notifyDataSetChanged()在您更改过滤器后调用适配器

于 2012-04-30T17:35:53.903 回答
0

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

于 2012-05-25T20:30:39.083 回答
0

在布局文件夹 fake.xml中创建一个 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);
}
于 2012-04-30T17:40:00.423 回答
0

如果你这样做就足够了:

if(position >2)
  {
        return convertView;
   }

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

于 2018-03-02T18:36:38.360 回答