2016-07-18 47 views
0

我是Android新手,我想用本書的數據創建一個列表。我的列表需要一張圖片。我必須在我的ListView中放入一些來自url的圖像。我從我的數據庫中檢索String urlImages。ListView中的ImageView與ArrayList <String>

這是我customAdapter

public class customAdapter extends ArrayAdapter<String>{ 

    Context mContext; 
    ArrayList<String> user_name; 
    ArrayList<String> book_title; 
    ArrayList<String> book_author; 
    ArrayList<String> book_price; 
    ArrayList<String> book_cover; 


    public customAdapter(Context context, ArrayList<String> user_name, ArrayList<String> book_title, 
         ArrayList<String> book_author, ArrayList<String> book_price, ArrayList<String> book_cover) { 
     super(context, R.layout.row_list_books, book_title); 
     // TODO Auto-generated constructor stub 

     this.mContext = context; 
     this.user_name = user_name; 
     this.book_title = book_title; 
     this.book_author = book_author; 
     this.book_price = book_price; 
     this.book_cover = book_cover; 
    } 

    public View getView(int position, View view, ViewGroup parent) { 
     LayoutInflater inflater = LayoutInflater.from(mContext); 
     View rowView = inflater.inflate(R.layout.row_list_books, null, true); 

     TextView user = (TextView) rowView.findViewById(R.id.user_name_search); 
     TextView title = (TextView) rowView.findViewById(R.id.bookTitle); 
     TextView author = (TextView) rowView.findViewById(R.id.bookAuthor); 
     TextView price = (TextView) rowView.findViewById(R.id.priceBook); 
     ImageView bookImage = (ImageView) rowView.findViewById(R.id.coverBookSearch); 

     user.setText(user_name.get(position)); 
     title.setText(book_title.get(position)); 
     author.setText(book_author.get(position)); 
     price.setText(book_price.get(position)); 

     //// I don't know how I can do //// 
     bookImage.setImageBitmap(book_cover.get(position)); 
     /////////////////////////////// 

     return rowView; 

    } 


} 

這是我ListBooks活動

Context mContext; 
static final String KEY = "KEY", TAG_LOGIN = "TAG_LOGIN"; 
String key, getTagLogin; 

String user_name; 
DatabaseReference user; 
DatabaseReference userBook = FirebaseDatabase.getInstance().getReference("Books").child("User's books"); 
ListView mListView; 
ArrayList<String> mArrayUserName = new ArrayList<>(); 
ArrayList<String> mArrayTitle = new ArrayList<>(); 
ArrayList<String> mArrayAuthor = new ArrayList<>(); 
ArrayList<String> mArrayPrice = new ArrayList<>(); 
ArrayList<String> mArrayImage = new ArrayList<>(); 
customAdapter customAdapter; 

@RequiresApi(api = Build.VERSION_CODES.KITKAT) 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_list_books); 
    mContext = this; 

    Intent intent = getIntent(); 
    key = intent.getStringExtra(KEY); 
    getTagLogin = intent.getStringExtra(TAG_LOGIN); 



    mListView = (ListView) findViewById(R.id.listView); 

    customAdapter = new customAdapter(mContext, mArrayTitle, mArrayAuthor, mArrayUserName, mArrayPrice, mArrayImage); 
    mListView.setAdapter(customAdapter); 

    userBook.addChildEventListener(new ChildEventListener() { 
     @Override 
     public void onChildAdded(DataSnapshot dataSnapshot, String s) { 
       UserBook userBook = dataSnapshot.getValue(UserBook.class); 
       user_name = userBook.user_name; 
       String book_title = userBook.book_title; 
       String book_author = userBook.book_author; 
       String book_price = userBook.book_price; 
       String book_cover = userBook.book_urlImage; 


       mArrayUserName.add(user_name); 
       mArrayTitle.add(book_title); 
       mArrayAuthor.add(book_author); 
       mArrayPrice.add(book_price); 
       mArrayImage.add(book_cover); 
       customAdapter.notifyDataSetChanged(); 

     } 
     @Override 
     public void onChildChanged(DataSnapshot dataSnapshot, String s) { 

     } 

     @Override 
     public void onChildRemoved(DataSnapshot dataSnapshot) { 

     } 

     @Override 
     public void onChildMoved(DataSnapshot dataSnapshot, String s) { 

     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 
} 

} 

預先感謝您的幫助。

+0

檢查此鏈接,如何從URL加載圖像http://stackoverflow.com/questions/2471935/how-to-load-an-imageview-by-url-in-android –

+0

什麼是問題?是「如何在ImagheView?中顯示來自URL的圖片 –

回答

2

你可以嘗試使用RecyclerView和畢加索,以避免內存問題:

的RecyclerView widget是 ListView中的更先進,更靈活的版本。這個小部件是一個容器,用於顯示大數據集 ,通過維護有限數量的視圖可以非常有效地滾動。如果數據收集 的元素在運行時基於用戶操作或網絡 事件更改,請使用RecyclerViewwidget。

佈局管理器在RecyclerView中定位項目視圖,並決定何時重用 用戶不再可見的項目視圖。要重用(或回收)視圖,佈局管理器可能會要求 適配器用數據集中不同的元素 替換視圖的內容。以這種方式回收的觀點提高性能 通過避免不必要的視圖的創建或執行 expensivefindViewById()查找


實施例:
添加此視圖佈局:

<android.support.v7.widget.RecyclerView 
    android:id="@+id/my_recycler_view" 
    android:scrollbars="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"/> 

一旦您已爲您的佈局添加了RecyclerView小部件,獲取該對象的句柄,將其連接到佈局管理器,並附加適配器以顯示數據:

public class MyActivity extends Activity { 
    private RecyclerView mRecyclerView; 
    private RecyclerView.Adapter mAdapter; 
    private RecyclerView.LayoutManager mLayoutManager; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.my_activity); 
        mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view); 
        // use this setting to improve performance if you know that changes 
        // in content do not change the layout size of the RecyclerView 
        mRecyclerView.setHasFixedSize(true); 
        // use a linear layout manager 
        mLayoutManager = new LinearLayoutManager(this); 
        mRecyclerView.setLayoutManager(mLayoutManager); 
        // specify an adapter (see also next example) 
     // Set your myDataSet with the url of your images. 
        mAdapter = new MyAdapter(myDataset); 
        mRecyclerView.setAdapter(mAdapter); 
    } 
    ... 
} 

