2012-03-09 36 views
4

首先,我爲我的英語道歉,因爲它不是很好。謝謝。 我的應用程序包含幾個帶適配器的ListWiews。 ListView的數據取自位於Internet的已解析的XML文件。 現在我有一個TabHost三個選項卡和每個選項卡中的不同ListViews。 我想將TabHost更改爲新的輕鬆的方法--Java Wharton的ViewPager指標(https://github.com/JakeWharton/Android-ViewPagerIndicator),因爲有很多滑動效果。ViewPager指標與自定義ListView

我試圖將這個代碼包含在一個示例項目中,它運行良好。 現在我在ViewPager的一個片段中有一個ListView,在另外兩個片段中有一個簡單的TextView。它正在工作。 ViewPagerAdapter的

代碼如下所示:

package com.formatbce.pager; 

import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 

import android.content.Context; 
import android.os.Parcelable; 
import android.support.v4.view.PagerAdapter; 
import android.support.v4.view.ViewPager; 
import android.view.View; 
import android.widget.AbsListView; 
import android.widget.AbsListView.OnScrollListener; 
import android.widget.ListView; 
import android.widget.SimpleAdapter; 
import android.widget.TextView; 

import com.viewpagerindicator.TitleProvider; 

public class ViewPagerAdapter extends PagerAdapter 
implements TitleProvider 
{ 
    private int[] scrollPosition = new int[titles.length]; 
private static String[] titles = new String[] 
{ 
    "News", 
    "Bio", 
    "Music" 
}; 
private final Context context; 

public ViewPagerAdapter(Context context) 
{ 
    this.context = context; 
    for (int i = 0; i < titles.length; i++) 
    { 
     scrollPosition[i] = 0; 
    } 
} 

@Override 
public String getTitle(int position) 
{ 
    return titles[ position ]; 
} 

@Override 
public int getCount() 
{ 
    return titles.length; 
} 

@Override 
public Object instantiateItem(View pager, final int position) 
{ 
    if (position == 0) { 
    ListView v = new ListView(context); 
     String[] from = new String[] { "str" }; 
     int[] to = new int[] { android.R.id.text1 }; 
     List<Map<String, String>> items = 
      new ArrayList<Map<String, String>>(); 
     for (int i = 0; i < 20; i++) 
     { 
      Map<String, String> map = 
       new HashMap<String, String>(); 
      map.put("str", String.format("Item %d", i + 1)); 
      items.add(map); 
     } 
     SimpleAdapter adapter = new SimpleAdapter(context, items, 
      android.R.layout.simple_list_item_1, from, to); 
     v.setAdapter(adapter); 
     ((ViewPager) pager).addView(v, 0); 
     v.setOnScrollListener(new OnScrollListener() 
     { 

      @Override 
      public void onScroll(AbsListView view, 
       int firstVisibleItem, 
       int visibleItemCount, 
       int totalItemCount) 
      { 
       scrollPosition[ position ] = firstVisibleItem; 
      } 



      @Override 
      public void onScrollStateChanged(AbsListView view, 
        int scrollState) { 
       // TODO Auto-generated method stub 

      } 
     }); 
     return v;} 
    else { 
     TextView v = new TextView(context); 
     v.setText(titles[ position ]); 
     ((ViewPager)pager).addView(v, 0); 
     return v; 
    } 
} 

@Override 
public void destroyItem(View pager, int position, Object view) 
{ 
    if (position == 0){ 
    ((ViewPager) pager).removeView((ListView) view);} 
    else { 
    ((ViewPager) pager).removeView((TextView) view);} 

} 

@Override 
public boolean isViewFromObject(View view, Object object) 
{ 
    return view.equals(object); 
} 

@Override 
public void finishUpdate(View view) {} 

@Override 
public void restoreState(Parcelable p, ClassLoader c) {} 

@Override 
public Parcelable saveState() { 
    return null; 
} 

@Override 
public void startUpdate(View view) {} 
} 

所以,用樣品的ListView一切都很好。

但我的問題是開始,當我嘗試把我的自定義ListView。在我的舊項目的ListView這有代碼:

package com.formatbce.mdrive; 

import java.util.ArrayList; 
import android.app.AlertDialog; 
import android.app.ListActivity; 
import android.app.ProgressDialog; 
import android.content.Context; 
import android.content.DialogInterface; 
import android.content.Intent; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.ListView; 

public class Concerts extends ListActivity { 

private ArrayList<Rss_PostItem> messages; 
private Rss_PostAdapter adapter; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    if (savedInstanceState != null) { 
     messages = savedInstanceState.getParcelableArrayList("messages"); 
     adapter = new Rss_PostAdapter(Concerts.this, R.layout.post_entry, 
       messages); 
     setListAdapter(adapter); 
    } else 
     new GetParserResult().execute(); 
} 

@Override 
protected void onListItemClick(ListView l, View v, int position, long id) { 
    super.onListItemClick(l, v, position, id); 
    Intent postActivity = new Intent(this, Rss_PostActivity.class); 
    Bundle store = new Bundle(); 
    store.putString("title", messages.get(position).title); 
    store.putString("description", messages.get(position).description); 
    store.putString("link", messages.get(position).link); 
    postActivity.putExtras(store); 
    startActivity(postActivity); 
} 

protected void onSaveInstanceState(Bundle savedInstanceState) { 
    super.onSaveInstanceState(savedInstanceState); 
    savedInstanceState.putParcelableArrayList("messages", messages); 
} 

private class GetParserResult extends 
     AsyncTask<Context, Integer, ArrayList<Rss_PostItem>> { 
    private ProgressDialog loadingDialog; 
    private Concerts_Parser parser; 

    protected void onPreExecute() { 
     parser = new Concerts_Parser(); 
     loadingDialog = ProgressDialog.show(Concerts.this, "", 
       "Loading concerts list...", true); 
    } 

    @Override 
    protected ArrayList<Rss_PostItem> doInBackground(Context... arg0) { 
     return parser.parse(); 
    } 

    protected void onPostExecute(ArrayList<Rss_PostItem> result) { 
     if (result == null) { 
      AlertDialog.Builder builder = new AlertDialog.Builder(
        Concerts.this); 
      builder.setMessage(
        "Cannot load list... \nIs Internet ON?") 
        .setCancelable(false) 
        .setPositiveButton("Ok", 
          new DialogInterface.OnClickListener() { 
           public void onClick(DialogInterface dialog, 
             int id) { 
            dialog.cancel(); 
            loadingDialog.dismiss(); 
           } 
          }); 
      AlertDialog alert = builder.create(); 
      alert.show(); 
     } else { 
      messages = result; 
      loadingDialog.dismiss(); 
      adapter = new Rss_PostAdapter(Concerts.this, 
        R.layout.post_entry, messages); 
      setListAdapter(adapter); 
     } 
    } 
} 
    } 

