2014-09-24 174 views
0

水平ListView中选定的ListItem我已经做了定制的水平列表视图中,其做工非常精细,但我想做的一两件事,那就是选择任何清单项目时,应留突出直到选择了另一个项目,我已经尝试如下,但它不是working.Please帮助我,我应该做出什么样的变化,使其happen.Thank you.My代码如下: 适配器如何突出android的

public class myhorizontalAdapter extends BaseAdapter { 
    public ArrayList<HashMap<String, String>> photoArray; 
    private Context mContext; 
    private DisplayImageOptions options; 
    public static ImageLoader imageLoader; 
    String photoImg; 
    String query = "http://test.fortalented.com/manage/"; 
    Intent i; 
    String camera, description, captured_date, date_modified, category, 
      date_added, candidate_name, big_img; 
    GifWebView view; 

    @SuppressWarnings({ "deprecation" }) 
    public myhorizontalAdapter(Context paramContext, 
      ArrayList<HashMap<String, String>> photoList) { 
     this.mContext = paramContext; 
     this.photoArray = photoList; 
     imageLoader = ImageLoader.getInstance(); 
     imageLoader.init(ImageLoaderConfiguration.createDefault(paramContext)); 

     options = new DisplayImageOptions.Builder().cacheOnDisc(true) 
       .displayer(new RoundedBitmapDisplayer(10)) 
       .showStubImage(R.drawable.wait) 
       .showImageOnFail(R.drawable.wait).build(); 
    } 

    public int getCount() { 
     return this.photoArray.size(); 
    } 

    public Object getItem(int paramInt) { 
     return Integer.valueOf(paramInt); 
    } 

    public long getItemId(int paramInt) { 
     return paramInt; 
    } 

    public View getView(final int paramInt, View paramView, 
      ViewGroup paramViewGroup) { 
     LayoutInflater localLayoutInflater = (LayoutInflater) this.mContext 
       .getSystemService("layout_inflater"); 
     Viewholder localViewholder = null; 
     if (paramView == null) { 
      paramView = localLayoutInflater.inflate(R.layout.viewitem, 
        paramViewGroup, false); 
      localViewholder = new Viewholder(); 

      localViewholder.iv_photo = ((ImageView) paramView 
        .findViewById(R.id.image)); 
      paramView.setBackgroundResource(R.drawable.bg_edittext_selctor); 
      // New 

      paramView.setTag(localViewholder); 

     } else { 

      localViewholder = (Viewholder) paramView.getTag(); 
     } 

     ImageLoader.getInstance().displayImage(
       query + photoArray.get(paramInt).get("thumbnail"), 
       localViewholder.iv_photo, options); 

     return paramView; 

    } 

    static class Viewholder { 

     ImageView iv_photo; 

    } 

} 

Horizo​​ntalListView

包com.eps.fortalented.uc;

public class HorizontalListView extends AdapterView<ListAdapter> { 

    public boolean mAlwaysOverrideTouch = true; 
    protected ListAdapter mAdapter; 
    private int mLeftViewIndex = -1; 
    private int mRightViewIndex = 0; 
    protected int mCurrentX; 
    protected int mNextX; 
    private int mMaxX = Integer.MAX_VALUE; 
    private int mDisplayOffset = 0; 
    protected Scroller mScroller; 
    private GestureDetector mGesture; 
    private Queue<View> mRemovedViewQueue = new LinkedList<View>(); 
    private OnItemSelectedListener mOnItemSelected; 
    private OnItemClickListener mOnItemClicked; 
    private OnItemLongClickListener mOnItemLongClicked; 
    private boolean mDataChanged = false; 


