2014-06-14 264 views
0

我有一個從SQLite數據庫接收陣列的基礎轉接器:將圖像添加到自定義baseadapter

 mHelper = new MyDbHelperContacts(this); 
    mDb = mHelper.getWritableDatabase(); 
     Cursor c = null; 
     ArrayList<String> names=new ArrayList<String>() ; 
     c = mDb.rawQuery("SELECT realname FROM contacts",null); 
     c.moveToFirst(); 

     if(c.getCount()>0){ 
       do{ 
        names.add(c.getString(0)); 
       }while(c.moveToNext()); 
      }  

並將其填充到一個異步:

@Override 
    protected Void doInBackground(ArrayList<String>... params) { 
     mListItems.clear(); 
     mListSectionPos.clear(); 
     ArrayList<String> items = params[0]; 
     if (mItems.size() > 0) { 

      // NOT forget to sort array 
      Collections.sort(items); 

      int i = 0; 
      String prev_section = ""; 
      while (i < items.size()) { 
       String current_item = items.get(i).toString(); 
       String current_section = 
         current_item.substring(0, 1).toUpperCase(Locale.getDefault()); 

       if (!prev_section.equals(current_section)) { 
        mListItems.add(current_section); 
        mListItems.add(current_item); 
        // array list of section positions 

mListSectionPos.add(mListItems.indexOf(current_section)); 
        prev_section = current_section; 
       } else { 
        mListItems.add(current_item); 
       } 
       i++; 
      } 
     } 

但我不知道我該怎麼爲每個條目添加圖像,請注意,圖像位於文件夾中,並且圖像的名稱屬於每個條目,例如,對於條目admin,圖像位於/storage/sdcard/pictures/admin_image1.jpg中。 所以我沒有任何問題綁定圖像到特定條目時,我有入口的名稱。

我需要的東西是我怎樣才能添加圖片到這個adapater,我在這裏發佈的主要活動和適配器代碼,對不起他們的時間過長的存在:

Cursor mCursor; 
    MyDbHelperContacts mHelper; 
    SQLiteDatabase mDb; 
// unsorted list items 
ArrayList<String> mItems; 

// array list to store section positions 
ArrayList<Integer> mListSectionPos; 

// array list to store listView data 
ArrayList<String> mListItems; 

// custom list view with pinned header 
PinnedHeaderListView mListView; 

// custom adapter 
PinnedHeaderAdapter mAdaptor; 

// search box 
EditText mSearchView; 

// loading view 
ProgressBar mLoadingView; 

// empty view 
TextView mEmptyView; 

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



    mHelper = new MyDbHelperContacts(this); 
    mDb = mHelper.getWritableDatabase(); 
     Cursor c = null; 
     ArrayList<String> names=new ArrayList<String>() ; 
     c = mDb.rawQuery("SELECT realname FROM contacts",null); 
     c.moveToFirst(); 

     if(c.getCount()>0){ 
       do{ 
        names.add(c.getString(0)); 
       }while(c.moveToNext()); 
      }  






    System.out.println(names); 



    // UI elements 
    setupViews(); 

    // Array to ArrayList 
    mItems = names; 
    mListSectionPos = new ArrayList<Integer>(); 
    mListItems = new ArrayList<String>(); 

    // for handling configuration change 
    if (savedInstanceState != null) { 
     mListItems = savedInstanceState.getStringArrayList("mListItems"); 
     mListSectionPos = 
savedInstanceState.getIntegerArrayList("mListSectionPos"); 

     if (mListItems != null && mListItems.size() > 0 
       && mListSectionPos != null && 
mListSectionPos.size() > 0) { 
      setListAdaptor(); 
     } 

     String constraint = savedInstanceState.getString("constraint"); 
     if (constraint != null && constraint.length() > 0) { 
      mSearchView.setText(constraint); 
      setIndexBarViewVisibility(constraint); 
     } 
    } else { 
     new Poplulate().execute(mItems); 
    } 
} 

