列表视图中的“分隔符”

时间:2013-05-28 09:28:58

标签: android android-layout listview android-listview

我使用AsynTask在json的listview中显示数据。

代码在这里。

public class MenuTask extends AsyncTask<String, String, String> {

    @Override
    protected String doInBackground(String... arg0) {
        // TODO Auto-generated method stub
        List<NameValuePair> params = new ArrayList<NameValuePair>();
        // Getting JSON String from URL..............
        JSONObject jsonObject = jParser.makeHttpRequest(
                "http://smartaway.dk/json/submenu.php?resid=" + res_id,
                "POST", params);
        try {
            bestdeal = jsonObject.getJSONArray(TAG_MENU);

            // / LOOping through AllEvents........
            for (int i = 0; i < bestdeal.length(); i++) {
                JSONObject e = bestdeal.getJSONObject(i);
                String resname = e.getString(TAG_MENUNAME);
                String city_state = e.getString(TAG_PRICE);

                // Creating New HAsh Map.........
                HashMap<String, String> map = new HashMap<String, String>();
                // adding each child node to HashMap key => value
                // map.put(TAG_ID, id);
                map.put(TAG_MENUNAME, resname);
                map.put(TAG_PRICE, city_state);
                /*
                 * map.put(TAG_STREET, street); map.put(TAG_COUSINE,
                 * cousine); map.put(TAG_RES_LOGO, reslogo);
                 */
                // adding HashList to ArrayList
                bestdeal_list.add(map);
            }
            // }
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return null;
    }

    @SuppressWarnings("deprecation")
    @Override
    protected void onPostExecute(String result) {

        super.onPostExecute(result);

        /*
         * if(bestdeal_list.isEmpty()){ AlertDialog alertDialog=new
         * AlertDialog.Builder(getParent()).create();
         * alertDialog.setTitle("No Best Deal Found");
         * alertDialog.setButton("Ok", new DialogInterface.OnClickListener()
         * {
         * 
         * @Override public void onClick(DialogInterface dialog, int which)
         * {
         * 
         * 
         * } }); alertDialog.show(); } else{
         */
        /*
         * if (bestdeal_list.isEmpty()) {
         * Toast.makeText(getApplicationContext(), "Empty Menu",
         * Toast.LENGTH_LONG).show(); } else{
         */
        runOnUiThread(new Runnable() {
            public void run() {
                /**
                 * Updating parsed JSON data into ListView
                 * */
                ListAdapter adapter = new SimpleAdapter(
                        RestaurantDetails.this, bestdeal_list,
                        R.layout.menu_list, new String[] { TAG_MENUNAME,
                                TAG_PRICE }, new int[] { R.id.textView1,
                                R.id.textView3 });
                list.setAdapter(adapter);

            }
        });
    }
    // }
}

一切正常但我想通过将listview分成几部分来修改我的代码。我想要类别1下的前4个列表项目,类别2下的其他4个列表项目。我不想要可扩展的列表视图。只想修改上面提到的代码。

3 个答案:

答案 0 :(得分:2)

    在主(“UI”)线程上调用
  1. onPostExecute,因此实际上不需要通过runOnUiThread(Runnable)运行其代码。
  2. 如果您想在同一个ListView中显示两种类型的观看次数,则需要修改Adapter以提供它(请参阅Adapter.getViewTypeCount()),然后您需要对数据集(示例中为List)因此它将反映您请求的排序+部分,最后您需要在适配器中处理它(按给定位置返回相应的类型/视图)。 另请参阅Adapter.getItemViewType()Adapter.getView()

答案 1 :(得分:1)

您可以选择多种选项。看看你的问题的一条评论中的链接,或者看看我曾经写过的SectionedAdapter

您基本上想要做的是使用自定义适配器,很可能源自BaseAdapter。您需要覆盖getViewTypeCount()并返回列表中不同类型的列表项的数量。在你的情况下它是2,因为你有正常的列表项和类别。

如果指定位置的项目是普通列表项目,则还必须覆盖getItemViewType(position)并返回0;如果是类别,则返回1。

最后,您还必须覆盖getView()并根据getItemViewType()返回相应类型(类别或普通列表项)的列表项。

答案 2 :(得分:1)

britzl和avimak都给出了很好的答案,但是对于某些用例,还有另一种方法可能更简单,更充分。

首先指定一个列表项布局,如下所示:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" android:layout_height="wrap_content" >

    <TextView
        android:id="@+id/section_header"
        android:layout_width="match_parent" android:layout_height="wrap_content" />

    <RelativeLayout
        android:layout_below="@id/section_header" 
        android:layout_width="match_parent" android:layout_height="wrap_content">

        <!-- your layout here ... -->

    </RelativeLayout>

</RelativeLayout>

然后,在适配器中,决定是否要显示节标题。

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View view = super.getView(position, convertView, parent);
    bindSectionHeader(position, view);
    return view;
}

private void bindSectionHeader(int position, View view) {
    TextView sectionView = (TextView) view.findViewById(R.id.section_header);

    if (isBeginningOfSection(position)) {
        sectionView.setText(getSectionTitle(position));
        sectionView.setVisibility(View.VISIBLE);
    } else {
        sectionView.setVisibility(View.GONE);
    }
}

private boolean isBeginningOfSection(int position) {
    // ...
}

private String getSectionTitle(int position) {
    // ...
}

AlphabetIndexer可能有助于实施这两种方法。