    public HorizontalListView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     initView(); 
    } 

    private synchronized void initView() { 
     mLeftViewIndex = -1; 
     mRightViewIndex = 0; 
     mDisplayOffset = 0; 
     mCurrentX = 0; 
     mNextX = 0; 
     mMaxX = Integer.MAX_VALUE; 
     mScroller = new Scroller(getContext()); 
     mGesture = new GestureDetector(getContext(), mOnGesture); 
    } 

    @Override 
    public void setOnItemSelectedListener(AdapterView.OnItemSelectedListener listener) { 
     mOnItemSelected = listener; 
    } 

    @Override 
    public void setOnItemClickListener(AdapterView.OnItemClickListener listener){ 
     mOnItemClicked = listener; 
    } 

    @Override 
    public void setOnItemLongClickListener(AdapterView.OnItemLongClickListener listener) { 
     mOnItemLongClicked = listener; 
    } 

    private DataSetObserver mDataObserver = new DataSetObserver() { 

     @Override 
     public void onChanged() { 
      synchronized(HorizontalListView.this){ 
       mDataChanged = true; 
      } 
      invalidate(); 
      requestLayout(); 
     } 

     @Override 
     public void onInvalidated() { 
      reset(); 
      invalidate(); 
      requestLayout(); 
     } 

    }; 

    @Override 
    public ListAdapter getAdapter() { 
     return mAdapter; 
    } 

    @Override 
    public View getSelectedView() { 
     //TODO: implement 
     return null; 
    } 

    @Override 
    public void setAdapter(ListAdapter adapter) { 
     if(mAdapter != null) { 
      mAdapter.unregisterDataSetObserver(mDataObserver); 
     } 
     mAdapter = adapter; 
     mAdapter.registerDataSetObserver(mDataObserver); 
     reset(); 
    } 

    private synchronized void reset(){ 
     initView(); 
     removeAllViewsInLayout(); 
     requestLayout(); 
    } 

    @Override 
    public void setSelection(int position) { 
     //TODO: implement 
    } 

    private void addAndMeasureChild(final View child, int viewPos) { 
     LayoutParams params = child.getLayoutParams(); 
     if(params == null) { 
      params = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT); 
     } 

     addViewInLayout(child, viewPos, params, true); 
     child.measure(MeasureSpec.makeMeasureSpec(getWidth(), MeasureSpec.AT_MOST), 
       MeasureSpec.makeMeasureSpec(getHeight(), MeasureSpec.AT_MOST)); 
    } 

    @Override 
    protected synchronized void onLayout(boolean changed, int left, int top, int right, int bottom) { 
     super.onLayout(changed, left, top, right, bottom); 

     if(mAdapter == null){ 
      return; 
     } 

     if(mDataChanged){ 
      int oldCurrentX = mCurrentX; 
      initView(); 
      removeAllViewsInLayout(); 
      mNextX = oldCurrentX; 
      mDataChanged = false; 
     } 

     if(mScroller.computeScrollOffset()){ 
      int scrollx = mScroller.getCurrX(); 
      mNextX = scrollx; 
     } 

     if(mNextX <= 0){ 
      mNextX = 0; 
      mScroller.forceFinished(true); 
     } 
     if(mNextX >= mMaxX) { 
      mNextX = mMaxX; 
      mScroller.forceFinished(true); 
     } 

     int dx = mCurrentX - mNextX; 

     removeNonVisibleItems(dx); 
     fillList(dx); 
     positionItems(dx); 

     mCurrentX = mNextX; 

     if(!mScroller.isFinished()){ 
      post(new Runnable(){ 
       public void run() { 
        requestLayout(); 
       } 
      }); 

     } 
    } 

    private void fillList(final int dx) { 
     int edge = 0; 
     View child = getChildAt(getChildCount()-1); 
     if(child != null) { 
      edge = child.getRight(); 
     } 
     fillListRight(edge, dx); 

     edge = 0; 
     child = getChildAt(0); 
     if(child != null) { 
      edge = child.getLeft(); 
     } 
     fillListLeft(edge, dx); 


    } 

    private void fillListRight(int rightEdge, final int dx) { 
     while(rightEdge + dx < getWidth() && mRightViewIndex < mAdapter.getCount()) { 

      View child = mAdapter.getView(mRightViewIndex, mRemovedViewQueue.poll(), this); 
      addAndMeasureChild(child, -1); 
      rightEdge += child.getMeasuredWidth(); 

      if(mRightViewIndex == mAdapter.getCount()-1) { 
       mMaxX = mCurrentX + rightEdge - getWidth(); 
      } 

      if (mMaxX < 0) { 
       mMaxX = 0; 
      } 
      mRightViewIndex++; 
     } 

    } 

    private void fillListLeft(int leftEdge, final int dx) { 
     while(leftEdge + dx > 0 && mLeftViewIndex >= 0) { 
      View child = mAdapter.getView(mLeftViewIndex, mRemovedViewQueue.poll(), this); 
      addAndMeasureChild(child, 0); 
      leftEdge -= child.getMeasuredWidth(); 
      mLeftViewIndex--; 
      mDisplayOffset -= child.getMeasuredWidth(); 
     } 
    } 

    private void removeNonVisibleItems(final int dx) { 
     View child = getChildAt(0); 
     while(child != null && child.getRight() + dx <= 0) { 
      mDisplayOffset += child.getMeasuredWidth(); 
      mRemovedViewQueue.offer(child); 
      removeViewInLayout(child); 
      mLeftViewIndex++; 
      child = getChildAt(0); 

     } 

     child = getChildAt(getChildCount()-1); 
     while(child != null && child.getLeft() + dx >= getWidth()) { 
      mRemovedViewQueue.offer(child); 
      removeViewInLayout(child); 
      mRightViewIndex--; 
      child = getChildAt(getChildCount()-1); 
     } 
    } 

    private void positionItems(final int dx) { 
     if(getChildCount() > 0){ 
      mDisplayOffset += dx; 
      int left = mDisplayOffset; 
      for(int i=0;i<getChildCount();i++){ 
       View child = getChildAt(i); 
       int childWidth = child.getMeasuredWidth(); 
       child.layout(left, 0, left + childWidth, child.getMeasuredHeight()); 
       left += childWidth; 
      } 
     } 
    } 

    public synchronized void scrollTo(int x) { 
     mScroller.startScroll(mNextX, 0, x - mNextX, 0); 
     requestLayout(); 
    } 

    @Override 
    public boolean dispatchTouchEvent(MotionEvent ev) { 
     boolean handled = super.dispatchTouchEvent(ev); 
     handled |= mGesture.onTouchEvent(ev); 
     return handled; 
    } 

    protected boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, 
       float velocityY) { 
     synchronized(HorizontalListView.this){ 
      mScroller.fling(mNextX, 0, (int)-velocityX, 0, 0, mMaxX, 0, 0); 
     } 
     requestLayout(); 

     return true; 
    } 

    protected boolean onDown(MotionEvent e) { 
     mScroller.forceFinished(true); 
     return true; 
    } 

    private OnGestureListener mOnGesture = new GestureDetector.SimpleOnGestureListener() { 

     @Override 
     public boolean onDown(MotionEvent e) { 
      return HorizontalListView.this.onDown(e); 
     } 

     @Override 
     public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, 
       float velocityY) { 
      return HorizontalListView.this.onFling(e1, e2, velocityX, velocityY); 
     } 

     @Override 
     public boolean onScroll(MotionEvent e1, MotionEvent e2, 
       float distanceX, float distanceY) { 

      synchronized(HorizontalListView.this){ 
       mNextX += (int)distanceX; 
      } 
      requestLayout(); 

      return true; 
     } 

     @Override 
     public boolean onSingleTapConfirmed(MotionEvent e) { 
      for(int i=0;i<getChildCount();i++){ 
       View child = getChildAt(i); 
       if (isEventWithinView(e, child)) { 
        if(mOnItemClicked != null){ 
         mOnItemClicked.onItemClick(HorizontalListView.this, child, mLeftViewIndex + 1 + i, mAdapter.getItemId(mLeftViewIndex + 1 + i)); 
        } 
        if(mOnItemSelected != null){ 
         mOnItemSelected.onItemSelected(HorizontalListView.this, child, mLeftViewIndex + 1 + i, mAdapter.getItemId(mLeftViewIndex + 1 + i)); 
        } 
        break; 
       } 

      } 
      return true; 
     } 

     @Override 
     public void onLongPress(MotionEvent e) { 
      int childCount = getChildCount(); 
      for (int i = 0; i < childCount; i++) { 
       View child = getChildAt(i); 
       if (isEventWithinView(e, child)) { 
        if (mOnItemLongClicked != null) { 
         mOnItemLongClicked.onItemLongClick(HorizontalListView.this, child, mLeftViewIndex + 1 + i, mAdapter.getItemId(mLeftViewIndex + 1 + i)); 
        } 
        break; 
       } 

      } 
     } 

     private boolean isEventWithinView(MotionEvent e, View child) { 
      Rect viewRect = new Rect(); 
      int[] childPosition = new int[2]; 
      child.getLocationOnScreen(childPosition); 
      int left = childPosition[0]; 
      int right = left + child.getWidth(); 
      int top = childPosition[1]; 
      int bottom = top + child.getHeight(); 
      viewRect.set(left, top, right, bottom); 
      return viewRect.contains((int) e.getRawX(), (int) e.getRawY()); 
     } 
    }; 



} 