private void setupViews() { 
    setContentView(R.layout.main_act); 
    mSearchView = (EditText) findViewById(R.id.search_view); 
    mLoadingView = (ProgressBar) findViewById(R.id.loading_view); 
    mListView = (PinnedHeaderListView) findViewById(R.id.list_view); 
    mEmptyView = (TextView) findViewById(R.id.empty_view); 
} 


@Override 
protected void onPostCreate(Bundle savedInstanceState) { 
    mSearchView.addTextChangedListener(filterTextWatcher); 
    super.onPostCreate(savedInstanceState); 
} 

private void setListAdaptor() { 
    // create instance of PinnedHeaderAdapter and set adapter to list view 
    mAdaptor = new PinnedHeaderAdapter(this, mListItems, mListSectionPos); 
    mListView.setAdapter(mAdaptor); 

    LayoutInflater inflater = (LayoutInflater) 
getSystemService(LAYOUT_INFLATER_SERVICE); 

    // set header view 
    View pinnedHeaderView = 
inflater.inflate(R.layout.section_row_view,mListView, false); 
    mListView.setPinnedHeaderView(pinnedHeaderView); 

    // set index bar view 
    IndexBarView indexBarView = (IndexBarView) 
inflater.inflate(R.layout.index_bar_view, mListView, false); 
    indexBarView.setData(mListView, mListItems, mListSectionPos); 
    mListView.setIndexBarView(indexBarView); 

    // set preview text view 
    View previewTextView = inflater.inflate(R.layout.preview_view,mListView, 
false); 
    mListView.setPreviewView(previewTextView); 

    // for configure pinned header view on scroll change 
    mListView.setOnScrollListener(mAdaptor); 
} 

private TextWatcher filterTextWatcher = new TextWatcher() { 
    public void afterTextChanged(Editable s) { 
     String str = s.toString(); 
     if (mAdaptor != null && str != null) 
      mAdaptor.getFilter().filter(str); 
    } 

    public void beforeTextChanged(CharSequence s, int start, int count, 
      int after) { 
    } 

    public void onTextChanged(CharSequence s, int start, int before, 
      int count) { 

    } 
}; 

public class ListFilter extends Filter { 
    @Override 
    protected FilterResults performFiltering(CharSequence constraint) { 
     // NOTE: this function is *always* called from a background thread, 
     // and 
     // not the UI thread. 
     String constraintStr = 
constraint.toString().toLowerCase(Locale.getDefault()); 
     FilterResults result = new FilterResults(); 

     if (constraint != null && constraint.toString().length() > 0) { 
      ArrayList<String> filterItems = new ArrayList<String>(); 

      synchronized (this) { 
       for (int i = 0; i < mItems.size(); i++) { 
        String item = mItems.get(i); 
        if 
(item.toLowerCase(Locale.getDefault()).startsWith(constraintStr)) { 
         filterItems.add(item); 
        } 
       } 
       result.count = filterItems.size(); 
       result.values = filterItems; 
      } 
     } else { 
      synchronized (this) { 
       result.count = mItems.size(); 
       result.values = mItems; 
      } 
     } 
     return result; 
    } 

    @SuppressWarnings("unchecked") 
    @Override 
    protected void publishResults(CharSequence constraint,FilterResults 
results) { 
     ArrayList<String> filtered = (ArrayList<String>) results.values; 
     setIndexBarViewVisibility(constraint.toString()); 
     // sort array and extract sections in background Thread 
     new Poplulate().execute(filtered); 
    } 

} 

private void setIndexBarViewVisibility(String constraint) { 
    // hide index bar for search results 
    if (constraint != null && constraint.length() > 0) { 
     mListView.setIndexBarVisibility(false); 
    } else { 
     mListView.setIndexBarVisibility(true); 
    } 
} 

// sort array and extract sections in background Thread here we use 
// AsyncTask 
private class Poplulate extends AsyncTask<ArrayList<String>, Void, Void> { 

    private void showLoading(View contentView, View loadingView, 
      View emptyView) { 
     contentView.setVisibility(View.GONE); 
     loadingView.setVisibility(View.VISIBLE); 
     emptyView.setVisibility(View.GONE); 
    } 