創建一個適配器來管理回收觀點:

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> { 
    private String[] mDataset; 

    // Provide a reference to the views for each data item 
    // Complex data items may need more than one view per item, and 
    // you provide access to all the views for a data item in a view holder 
    public static class ViewHolder extends RecyclerView.ViewHolder { 
     // each data item is just a string in this case 
     public ViewHolder(ImageView v) { 
      super(v); 
      pictureView = v; 
     } 
    } 

    // Provide a suitable constructor (depends on the kind of dataset) 
    public MyAdapter(String[] myDataset) { 
     mDataset = myDataset; 
    } 

    // Create new views (invoked by the layout manager) 
    @Override 
    public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, 
                int viewType) { 
     // create a new view 
     View v = LayoutInflater.from(parent.getContext()) 
           .inflate(R.layout.my_image_view, parent, false); 
     // set the view's size, margins, paddings and layout parameters 
     ... 
     ViewHolder vh = new ViewHolder(v); 
     return vh; 
    } 

    // Replace the contents of a view (invoked by the layout manager) 
    @Override 
    public void onBindViewHolder(ViewHolder holder, int position) { 
     BitmapFactory.Options options = new BitmapFactory.Options(); 
     //Resize your image 
     options.inSampleSize = 4; 
     BitmapFactory.decodeFile(objects[position].getAbsolutePath(), options); 
     // - get element from your dataset at this position 
     // - replace the contents of the view with that element 
     Bitmap bmp = getBitmap(position); 
     if (bmp != null) { 
      pictureView.setImageBitmap(bmp); 
     } 

    } 

    // Return the size of your dataset (invoked by the layout manager) 
    @Override 
    public int getItemCount() { 
     return mDataset.length; 
    } 
} 


信息來源:

http://developer.android.com/training/material/lists-cards.html
您也可以使用它幫助您管理大位圖的外部庫,用於示例畢加索:
在構建中添加依賴關係。gradle這個:

dependencies { 
.... 
    compile 'com.squareup.picasso:picasso:2.3.2' 
.... 
} 

變化onBindViewHolder在Adapter.ViewHolder:

@Override 
    public void onBindViewHolder(ViewHolder holder, int position) { 

      String mURLPhoto = mDataset[position]; 
      Uri uri = Uri.fromFile(new File(mURLPhoto)); 

     if(!mURLPhoto.equals("")) { 
      Picasso.with(parent.getContext()) 
       .load(uri).placeholder(R.mipmap.ic_logo) 
       .resize(Constants.WIDTH_PHOTO_MINI, Constants.WIDTH_PHOTO_MINI).centerCrop() 
       .into(pictureView); 
     } 
    } 

信息來源: http://square.github.io/picasso/

希望幫助!

2

檢查Picasso。它會爲你處理圖片下載和緩存。

相關問題