Activity.java

HorizontalListView smallSlideList; 

smallSlideList = (HorizontalListView) findViewById(R.id.listview); 
    smallSlideList.setOnItemSelectedListener(new OnItemSelectedListener() { 

      @Override 
      public void onItemSelected(AdapterView<?> arg0, View arg1, 
        int arg2, long arg3) { 
       // TODO Auto-generated method stub 
       System.out.println(":::::::::::::::::ID::::::::::::::::::::::" 
         + arg2); 
       pos = arg2; 
       smallSlideList.setSelection(pos); 
       myPager.setCurrentItem(pos); 
       picadapter.notifyDataSetChanged(); 

      } 

      @Override 
      public void onNothingSelected(AdapterView<?> arg0) { 
       // TODO Auto-generated method stub 

      } 
     }); 

选择

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 

    <item android:state_pressed="true" android:color="#aabbcc"/> 
<!-- pressed --> 
    <item android:state_activated="true" android:color="#fedcba"/> 
<!-- selected --> 
    <item android:color="#abcdef"/> 
<!-- default --> 

</selector> 

ViewItem

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

    <ImageView 
     android:id="@+id/image" 
     android:layout_width="60dp" 
     android:layout_height="60dp" 
     android:padding="1dp" 
     android:scaleType="fitXY" /> 