    private void showContent(View contentView, View loadingView, 
      View emptyView) { 
     contentView.setVisibility(View.VISIBLE); 
     loadingView.setVisibility(View.GONE); 
     emptyView.setVisibility(View.GONE); 
    } 

    private void showEmptyText(View contentView, View loadingView, 
      View emptyView) { 
     contentView.setVisibility(View.GONE); 
     loadingView.setVisibility(View.GONE); 
     emptyView.setVisibility(View.VISIBLE); 
    } 

    @Override 
    protected void onPreExecute() { 
     // show loading indicator 
     showLoading(mListView, mLoadingView, mEmptyView); 
     super.onPreExecute(); 
    } 

    @Override 
    protected Void doInBackground(ArrayList<String>... params) { 
     mListItems.clear(); 
     mListSectionPos.clear(); 
     ArrayList<String> items = params[0]; 
     if (mItems.size() > 0) { 

      // NOT forget to sort array 
      Collections.sort(items); 

      int i = 0; 
      String prev_section = ""; 
      while (i < items.size()) { 
       String current_item = items.get(i).toString(); 
       String current_section = current_item.substring(0, 
1).toUpperCase(Locale.getDefault()); 

       if (!prev_section.equals(current_section)) { 
        mListItems.add(current_section); 
        mListItems.add(current_item); 
        // array list of section positions 

mListSectionPos.add(mListItems.indexOf(current_section)); 
        prev_section = current_section; 
       } else { 
        mListItems.add(current_item); 
       } 
       i++; 
      } 
     } 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Void result) { 
     if (!isCancelled()) { 
      if (mListItems.size() <= 0) { 
       showEmptyText(mListView, mLoadingView, mEmptyView); 
      } else { 
       setListAdaptor(); 
       showContent(mListView, mLoadingView, mEmptyView); 
      } 
     } 
     super.onPostExecute(result); 
    } 
} 

@Override 
protected void onSaveInstanceState(Bundle outState) { 
    if (mListItems != null && mListItems.size() > 0) { 
     outState.putStringArrayList("mListItems", mListItems); 
    } 
    if (mListSectionPos != null && mListSectionPos.size() > 0) { 
     outState.putIntegerArrayList("mListSectionPos", mListSectionPos); 
    } 
    String searchText = mSearchView.getText().toString(); 
    if (searchText != null && searchText.length() > 0) { 
     outState.putString("constraint", searchText); 
    } 
    super.onSaveInstanceState(outState); 
} 
} 

,這是適配器:

