2015-08-21 28 views
1

我有一個自定義列表視圖,其中包括具有向左或向右滑動功能的項目... 問題是,當我在列表視圖上滑動可見項目時,左或右分別。我怎樣才能防止屏幕項目的輕掃?自定義列表查看關屏幕位置

public class TestListViewAdapter extends BaseAdapter { 

    Context context; 
    ArrayList<RowItem> arrayList; 

    LayoutInflater layoutInflater; 

    public TestListViewAdapter(Context context,ArrayList<RowItem> arrayList,DataSource dataSource){ 
     this.context = context; 
     this.arrayList =arrayList; 

     layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 


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

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

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

    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 
     ViewHolder holder; 
     if(convertView == null) { 
      convertView = layoutInflater.inflate(R.layout.list_item, parent, false); 
      holder = new ViewHolder(); 
      holder.txtTitle = (TextView)convertView.findViewById(R.id.handle_c); 
      convertView.setTag(holder); 

     }else{ 
      holder = (ViewHolder)convertView.getTag(); 
     } 
     holder.txtTitle.setText(arrayList.get(position).getTitle()); 

     if(arrayList.get(position).getleft()) { 
       //txtTitle.setGravity(Gravity.RIGHT); 
       setMargins(holder.txtTitle, px2dp(55), 0, 0,0); 


      }else { 
       //txtTitle.setGravity(Gravity.RIGHT); 
       setMargins(holder.txtTitle, 0,0,px2dp(55),0); 
      } 



     convertView.setOnTouchListener(new OnSwipeTouchListener(context) { 
      @Override 
      public void onSwipeLeft(View view) { 
       if (arrayList.get(position).getleft()){ 
        arrayList.get(position).setleft(false); 
        Animation animationtranslate_left = new TranslateAnimation(px2dp(55+arrayList.get(position).getPX()),px2dp(0+arrayList.get(position).getPX()),0,0); 
        animationtranslate_left.setDuration(100); 
        //animationtranslate.setFillAfter(true); 

        //Animation anim = AnimationUtils.loadAnimation(getContext(), R.anim.left_swipe); 
        try { 
         view.clearAnimation(); 
        } catch (Exception e) { 

        } 
        if (view != null) 
         view.startAnimation(animationtranslate_left); 
        else 
         Log.e("View null", "Null"); 
        animationtranslate_left.setFillAfter(true); 

       } 

      } 

      @Override 
      public void onSwipeRight(View view) { 
       if (!arrayList.get(position).getleft()) { 
        arrayList.get(position).setleft(true); 
        Animation animationtranslate_rigth = new TranslateAnimation(px2dp(0+arrayList.get(position).getPX()),px2dp(55+arrayList.get(position).getPX()),0 , 0); 
        animationtranslate_rigth. setDuration(100); 
        //animationtranslate.setFillAfter(true); 

        //Animation anim = AnimationUtils.loadAnimation(getContext(), R.anim.left_swipe); 
        try { 
         view.clearAnimation(); 
        } catch (Exception e) { 

        } 
        if (view != null) 
         view.startAnimation(animationtranslate_rigth); 
        else 
         Log.e("View null", "Null"); 
        animationtranslate_rigth.setFillAfter(true); 


      } 


     }); 





     return convertView; 
    } 

    private class Detector extends GestureDetector { 

     View view; 

     public Detector(Context context, OnGestureListener listener) { 
      super(context, listener); 
     } 

     @Override 
     public boolean onTouchEvent(MotionEvent ev) { 
      return super.onTouchEvent(ev); 
     } 

     public boolean onTouch(MotionEvent ev, View view) { 
      this.view = view.findViewById(R.id.handle_c); 
      return onTouchEvent(ev); 
     } 

     public View getView() { 
      return view; 
     } 

     private void setView(View view) { 
      this.view = view; 
     } 

    } 


    public class OnSwipeTouchListener implements View.OnTouchListener { 

     private final Detector gestureDetector; 

     public OnSwipeTouchListener(Context context) { 
      gestureDetector = (Detector) new Detector(context, new GestureListener()); 
     } 

     public void onSwipeLeft(View view) { 

     } 

     public void onSwipeRight(View view) { 
     } 

     public boolean onTouch(View v, MotionEvent event) { 
      return gestureDetector.onTouch(event, v); 
     } 

     private final class GestureListener extends Detector.SimpleOnGestureListener { 

      //private static final int SWIPE_MIN_DISTANCE = 20; 
      //private static final int SWIPE_MAX_OFF_PATH = 250; 
      //private static final int SWIPE_THRESHOLD_VELOCITY = 200; 

      @Override 
      public boolean onDown(MotionEvent e) { 
       return true; 
      } 

      @Override 
      public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { 
       float ydis = e1.getY() - e2.getY(); 
       if (ydis > 70) { 
        return super.onScroll(e1, e2, distanceX, distanceY); 
       } else { 
        if (e1.getX() - e2.getX() > 0) { 
         onSwipeLeft(gestureDetector.getView()); 
        } else if (e1.getX() - e2.getX() < 0) { 
         onSwipeRight(gestureDetector.getView()); 
        } 
        return false; 
       } 
      } 

      @Override 
      public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { 

       try { 

        System.out.println("X1- " + e1.getX() + " X2- " + e2.getX() + " Y1- " + e1.getY() + " Y2- " + e2.getY()); 
        if (e1.getX() - e2.getX() > 0) { 
         onSwipeLeft(gestureDetector.getView()); 
        } else if (e1.getX() - e2.getX() < 0) { 
         onSwipeRight(gestureDetector.getView()); 
        } 
       } catch (Exception e) { 
        Log.e("Home", "Error on gestures"); 
       } 
       return false; 
      } 
     } 
    } 

    class ViewHolder{ 
     TextView txtTitle; 
    } 


    public class RowItem { 
    private String title,id,name,number,primeri_id; 
    private boolean left; 
    private int px; 
    public boolean getleft(){return left;} 
    public int getPX(){return px;} 
    public void setleft(boolean b){left=b;} 
    public RowItem(boolean bl,String t,String id,String primeri_id){ 
     title=t; 
     left=bl; 
     this.id = id; 
     this.primeri_id = primeri_id; 
     px=bl? -55:0; 
    } 
    public RowItem(String name ,String number){ 
     this.name = name; 
     this.number= number; 

    } 

    public String getPrimeri_id() { 
     return primeri_id; 
    } 

    public void setPrimeri_id(String primeri_id) { 
     this.primeri_id = primeri_id; 
    } 

    public String getName() { 
     return name; 
    } 

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

    public String getNumber() { 
     return number; 
    } 

    public void setNumber(String number) { 
     this.number = number; 
    } 

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

    public String getId() { 
     return id; 
    } 

    public void setId(String id) { 
     this.id = id; 
    } 
} 

回答

0

看來您的問題是由ListView行被回收的事實引起的。它們更像是您的個人數據在屏幕上出現時所穿的口罩。所以,你必須讓他們獨立,每次寫動畫完成後,這意味着(同爲「...對...」):

animationtranslate_left.setFillAfter(false); 

爲了實現位置爲您的文字一個持續變化,我用了一個簡單的解決方法(一個也可以定義不同類型的排佈置的):

我list_item.xml一個的LinearLayout具有兩個TextViews製成:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent"> 

<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="New Text" 
    android:id="@+id/handle_c_left" 
    /> 
<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="New Text" 
    android:id="@+id/handle_c_right" 
    /> 
</LinearLayout> 

並且同樣改變了ViewHolder:

private static class ViewHolder 
    { 
     TextView txtTitle_1; 
     TextView txtTitle_2; 
    } 

在 'getView()' 方法,我說:

 if(arrayList.get(position).getleft()) { 
      holder.txtTitle_1.setText(arrayList.get(position).getTitle()); 
      holder.txtTitle_2.setVisibility(View.INVISIBLE); 
      holder.txtTitle_1.setVisibility(View.VISIBLE); 

     }else { 
      holder.txtTitle_2.setText(arrayList.get(position).getTitle()); 
      holder.txtTitle_1.setVisibility(View.INVISIBLE); 
      holder.txtTitle_2.setVisibility(View.VISIBLE); 
     } 

和最後陳述中的每個 'OnSwipe ...()' 方法,我插

notifyDataSetChanged(); 

因爲改變list_item.xml也必須更改'gestureDetector.onTouch()'。我打補丁這樣的:

public boolean onTouch(MotionEvent ev, View view) { 
     //this.view = view.findViewById(R.id.handle_c); 
     this.view = view; 
     return onTouchEvent(ev); 
    } 

不知道所有的代碼很難決定將來的補丁是確定的,並沒有「px2dp()」我敢肯定,我沒有打的距離正好。但我已經測試過它,它工作。

重要的要點是:

  • 也沒有用製作動畫效果永久,帶有錶行
  • 列表項由適配器保持你顯示基礎數據的工作時。當數據發生變化時,調用'notifyDatasetChanged()'並讓適配器完成它的工作。