</RelativeLayout> 

main.xml中

<com.eps.fortalented.uc.HorizontalListView 
     android:id="@+id/listview" 
     android:layout_width="fill_parent" 
     android:layout_height="60dp" 
     android:layout_below="@+id/tv_candi" 
     android:cacheColorHint="#fff" 
     android:choiceMode="singleChoice" 
     android:divider="#cdc9c9" 
     android:dividerHeight="2sp" /> 

回答

1

我有一个样本项目,该项目展示了如何在自定义列表中选择设置项:https://github.com/mighter1488/custom-list-item-selection也许这可以帮助你。

+0

感谢您的支持,但我认为这对我来说是无用的,因为我已经制作了我的customHorizo​​ntal ListView。 – user3820044 2014-09-24 09:01:36

+0

我已经试过这种方式,但现在问题是以前选定的项目也仍然突出显示。你可以帮我吗? \t smallSlideList.setOnItemSelectedListener(新OnItemSelectedListener(){ \t \t \t @覆盖 \t \t \t公共无效onItemSelected(适配器视图为arg0,视图V,INT ARG2, \t \t \t \t \t长ARG3){ \t \t \t \t // TODO自动生成方法存根 \t \t \t \t的System.out.println(“::::::::::: :::::: ID ::::::::::::::::::::::“ \t \t \t \t \t \t + arg2); \t \t \t \t pos = arg2; \t \t \t \t smallSlideList.setSelection(POS); \t \t \t \t myPager.setCurrentItem(POS); \t \t \t \t v.setBackgroundColor(Color.parseColor( “#FF0000”)); \t \t \t \t picadapter。notifyDataSetChanged(); \t \t \t} – user3820044 2014-09-24 09:17:54