// Customized adaptor to populate data in PinnedHeaderListView 
public class PinnedHeaderAdapter extends BaseAdapter implements OnScrollListener, 
IPinnedHeader, Filterable { 

private static final int TYPE_ITEM = 0; 
private static final int TYPE_SECTION = 1; 
private static final int TYPE_MAX_COUNT = TYPE_SECTION + 1; 

LayoutInflater mLayoutInflater; 
int mCurrentSectionPosition = 0, mNextSectionPostion = 0; 

// array list to store section positions 
ArrayList<Integer> mListSectionPos; 

// array list to store list view data 
ArrayList<String> mListItems; 

// context object 
Context mContext; 

public PinnedHeaderAdapter(Context context, ArrayList<String> 
listItems,ArrayList<Integer> listSectionPos) { 
    this.mContext = context; 
    this.mListItems = listItems; 
    this.mListSectionPos = listSectionPos; 

    mLayoutInflater = (LayoutInflater) 
mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
} 

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

@Override 
public boolean areAllItemsEnabled() { 
    return false; 
} 

@Override 
public boolean isEnabled(int position) { 
    return !mListSectionPos.contains(position); 
} 

@Override 
public int getViewTypeCount() { 
    return TYPE_MAX_COUNT; 
} 

@Override 
public int getItemViewType(int position) { 
    return mListSectionPos.contains(position) ? TYPE_SECTION : TYPE_ITEM; 
} 

@Override 
public Object getItem(int position) { 
    return mListItems.get(position); 
} 

@Override 
public long getItemId(int position) { 
    return mListItems.get(position).hashCode(); 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    ViewHolder holder = null; 

    if (convertView == null) { 
     holder = new ViewHolder(); 
     int type = getItemViewType(position); 

     switch (type) { 
     case TYPE_ITEM: 
      convertView = mLayoutInflater.inflate(R.layout.row_view, 
null); 
      break; 
     case TYPE_SECTION: 
      convertView = 
mLayoutInflater.inflate(R.layout.section_row_view, null); 
      break; 
     } 
     holder.textView = (TextView) 
convertView.findViewById(R.id.row_title); 
     convertView.setTag(holder); 
    } else { 
     holder = (ViewHolder) convertView.getTag(); 
    } 

    holder.textView.setText(mListItems.get(position).toString()); 
    return convertView; 
} 

@Override 
public int getPinnedHeaderState(int position) { 
    // hide pinned header when items count is zero OR position is less than 
    // zero OR 
    // there is already a header in list view 
    if (getCount() == 0 || position < 0 || mListSectionPos.indexOf(position) 
    != -1) { 
     return PINNED_HEADER_GONE; 
    } 

    // the header should get pushed up if the top item shown 
    // is the last item in a section for a particular letter. 
    mCurrentSectionPosition = getCurrentSectionPosition(position); 
    mNextSectionPostion = getNextSectionPosition(mCurrentSectionPosition); 
    if (mNextSectionPostion != -1 && position == mNextSectionPostion - 1) { 
     return PINNED_HEADER_PUSHED_UP; 
    } 

    return PINNED_HEADER_VISIBLE; 
} 

public int getCurrentSectionPosition(int position) { 
    String listChar = mListItems.get(position).toString().substring(0, 
    1).toUpperCase(Locale.getDefault()); 
    return mListItems.indexOf(listChar); 
} 

public int getNextSectionPosition(int currentSectionPosition) { 
    int index = mListSectionPos.indexOf(currentSectionPosition); 
    if ((index + 1) < mListSectionPos.size()) { 
     return mListSectionPos.get(index + 1); 
    } 
    return mListSectionPos.get(index); 
} 

@Override 
public void configurePinnedHeader(View v, int position) { 
    // set text in pinned header 
    TextView header = (TextView) v; 
    mCurrentSectionPosition = getCurrentSectionPosition(position); 
    header.setText(mListItems.get(mCurrentSectionPosition)); 
} 

@Override 
public void onScroll(AbsListView view, int firstVisibleItem,int visibleItemCount, 
int totalItemCount) { 
    if (view instanceof PinnedHeaderListView) { 
     ((PinnedHeaderListView) 
view).configureHeaderView(firstVisibleItem); 
    } 
} 

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

@Override 
public Filter getFilter() { 
    return ((MainActivity) mContext).new ListFilter(); 
} 

public static class ViewHolder { 
    public TextView textView; 
} 
} 

和XML:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:orientation="vertical"> 

<EditText 
    android:id="@+id/search_view" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:layout_margin="5dp" 
    android:drawableLeft="@drawable/ic_search" 
    android:hint="@string/search_hint" 
    android:singleLine="true" /> 

<FrameLayout 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" > 

    <include 
     layout="@layout/loading_empty_view" 
     /> 

    <com.example.listviewfilter.ui.PinnedHeaderListView 
     android:id="@+id/list_view" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:scrollingCache="false" /> 
</FrameLayout> 

</LinearLayout> 

任何提示將是真正appreciatd

回答

0

看看的AsyncImageLoader,這不正是你想要的東西,但使用Executor Framework在併發工作線程數的圖像解碼 - >laggy Listview with ImageView and Executor Framework

的基本思想是發送Runnable,其中包含SDCard image PathImageView,以工作線程來解碼圖像。因爲我們無法從工作線程更新UI,因此我們創建了另一個包含BitmapImageView引用的Runnable,並將其發佈到UI線程的消息隊列中以更新UI。

相關問題