2015-07-10 86 views
1

我正在使用eclipse。 基本上我想實現的是,我有一個GridView,它是從JSON數據庫動態使用JSON獲取圖像。 現在,我想將它們顯示爲coverflow視圖,而不是gridview。如何從現有gridview圖像實現覆蓋流佈局

我已經通過互聯網搜索,但無法找到任何圖書館或動態圖像的例子,我只發現靜態圖像存儲在應用程序本身,而不是外部數據庫。

我的代碼如下: -

MainActivity.java:-

public class MainActivity extends Activity implements OnClickListener { 
// Log tag 
private static final String TAG = MainActivity.class.getSimpleName(); 

// Movies json url 
private static final String url = "http://eventassociate.com/wedding/photomania"; 
private ProgressDialog pDialog; 
private List<Movie> movieList = new ArrayList<Movie>(); 
private PullToRefreshGridView mPullRefreshGridView; 
private GridView gridView; 
private CustomListAdapter adapter; 
ImageButton blackcapture; 
private static int RESULT_LOAD_IMAGE = 1; 
String picturePath; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 


    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
     WindowManager.LayoutParams.FLAG_FULLSCREEN); 

    setContentView(R.layout.gallary_activity_main); 

    overridePendingTransition(R.anim.push_down_in, R.anim.push_down_out); 




    mPullRefreshGridView = (PullToRefreshGridView) findViewById(R.id.list); 
    gridView = mPullRefreshGridView.getRefreshableView(); 


    mPullRefreshGridView.setOnRefreshListener(new OnRefreshListener2<GridView>() { 

     @Override 
     public void onPullDownToRefresh(PullToRefreshBase<GridView> refreshView) { 


      adapter.notifyDataSetChanged(); 
      gridView.setAdapter(adapter); 
      gridView.invalidateViews(); 

      mPullRefreshGridView.onRefreshComplete(); 

     } 










    adapter = new CustomListAdapter(this, movieList); 
    gridView.setAdapter(adapter); 




    gridView.setOnItemClickListener(new OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View v, 
       int position, long id) { 

      Movie m5 = movieList.get(position); 

      Intent i = new Intent(getApplicationContext(), 
        FullImageActivity.class); 

      i.putExtra("movieobject", m5); 
      startActivity(i); 


     } 
    }); 

適配器類別: -

public class CustomListAdapter extends BaseAdapter { 
private Activity activity; 


private LayoutInflater inflater; 
List<Movie> movieItems; 
ImageLoader imageLoader = AppController.getInstance().getImageLoader(); 

public CustomListAdapter(Activity activity, List<Movie> movieItems) { 
    this.activity = activity; 
    this.movieItems = movieItems; 
} 







@Override 
public int getCount() { 
    return movieItems.size(); 
} 

@Override 
public Object getItem(int location) { 
    return movieItems.get(location); 
} 

@Override 
public long getItemId(int position) { 
    return position; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 




    if (inflater == null) 
     inflater = (LayoutInflater) activity 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    if (convertView == null) 
     convertView = inflater.inflate(R.layout.gallary_list_row, null); 

    if (imageLoader == null) 
     imageLoader = AppController.getInstance().getImageLoader(); 
    NetworkImageView thumbNail = (NetworkImageView) convertView 
      .findViewById(R.id.thumbnail); 








    // ............................................... 

    TextView title = (TextView) convertView.findViewById(R.id.title); 

    // getting movie data for the row 
    Movie m = movieItems.get(position); 

    // thumbnail image 
    thumbNail.setImageUrl(m.getThumbnailUrl(), imageLoader); 

    // title 
    title.setText(m.getTitle()); 







    return convertView; 

} 

Movie.java:-

public class Movie implements Parcelable{ 
private String title,thumbnailUrl; 



public Movie() { 
    // TODO Auto-generated constructor stub 
} 

public Movie(String name, String thumbnailUrl 
     ) { 
    this.title = name; 
    this.thumbnailUrl = thumbnailUrl; 

} 



public String getTitle() { 
    return title; 
} 

public void setTitle(String name) { 
    this.title = name; 
} 

public String getThumbnailUrl() { 
    return thumbnailUrl; 
} 

public void setThumbnailUrl(String thumbnailUrl) { 
    this.thumbnailUrl = "http://eventassociate.com/wedding/"+thumbnailUrl; 
} 

// Parcelling part 
public Movie(Parcel in){ 
    String[] data = new String[2]; 

    in.readStringArray(data); 
    this.title = data[0]; 
    this.thumbnailUrl = data[1]; 

} 








@Override 
public int describeContents() { 
    // TODO Auto-generated method stub 
    return 0; 
} 

@Override 
public void writeToParcel(Parcel dest, int flags) { 
    dest.writeStringArray(new String[] {this.title, 
             this.thumbnailUrl, 
             }); 
} 


public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { 
    public Movie createFromParcel(Parcel in) { 
     return new Movie(in); 
    } 

    public Movie[] newArray(int size) { 
     return new Movie[size]; 
    } 
}; 

}

我成功實現了這個GridView,但我在實現這個作爲覆蓋流設計或類似的東西時遇到了麻煩。 我在網上搜索和我發現這個代碼,但僅限於靜態圖像: -

public class SimpleExample extends Activity { 

// ============================================================================= 
// Child views 
// ============================================================================= 

private FancyCoverFlow fancyCoverFlow; 

// ============================================================================= 
// Supertype overrides 
// ============================================================================= 

/** 
* Called when the activity is first created. 
*/ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    this.fancyCoverFlow = (FancyCoverFlow) this.findViewById(R.id.fancyCoverFlow); 

