安卓ListView头部

7

我有一个应用程序,它在列表视图中显示数据,但我希望第一行通过不同的布局膨胀,我已经做到了这一点,但由于将会有大量的列表项,我想优化列表视图,但存在问题。当我以这种方式填充列表视图时,我无法优化列表视图,所以我该如何将应该放在第一行的内容放入由某个布局膨胀的列表视图头部中?以下是Adapter的代码:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
    setContentView(R.layout.main);

    LinearLayout content = (LinearLayout) findViewById(R.id.content);
    LinearLayout refLayout = (LinearLayout) findViewById(R.id.refLayout);

    refLayout.setVisibility(View.GONE);

    mBtnNaslovnica = (Button) findViewById(R.id.mBtnNaslovnica);
    mBtnNaslovnica.setSelected(true);
    TextView txtView=(TextView) findViewById(R.id.scroller);
txtView.setSelected(true);
    loadPage();
    ImageButton mBtnRefresh = (ImageButton) findViewById(R.id.btnRefresh);
    mBtnRefresh.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub

            new LoadingTask().execute(URL);
        }
    });

}

public void loadPage(){

    ArrayList<HashMap<String, String>> homeList = new ArrayList<HashMap<String, String>>();



        JSONObject jsonobj;
        try {
            jsonobj = new JSONObject(getIntent().getStringExtra("json"));
            JSONObject datajson = jsonobj.getJSONObject("data");
            JSONArray news = datajson.getJSONArray(TAG_NEWS);
            JSONArray actual = datajson.getJSONArray("actual");
            for(int i = 0; i < news.length(); i++){
                JSONObject c = news.getJSONObject(i);

                // Storing each json item in variable
                String id = c.getString(TAG_ID);
                String title = c.getString(TAG_TITLE);
                String story = c.getString(TAG_STORY);
                String shorten = c.getString(TAG_SH_STORY);
                String author = c.getString(TAG_AUTHOR);
                String datetime = c.getString(TAG_DATETIME);
                String img = c.getString(TAG_IMG);
                String big_img = c.getString(TAG_BIG_IMG);



                // creating new HashMap
                HashMap<String, String> map = new HashMap<String, String>();

                // adding each child node to HashMap key => value
                map.put(TAG_ID, id);
                map.put(TAG_TITLE, title);
                map.put(TAG_STORY, story);
                map.put(TAG_IMG, img);
                map.put(TAG_BIG_IMG, big_img);
                map.put(TAG_DATETIME, datetime);
                map.put(TAG_AUTHOR, author);

                // adding HashList to ArrayList
                homeList.add(map);}
            for(int i = 0; i < actual.length(); i++){
                JSONObject c = actual.getJSONObject(i);

                // Storing each json item in variable
                String id = c.getString(TAG_ACT_TIME);
                String body = c.getString(TAG_ACT_BODY);
                String anews = " | "+ id+ " " + body;
                String cur_anews = ((TextView) findViewById(R.id.scroller)).getText().toString();
                String complete = anews + cur_anews;
                TextView anewstv = (TextView) findViewById(R.id.scroller);
                anewstv.setText(complete);

                }
        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }






    list=(ListView)findViewById(R.id.list);

    // Getting adapter by passing xml data ArrayList
    adapter=new LazyAdapter(this, homeList);        
    list.setAdapter(adapter);


    // Click event for single list row
    list.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view,int position, long id) {
            String cur_title = ((TextView) view.findViewById(R.id.title)).getText().toString();
            String cur_story = ((TextView) view.findViewById(R.id.einfo2)).getText().toString();
            String cur_author = ((TextView) view.findViewById(R.id.einfo1)).getText().toString();
            String cur_datetime  = ((TextView) view.findViewById(R.id.tVdatetime)).getText().toString();
            String cur_actual  = ((TextView) findViewById(R.id.scroller)).getText().toString();
            ImageView cur_img = (ImageView) view.findViewById(R.id.list_image);
            String cur_img_url = (String) cur_img.getTag();

            Intent i = new Intent("com.example.androidhive.CURENTNEWS");
            i.putExtra("CUR_TITLE", cur_title);
            i.putExtra("CUR_STORY", cur_story);
            i.putExtra("CUR_AUTHOR", cur_author);
            i.putExtra("CUR_DATETIME", cur_datetime);
            i.putExtra("CUR_IMG_URL", cur_img_url);
            i.putExtra("CUR_ACTUAL", cur_actual);
            startActivity(i);
        }
    });     
}   