所以我不明白,如何正確地把它放在ViewPager代碼。 我試着設置ListFragment,但對我來說這是一個很新的東西,所以我無法得到它的工作。

Google也幫不了我,跟各種開發者論壇一樣。

確實,問題是:如何讓ViewPager中顯示自定義ListView?

謝謝,我希望你能幫上忙。

UPD:

由於第一個答案,我想轉換我的活動與本教程的片段之一:http://www.e-nature.ch/tech/?p=55

首先,它是一個錯誤,我無法通過:這個變量沒有轉換,我不知道,如何讓它工作。

dm = (DownloadManager) getSystemService(DOWNLOAD_SERVICE); 

現在一兩件事:當我試圖把結果片段FragmentPagerAdapter - 我堅持在這裏找到正確的代碼:

@Override 
public Fragment getItem(int arg0) { 
    // TODO Auto-generated method stub 
    return ?????????; 
} 

告訴我,拜託,這是什麼方法必須返回? 謝謝!

回答

2

你說

我有一個TabHost有三個選項卡,和不同的ListView在每個標籤

我認爲u有三個不同的listActivity其傳遞給tabHost。因此將三個活動轉換爲三個片段。

基礎上folllowing示例代碼更改ViewPagerAdapter

class GoogleMusicAdapter extends FragmentPagerAdapter implements 
     TitleProvider { 
    public GoogleMusicAdapter(FragmentManager fm) { 
     super(fm); 
    } 

    @Override 
    public Fragment getItem(int position) { 
        if(position ==0) 
     // return your Fragment1 
        else if(position==1) 
        // return your Fragment2 
        else 
        // return fragment3 
    } 

    @Override 
    public int getCount() { 
     return 3; 
    } 

    @Override 
    public String getTitle(int position) { 
     if(position ==0) 
        return "One" 
        else if(position ==1) 
        return "two" 
        else 
        return "three" 
    } 
} 
+0

嗨,阿巴斯! Thanx快速回答!抓住它!所以,現在我很高興地看到,如何將這個ListFragments包含到ViewPageAdapter的代碼中。 (因爲我在Google上找不到任何有關它的信息...)對不起,如果我好像是笨蛋。 – formatBCE 2012-03-09 12:13:56

+0

阿巴斯,非常感謝你!我得到了它的工作 - 通過把這個代碼:'返回新的Myfragment;' – formatBCE 2012-03-13 08:52:41