    this.fancyCoverFlow.setAdapter(new FancyCoverFlowSampleAdapter()); 
    this.fancyCoverFlow.setUnselectedAlpha(1.0f); 
    this.fancyCoverFlow.setUnselectedSaturation(0.0f); 
    this.fancyCoverFlow.setUnselectedScale(0.5f); 
    this.fancyCoverFlow.setSpacing(50); 
    this.fancyCoverFlow.setMaxRotation(0); 
    this.fancyCoverFlow.setScaleDownGravity(0.2f); 
    this.fancyCoverFlow.setActionDistance(FancyCoverFlow.ACTION_DISTANCE_AUTO); 

} 

// ============================================================================= 
// Private classes 
// ============================================================================= 

}

Adapter.java:-

public class FancyCoverFlowSampleAdapter extends FancyCoverFlowAdapter { 

// ============================================================================= 
// Private members 
// ============================================================================= 

private int[] images = {R.drawable.image1, R.drawable.image2, R.drawable.image3, R.drawable.image4, R.drawable.image5, R.drawable.image6,}; 

// ============================================================================= 
// Supertype overrides 
// ============================================================================= 

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

@Override 
public Integer getItem(int i) { 
    return images[i]; 
} 

@Override 
public long getItemId(int i) { 
    return i; 
} 

@Override 
public View getCoverFlowItem(int i, View reuseableView, ViewGroup viewGroup) { 
    ImageView imageView = null; 

    if (reuseableView != null) { 
     imageView = (ImageView) reuseableView; 
    } else { 
     imageView = new ImageView(viewGroup.getContext()); 
     imageView.setScaleType(ImageView.ScaleType.CENTER_INSIDE); 
     imageView.setLayoutParams(new FancyCoverFlow.LayoutParams(300, 400)); 

    } 

    imageView.setImageResource(this.getItem(i)); 
    return imageView; 
} 

}

可有人幫助我解決我的問題。 謝謝。

我的最終代碼的CoverFlow: -

MainActivity: -

public class MainActivity extends Activity implements OnClickListener { 
// Log tag 
private static final String TAG = album.MainActivity.class.getSimpleName(); 

// Movies json url 
private static final String url = "http://eventassociate.com/wedding/androidadminimages"; 
private ProgressDialog pDialog; 
private List<Moviealbum> movieList = new ArrayList<Moviealbum>(); 

private FancyCoverFlow fancyCoverFlow; 


private CustomListAdapter adapter; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 



    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
     WindowManager.LayoutParams.FLAG_FULLSCREEN); 



    setContentView(R.layout.album_activity_main); 

    overridePendingTransition(R.anim.push_down_in, R.anim.push_down_out); 

    this.fancyCoverFlow = (FancyCoverFlow) this.findViewById(R.id.list); 

    adapter = new CustomListAdapter(this, movieList); 

    this.fancyCoverFlow.setAdapter(new CustomListAdapter(this, movieList)); 
    this.fancyCoverFlow.setUnselectedAlpha(1.0f); 
    this.fancyCoverFlow.setUnselectedSaturation(0.0f); 
    this.fancyCoverFlow.setUnselectedScale(0.5f); 
    this.fancyCoverFlow.setSpacing(50); 
    this.fancyCoverFlow.setMaxRotation(0); 
    this.fancyCoverFlow.setScaleDownGravity(0.2f); 
    this.fancyCoverFlow.setActionDistance(FancyCoverFlow.ACTION_DISTANCE_AUTO); 














    fancyCoverFlow.setOnItemClickListener(new OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View v, 
       int position, long id) { 

      Moviealbum m5 = movieList.get(position); 

      Intent i = new Intent(getApplicationContext(),album. 
        FullImageActivity.class); 

      i.putExtra("movieobject", m5); 
      startActivity(i); 


     } 
    }); 











    pDialog = new ProgressDialog(this); 
    // Showing progress dialog before making http request 
    pDialog.setMessage("Loading..."); 
    pDialog.show(); 

    // changing action bar color 
    getActionBar().setBackgroundDrawable(
      new ColorDrawable(Color.parseColor("#1b1b1b"))); 

    // Creating volley request obj 
    JsonArrayRequest movieReq = new JsonArrayRequest(url, 
      new Response.Listener<JSONArray>() { 
       @Override 
       public void onResponse(JSONArray response) { 
        Log.d(TAG, response.toString()); 
        hidePDialog(); 

        // Parsing json 
        for (int i = 0; i < response.length(); i++) { 
         try { 

          JSONObject obj = response.getJSONObject(i); 
          Moviealbum movie = new Moviealbum(); 
          movie.setTitle(obj.getString("no")); 
          movie.setThumbnailUrl(obj.getString("alinks")); 

          // adding movie to movies array 
          movieList.add(movie); 

         } catch (JSONException e) { 
          e.printStackTrace(); 
         } 

        } 

        // notifying list adapter about data changes 
        // so that it renders the list view with updated data 
        adapter.notifyDataSetChanged(); 
       } 
      }, new Response.ErrorListener() { 
       @Override 
       public void onErrorResponse(VolleyError error) { 
        VolleyLog.d(TAG, "Error: " + error.getMessage()); 
        hidePDialog(); 

       } 
      }); 

    // Adding request to request queue................................... 
    AppController.getInstance().addToRequestQueue(movieReq); 
} 

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    hidePDialog(); 
} 

