2014-05-11 54 views
2

我使用47deg库来实现的列表视图轻扫手势:https://github.com/47deg/android-swipelistview改变行背景时刷卡

我要改变每行的背景我正在刷它,我有2个问题后。

第一个问题是当我滑动例如第一行,它的背景颜色改变完美,但在我滚动列表后,我看到其他一些行的背景改变了。我搜索了很多,发现这个问题与在listview中重复使用视图有关,但我无法弄清楚该如何解决我的问题。

第二个问题是,只有列表行的前半部分在我滑过后才生效。实际上,当我刷动下半部分的行时,出现错误并强行关闭。也许这个问题与第一个问题有关,我不确定。

这是我的适配器类:

public class WordsListAdapter extends BaseAdapter { 

private List<WordsItem> data; 
private Context context; 

public WordsListAdapter(Context context, List<WordsItem> data){ 
    this.data = data; 
    this.context = context; 
} 

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

@Override 
public WordsItem getItem(int position) { 
    return data.get(position); 
} 

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

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    final WordsItem item = getItem(position); 
    ViewHolder holder; 
    if (convertView == null) { 
     LayoutInflater li = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     convertView = li.inflate(R.layout.custom_row, parent, false); 
     holder = new ViewHolder(); 
     holder.itemName = (TextView) convertView.findViewById(R.id.example_itemname); 
     convertView.setTag(holder); 
    } else { 
     holder = (ViewHolder) convertView.getTag(); 
    } 

    ((SwipeListView)parent).recycle(convertView, position); 

    holder.itemName.setText(item.getItemName()); 

    return convertView; 
} 

private static class ViewHolder{ 
    public TextView itemName; 
} 

} 

这是包括swipelistview活动:

public class WordsActivity extends Activity { 

private WordsListAdapter adapter; 
private List<WordsItem> data; 
private int i; 

private SwipeListView swipeListView; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_words); 

    data = new ArrayList<WordsItem>(); 

    adapter = new WordsListAdapter(this, data); 

    swipeListView = (SwipeListView) findViewById(R.id.example_swipe_lv_list); 

    swipeListView.setSwipeListViewListener(new BaseSwipeListViewListener() { 
     @Override 
     public void onOpened(int position, boolean toRight) { 
     swipeListView.closeAnimate(position); 
     } 

     @Override 
     public void onClosed(int position, boolean fromRight) { 
     } 

     @Override 
     public void onListChanged() { 
     } 

     @Override 
     public void onMove(int position, float x) { 
     } 

     @Override 
     public void onStartOpen(int position, int action, boolean right) { 
      if (right) { 
       swipeListView.getChildAt(position).findViewById(R.id.front).setBackgroundColor(Color.GREEN); 
       } else { 
       swipeListView.getChildAt(position).findViewById(R.id.front).setBackgroundColor(Color.RED); 
       } 
      } 
     } 

     @Override 
     public void onStartClose(int position, boolean right) { 
      Log.d("swipe", String.format("onStartClose %d", position)); 
     } 

     @Override 
     public void onClickFrontView(int position) { 
      Log.d("swipe", String.format("onClickFrontView %d", position)); 
      Toast.makeText(WordsActivity.this, "Clicked",Toast.LENGTH_SHORT).show(); 

     } 

     @Override 
     public void onClickBackView(int position) { 
      Log.d("swipe", String.format("onClickBackView %d", position)); 

      swipeListView.closeAnimate(position);//when you touch back view it will close 
     } 

     @Override 
     public void onDismiss(int[] reverseSortedPositions) { 

     } 

    }); 

    swipeListView.setAdapter(adapter); 

    reload(); 

    i = 0; 

    for(String word : itemData){ 
     data.add(new WordsItem("item " + i)); 
     i++; 
    } 

    adapter.notifyDataSetChanged(); 

} 

private void reload(){ 
    swipeListView.setSwipeMode(SwipeListView.SWIPE_MODE_BOTH); // there are five swiping modes 
    swipeListView.setSwipeActionLeft(SwipeListView.SWIPE_ACTION_REVEAL); //there are four swipe actions 
    swipeListView.setSwipeActionRight(SwipeListView.SWIPE_ACTION_REVEAL); 
    swipeListView.setOffsetLeft(convertDpToPixel(300f)); // left side offset 
    swipeListView.setOffsetRight(convertDpToPixel(300f)); // right side offset 
    swipeListView.setAnimationTime(100); // Animation time 
    swipeListView.setSwipeOpenOnLongPress(true); 
} 

public int convertDpToPixel(float dp) { 
    DisplayMetrics metrics = getResources().getDisplayMetrics(); 
    float px = dp * (metrics.densityDpi/160f); 
    return (int) px; 
} 

} 
+0

在您的适配器类,你已经膨胀是非常重要的结果listview's个人观点xml布局“custom_row”。在xml中,你必须定义滑动列表视图两侧的布局。例如:后部和前部布局。你可以改变他们的背景颜色.. – Imeshke

回答

0

你可以做的是建立在你的activity一个callback和实施interface在适配器所以你可以通过onStartOpen()onOpen()中的callback发送位置,然后通过发送positions您的适配器可以识别这些位置,getView()也是如此,您可以将这些位置的背景变为逻辑。

PS - 每当你尝试修改,因为回收你永远不会得到你瞄准所以委托全视图相关的任务,您listview's adapter