2014-08-27 51 views
0

我的列表視圖包含TextViewImageView,在第一圖像視圖是INVISIBLE,並通過點擊每個項目將是VISIBLE這裏是我的適配器:上轉換視圖點擊監聽器來使圖像視圖中可見

public class ContentViewrAdaptor extends BaseAdapter implements Filterable { 

private List<String> originalData = null; 
private List<String> filteredData = null; 
private LayoutInflater mInflater; 
private Typeface regular; 
private Context context; 
private ItemFilter mFilter = new ItemFilter(); 


public ContentViewrAdaptor(Context context, List<String> data, Typeface regular) { 
    this.filteredData = data; 
    this.originalData = data; 
    this.regular = regular; 
    this.context = context; 
    mInflater = LayoutInflater.from(context); 
} 


public int getCount() { 
    return filteredData.size(); 
} 


public Object getItem(int position) { 
    return filteredData.get(position); 
} 


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

public View getView(final int position, View convertView, ViewGroup parent) { 

    final ViewHolder holder; 

    if (convertView == null) { 
     convertView = mInflater.inflate(R.layout.text_view, null); 


     holder = new ViewHolder(); 
     holder.image = (ImageView) convertView.findViewById(R.id.iAccept); 

     holder.text = (TextView) convertView.findViewById(R.id.contentText); 
     holder.text.setTypeface(regular); 

     convertView.setTag(holder); 
    } else { 
     holder = (ViewHolder) convertView.getTag(); 
    } 
    holder.image.setTag(position); 
    convertView.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      Toast.makeText(context, (Integer) holder.image.getTag() + "", Toast.LENGTH_SHORT).show(); 
      ViewHolder vh = (ViewHolder) v.getTag(); 
      ImageView iv = vh.image; 
      if (iv.getVisibility() == View.VISIBLE) { 
       iv.setVisibility(View.INVISIBLE); 
      } else { 
       iv.setVisibility(View.VISIBLE); 
      } 
     } 
    }); 
    if (filteredData.get(position).contains("font")) 
     holder.text.setText(Html.fromHtml(filteredData.get(position))); 
    else 
     holder.text.setText(filteredData.get(position)); 
    return convertView; 
} 


static class ViewHolder { 
    ImageView image; 
    TextView text; 
} 


public Filter getFilter() { 
    return mFilter; 
} 


private class ItemFilter extends Filter { 

    @Override 
    protected FilterResults performFiltering(CharSequence constraint) { 

     String filterString = constraint.toString().toLowerCase(); 

     FilterResults results = new FilterResults(); 

     final List<String> list = originalData; 

     int count = list.size(); 
     final ArrayList<String> nlist = new ArrayList<String>(count); 

     String filterableString; 

     for (int i = 0; i < count; i++) { 
      filterableString = list.get(i); 
      if (filterableString.toLowerCase().contains(filterString)) { 
       filterableString = filterableString.replaceAll(filterString, "<font color='red'>" + filterString + "</font>"); 
       nlist.add(filterableString); 
      } 
     } 

     results.values = nlist; 
     results.count = nlist.size(); 

     return results; 
    } 


    @SuppressWarnings("unchecked") 
    @Override 
    protected void publishResults(CharSequence constraint, FilterResults results) { 
     filteredData = (ArrayList<String>) results.values; 
     notifyDataSetChanged(); 
    } 

} 
} 

敵人例子當我點擊第一個項目時第四個項目也會顯示,這個問題會導致列表滾動時

有什麼問題?我怎麼解決這個問題?

回答

1

問題是您的適配器在您滾動時重複使用視圖,但是隻有在調用onClicked()時設置View的狀態。

如果您想避免這種情況,一種解決方案是使用包含View的可見性狀態的輔助列表。

例如

ArrayList<Integer> visiblePositions = new ArrayList<Integer>(); 

public View getView(final int position, View convertView, ViewGroup parent) { 

    final ViewHolder holder; 

    if (convertView == null) { 
     convertView = mInflater.inflate(R.layout.text_view, null); 

     holder = new ViewHolder(); 
     holder.image = (ImageView) convertView.findViewById(R.id.iAccept); 

     holder.text = (TextView) convertView.findViewById(R.id.contentText); 
     holder.text.setTypeface(regular); 

     convertView.setTag(holder); 
    } 
    else holder = (ViewHolder) convertView.getTag(); 

    holder.image.setTag(position); 
    adjustImageVisibility(viewHolder, visiblePositions.contains(position)); 

    convertView.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
      onViewClicked(holder, position); 
     } 
    }); 

    if (filteredData.get(position).contains("font")) holder.text.setText(Html.fromHtml(filteredData.get(position)));    
    else holder.text.setText(filteredData.get(position)); 

    return convertView; 
} 

public void onViewClicked(ViewHolder viewHolder, Integer position){ 
    if (visiblePositions.contains(position)) { 
     adjustImageVisibility(viewHolder.image, false); 
     visibilePositions.remove(position); 
    } 
    else { 
     adjustImageVisibility(viewHolder.image, true); 
     visiblePositions.add(position); 
    } 
} 

public void adjustImageVisibility(ImageView imageView, boolean visible){ 
    if(visible) imageView.setVisibility(View.INVISIBLE); 
    else imageView.setVisibility(View.VISIBLE); 
} 

應該由來頭點擊項目的位置和具有適配器的getView()方法構建視圖中顯示時使用該位置爲你工作。

注意:如果由於某種原因您的列表順序發生更改,此解決方案可能會失敗。

更好的方法是創建一個對象,該對象既包含要顯示的字符串,也包含其可見性的布爾值,然後讓對象自己處理它。

但是,這應該指出你在正確的方向。

+0

謝謝你,Guardanis先生 – 2014-08-27 20:52:00

+0

非常歡迎!很高興我能幫忙〜 – Guardanis 2014-08-27 21:04:52

0

您需要一個單獨的陣列來保存每個組的圖像狀態。這是我對此的解釋。

private boolean[] mImageStates; 

public ContentViewrAdaptor(Context context, List<String> data, Typeface regular) { 
    ... 
    mImageStates = new boolean[getCount()]; 
} 

public View getView(final int position, View convertView, ViewGroup parent) { 
    final ViewHolder holder; 

    if (convertView == null) { 
     convertView = mInflater.inflate(R.layout.text_view, null); 

     holder = new ViewHolder(); 
     holder.image = (ImageView) convertView.findViewById(R.id.iAccept); 

     holder.text = (TextView) convertView.findViewById(R.id.contentText); 
     holder.text.setTypeface(regular); 

     convertView.setTag(holder); 

     convertView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Toast.makeText(context, (Integer) holder.image.getTag() + "", Toast.LENGTH_SHORT).show(); 

       ImageView imageView = holder.image; 
       int position = Integer.parseInt(imageView.getTag().toString()); 
       if (mImageStates[position]) { 
        imageView.setVisibility(View.INVISIBLE); 
        mImageStates[position] = false; 
       } else { 
        imageView.setVisibility(View.VISIBLE); 
        mImageStates[position] = true; 
       } 
      } 
     }); 
    } else { 
     holder = (ViewHolder) convertView.getTag(); 
    } 

    holder.image.setTag(position); 

    if (mImageStates[position]) { 
     holder.image.setVisibility(View.INVISIBLE); 
    } else { 
     holder.image.setVisibility(View.VISIBLE); 
    } 

    if (filteredData.get(position).contains("font")) { 
     holder.text.setText(Html.fromHtml(filteredData.get(position))); 
    } else { 
     holder.text.setText(filteredData.get(position)); 
    } 

    return convertView; 
}