public void reloadPage(String jsonstring){
    ArrayList<HashMap<String, String>> homeList = new ArrayList<HashMap<String, String>>();



    JSONObject jsonobj;
    try {
        jsonobj = new JSONObject(jsonstring);
        JSONObject datajson = jsonobj.getJSONObject("data");
        JSONArray news = datajson.getJSONArray(TAG_NEWS);
        JSONArray actual = datajson.getJSONArray("actual");
        for(int i = 0; i < news.length(); i++){
            JSONObject c = news.getJSONObject(i);

            // Storing each json item in variable
            String id = c.getString(TAG_ID);
            String title = c.getString(TAG_TITLE);
            String story = c.getString(TAG_STORY);
            String shorten = c.getString(TAG_SH_STORY);
            String author = c.getString(TAG_AUTHOR);
            String datetime = c.getString(TAG_DATETIME);
            String img = c.getString(TAG_IMG);
            String big_img = c.getString(TAG_BIG_IMG);


            // creating new HashMap
            HashMap<String, String> map = new HashMap<String, String>();

            // adding each child node to HashMap key => value
            map.put(TAG_ID, id);
            map.put(TAG_TITLE, title);
            map.put(TAG_STORY, story);
            map.put(TAG_IMG, img);
            map.put(TAG_BIG_IMG, big_img);
            map.put(TAG_DATETIME, datetime);
            map.put(TAG_AUTHOR, author);

            // adding HashList to ArrayList
            homeList.add(map);}
        for(int i = 0; i < actual.length(); i++){
            JSONObject c = actual.getJSONObject(i);

            // Storing each json item in variable
            String id = c.getString(TAG_ACT_TIME);
            String body = c.getString(TAG_ACT_BODY);
            String anews = " | "+ id+ " " + body;
            String cur_anews = ((TextView) findViewById(R.id.scroller)).getText().toString();
            String complete = anews + cur_anews;
            TextView anewstv = (TextView) findViewById(R.id.scroller);
            anewstv.setText(complete);

            }
    } catch (JSONException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }






list=(ListView)findViewById(R.id.list);

// Getting adapter by passing xml data ArrayList
adapter=new LazyAdapter(this, homeList);        
list.setAdapter(adapter);


// Click event for single list row
list.setOnItemClickListener(new OnItemClickListener() {

    @Override
    public void onItemClick(AdapterView<?> parent, View view,int position, long id) {
        String cur_title = ((TextView) view.findViewById(R.id.title)).getText().toString();
        String cur_story = ((TextView) view.findViewById(R.id.einfo2)).getText().toString();
        String cur_author = ((TextView) view.findViewById(R.id.einfo1)).getText().toString();
        String cur_datetime  = ((TextView) view.findViewById(R.id.tVdatetime)).getText().toString();
        String cur_actual  = ((TextView) findViewById(R.id.scroller)).getText().toString();
        ImageView cur_img = (ImageView) view.findViewById(R.id.list_image);
        String cur_img_url = (String) cur_img.getTag();

        Intent i = new Intent("com.example.androidhive.CURENTNEWS");
        i.putExtra("CUR_TITLE", cur_title);
        i.putExtra("CUR_STORY", cur_story);
        i.putExtra("CUR_AUTHOR", cur_author);
        i.putExtra("CUR_DATETIME", cur_datetime);
        i.putExtra("CUR_IMG_URL", cur_img_url);
        i.putExtra("CUR_ACTUAL", cur_actual);
        startActivity(i);
    }
});
}

public void startNewActivity(){

}
public class LoadingTask extends AsyncTask<String, Object, Object>{
    XMLParser parser = new XMLParser();
    JSONParser jParser = new JSONParser();
    LinearLayout content = (LinearLayout) findViewById(R.id.content);
    LinearLayout refLayout = (LinearLayout) findViewById(R.id.refLayout);

    protected void onPreExecute(){
        content.setClickable(false);
        refLayout.setVisibility(View.VISIBLE);
    }

    @Override
    protected Object doInBackground(String... params) {
        // TODO Auto-generated method stub


        String URL = params[0];
        JSONObject json = jParser.getJSONFromUrl(URL);
        //String xml = parser.getXmlFromUrl(URL); // getting XML from URL
         // getting DOM element
        return json;
    }

    protected void onPostExecute(Object result){
        String json;
        json = result.toString();
        reloadPage(json);
        refLayout.setVisibility(View.GONE);
    }


}



}
2个回答

18

如果我理解正确,您可以采用以下两种方法:

  1. 将headerView添加到列表中。这很容易,只需填充视图并将其传递给列表的addHeaderView(View)。注意:必须在设置适配器之前添加此视图,否则会抛出异常。

  2. 然而,由于您的'header'代表与所有其他项相同的数据,但具有不同的布局-我建议不要在这里使用Header。相反,请尝试在适配器中实现getItemViewType()http://developer.android.com/reference/android/widget/BaseAdapter.html#getItemViewType(int) 如果您这样做,就可以检查需要在getView()方法中返回哪种类型的布局。Android会为您优化和重复使用填充的视图,因此您可以确保传递给getViewconvertView是正确类型和布局的。

如果需要更多细节,请告诉我。


0

你可以这样做:

...
convertView.setOnClickListener(new OnItemClick(position));
...
public class OnItemClick implements OnClickListener {
   private final int index;
   public OnItemClick(int _index) {
            this.index = _index;
        }
   @Override
   public void onClick(View v) {
      //dosomething
   }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接