2012-09-15 20 views
0

我在那裏我的編碼,其目的是作爲一個「無限滾動」,動態地添加更多的意見,以自身的尺寸減小成長爲用戶滾動(就像向下滾動你的Facebook時間軸)滾動型的情況。添加的每個視圖是一個包含了幾個TextViews,ImageViews的複雜組件等內存管理進行了大量的意見滾動視圖?

它應該是毫不奇怪,記憶已迅速成爲一個問題,尤其是當我們到達50+元素的範圍。不久之後,我發現了嚴重的OutOfMemoryErrors。

在iOS上,我會簡單地使用UITableView,它通過刪除不在屏幕上的視圖並重用它們的容器來解決問題(例如,即使在表中有超過100個視圖,您實際上只有一個很少有人被繪製)。

有一些類似的技術或其他好的解決方案來完成這項在Android?

+0

使用一個'ListView'。 – Luksprog

回答

0

當列表有大量的數據,那麼我們的應用程序就會因應用程序內存不足而崩潰(因爲處理不當的行視圖)。 有解決和管理列表存儲雙向高效

使用converView

convertView - 老視圖如果可能的話再利用。注意:你應該在使用之前檢查這個視圖是非空的並且是合適的類型。如果無法將此視圖轉換爲顯示正確的數據,則此方法可以創建新視圖。

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
View view; 
if(convertView == null) { 
    view = this.inflator.inflate(android.R.layout.simple_list_item_1, parent, false); 
} 
else { 
    view = convertView; 
} 
// remaining implementation 
return view; 
} 

Read for more

使用RecyclerView

用於提供有限的窗口成一個大的數據集的柔性視圖。

添加RecyclerView到佈局

//A RecyclerView with some commonly used attributes 
<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) 
    mAdapter = new MyAdapter(myDataset); 
    mRecyclerView.setAdapter(mAdapter); 
} 
//... other code 
} 

適配器提供訪問您的數據集中的項目,創建視圖的項目,並在原來的產品沒有羅取代了一些新的數據項目視圖的內容可見的。下面的代碼示例示出了用於一個由字符串數組的數據集的簡單的實現使用的TextView窗口小部件顯示的:

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 TextView mTextView; 
    public ViewHolder(TextView v) { 
     super(v); 
     mTextView = 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 
    TextView v = (TextView) LayoutInflater.from(parent.getContext()) 
      .inflate(R.layout.my_text_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) { 
    // - get element from your dataset at this position 
    // - replace the contents of the view with that element 
    holder.mTextView.setText(mDataset[position]); 

} 

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

Read for more

Hope this will help one and all.

相關問題