private void hidePDialog() { 
    if (pDialog != null) { 
     pDialog.dismiss(); 
     pDialog = null; 
    } 
} 

AdapterClass: -

public class CustomListAdapter extends FancyCoverFlowAdapter { 
private Activity activity; 


private LayoutInflater inflater; 
List<Moviealbum> movieItems; 
ImageLoader imageLoader = AppController.getInstance().getImageLoader(); 

public CustomListAdapter(Activity activity, List<Moviealbum> movieItems) { 
    this.activity = activity; 
    this.movieItems = movieItems; 
} 







@Override 
public int getCount() { 
    return movieItems.size(); 
} 

@Override 
public Object getItem(int location) { 
    return movieItems.get(location); 
} 

@Override 
public long getItemId(int position) { 
    return position; 
} 

@Override 
    public View getCoverFlowItem(int position, View reuseableView, ViewGroup viewGroup) { 




    if (inflater == null) 
     inflater = (LayoutInflater) activity 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    if (reuseableView == null) 
     reuseableView = inflater.inflate(R.layout.gallary_list_row, null); 

    if (imageLoader == null) 
     imageLoader = AppController.getInstance().getImageLoader(); 
    NetworkImageView thumbNail = (NetworkImageView) reuseableView 
      .findViewById(R.id.thumbnail); 











    // ............................................... 

    TextView title = (TextView) reuseableView.findViewById(R.id.title); 

    // getting movie data for the row 
    Moviealbum m = movieItems.get(position); 

    // thumbnail image 
    thumbNail.setImageUrl(m.getThumbnailUrl(), imageLoader); 

    // title 
    title.setText(m.getTitle()); 







    return reuseableView; 

} 

該應用程序運行正常,但加載後黑屏顯示用沒有圖像。

logcat的: -

enter image description here

回答

1

你的問題是不是與CoverFlow的代碼,而是你在哪裏做你的網絡操作。在應用程序加載時,爲您的JSON有效負載開始網絡請求,顯示微調器以顯示應用程序正在加載,並在加載圖像後填充適配器。我假設你有網絡代碼已經給你的GridView實現?讓我知道我是否錯過了一些東西。我希望這有助於!

編輯:

一旦你添加圖片到你的適配器確保你打電話notifyDataSetChanged()要告訴你的適配器重新加載其觀點。

編輯2:

看這句話在這裏: this.fancyCoverFlow.setAdapter(new CustomListAdapter(this, movieList));

你傳遞一個新的CustomListAdapter,而不是通過在適配器變量。嘗試解決這個問題,讓我知道它是否工作。

+0

是的,我已經嘗試過這樣做...但notifyDataSetChanged()行上有一個空指針異常。當我刪除它時,應用程序在加載對話框後顯示一個空白屏幕。如果你想要,我可以在問題中編輯我的代碼? –

+0

你在CoverFlow代碼中的哪個地方叫做notifyDatasetChanged()?你有沒有得到它與靜態圖像工作?我們應該能夠弄清楚發生了什麼事,一旦我們可以使它與靜態的東西一起工作。從那裏我們只需確保我們正確地進行網絡運營。 –

+0

我已經在問題中插入了我的最終代碼,您可以檢查。謝謝。 –