Android 在自定义ListView适配器中按项目时高亮显示效果
在Android中,每次单击视图都会产生系统视觉效果。棒棒糖的涟漪效应。当我创建一个ListView并将其与一个普通的ArrayAdapter关联时,这种效果就出现了。现在我已经添加了一个自定义的ListView,这个效果就消失了 现在,我试图找出问题所在,由于使用相同的列表项布局与默认适配器配合使用效果很好,因此我认为问题出在我的自定义适配器上 我见过许多与此案例相关的解决方案,它们只是实现了调用一些drawable的连锁反应;这不是我想做的。涟漪效应的出现仅仅是因为我在安卓5上运行应用程序,现在我想做的是在我的项目被点击时为其提供默认的系统高亮效果 以下是(希望如此)我的自定义适配器的相关部分:Android 在自定义ListView适配器中按项目时高亮显示效果,android,listview,custom-adapter,Android,Listview,Custom Adapter,在Android中,每次单击视图都会产生系统视觉效果。棒棒糖的涟漪效应。当我创建一个ListView并将其与一个普通的ArrayAdapter关联时,这种效果就出现了。现在我已经添加了一个自定义的ListView,这个效果就消失了 现在,我试图找出问题所在,由于使用相同的列表项布局与默认适配器配合使用效果很好,因此我认为问题出在我的自定义适配器上 我见过许多与此案例相关的解决方案,它们只是实现了调用一些drawable的连锁反应;这不是我想做的。涟漪效应的出现仅仅是因为我在安卓5上运行应用程序,
public class CustomCardSetsAdapter extends BaseAdapter {
List<Card> totalList;
ArrayList<Boolean> hiddenItems;
ListView parentLV;
Integer curPosition = -1;
public static int selectedRowIndex;
public CustomCardSetsAdapter(CardSets cardList, ListView parentListView)
{
this.parentLV = parentListView;
assignSetValues(cardList);
totalList = cardList.getBlackrockMountain();
totalList.addAll(cardList.getClassic());
totalList.addAll(cardList.getCurseofNaxxramas());
totalList.addAll(cardList.getGoblinsvsGnomes());
Collections.sort(totalList,
new Comparator<Card>() {
public int compare(Card f1, Card f2) {
return f1.toString().compareTo(f2.toString());
}
});
hiddenItems = new ArrayList<>();
for (int i = 0; i < totalList.size(); i++) {
if(!totalList.get(i).getCollectible())
hiddenItems.add(true);
else
hiddenItems.add(false);
}
}
@Override
public int getCount() {
return (totalList.size() - getHiddenCount());
}
@Override
public View getView(final int position, View convertView, final ViewGroup parent) {
final int index = getRealPosition(position);
if(convertView == null) {
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
convertView = inflater.inflate(R.layout.card_list_item, parentLV, false);
}
convertView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Integer prevPosition = curPosition;
curPosition = position;
if(prevPosition >= parentLV.getFirstVisiblePosition() &&
prevPosition <= parentLV.getLastVisiblePosition())
{
View view = parentLV.getChildAt(prevPosition- parentLV.getFirstVisiblePosition());
parentLV.getAdapter().getView(prevPosition,view, parentLV);
}
v.setBackgroundColor(Color.WHITE);
}
});
Card curCard = totalList.get(index);
TextView cardName = (TextView) convertView.findViewById(R.id.cardName);
cardName.setText(curCard.getName());
setRarityColor(curCard,cardName);
TextView manaCost = (TextView) convertView.findViewById(R.id.manaCost);
manaCost.setText((curCard.getCost()).toString());
ImageView setIcon = (ImageView) convertView.findViewById(R.id.setIcon);
setSetIcon(curCard,setIcon);
if(position == curPosition)
convertView.setBackgroundColor(Color.WHITE);
else
convertView.setBackgroundColor(Color.TRANSPARENT);
return convertView;
}
@Override
public int getItemViewType(int position) {
return R.layout.card_list_item;
}
@Override
public int getViewTypeCount() {
return 1;
}
@Override
public boolean isEmpty() {
return false;
}
private int getHiddenCount()
{
int count = 0;
for(int i = 0;i <totalList.size();i++)
if(hiddenItems.get(i))
count++;
return count;
}
private int getRealPosition(int position) {
int hElements = getHiddenCountUpTo(position);
int diff = 0;
for(int i=0;i<hElements;i++) {
diff++;
if(hiddenItems.get(position+diff))
i--;
}
return (position + diff);
}
private int getHiddenCountUpTo(int location) {
int count = 0;
for(int i=0;i<=location;i++) {
if(hiddenItems.get(i))
count++;
}
return count;
}
}
公共类CustomCardSetAdapter扩展了BaseAdapter{
列表汇总器;
ArrayList hiddenItems;
列表视图parentLV;
整数curPosition=-1;
公共静态int-selectedRowIndex;
公共CustomCardSetsAdapter(CardSets cardList,ListView parentListView)
{
this.parentLV=parentListView;
assignSetValues(cardList);
totalist=cardList.getBlackrockMountain();
addAll(cardList.getClassic());
addAll(cardList.getCurseofNaxxramas());
addAll(cardList.getGoblinsvsGnomes());
Collections.sort(totalist,
新比较器(){
公共整数比较(卡f1、卡f2){
返回f1.toString().compareTo(f2.toString());
}
});
hiddenItems=newarraylist();
对于(int i=0;i=parentLV.getFirstVisiblePosition()&&
prevPosition在ListView XML中,添加:
android:drawSelectorOnTop="true"
我还认为你用错了适配器
在适配器上使用ViewHolder模式:
public class CustomCardSetsAdapter extends BaseAdapter {
List<Card> totalList;
ArrayList<Boolean> hiddenItems;
ListView parentLV;
Integer curPosition = -1;
public static int selectedRowIndex;
private class ViewHolderRow{
TextView cardName;
TextView manaCost;
ImageView setIcon;
}
public CustomCardSetsAdapter(CardSets cardList, ListView parentListView)
{
this.parentLV = parentListView;
assignSetValues(cardList);
totalList = cardList.getBlackrockMountain();
totalList.addAll(cardList.getClassic());
totalList.addAll(cardList.getCurseofNaxxramas());
totalList.addAll(cardList.getGoblinsvsGnomes());
Collections.sort(totalList,
new Comparator<Card>() {
public int compare(Card f1, Card f2) {
return f1.toString().compareTo(f2.toString());
}
});
hiddenItems = new ArrayList<>();
for (int i = 0; i < totalList.size(); i++) {
if(!totalList.get(i).getCollectible())
hiddenItems.add(true);
else
hiddenItems.add(false);
}
}
@Override
public int getCount() {
return (totalList.size() - getHiddenCount());
}
@Override
public View getView(final int position, View convertView, final ViewGroup parent) {
final int index = getRealPosition(position);
ViewHolderRow theRow;
if(convertView == null) {
theRow = new ViewHolderRow();
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
convertView = inflater.inflate(R.layout.card_list_item, parentLV, false);
// Cache your views
theRow.cardName = (TextView) convertView.findViewById(R.id.cardName);
theRow.manaCost = (TextView) convertView.findViewById(R.id.manaCost);
theRow.setIcon = (ImageView) convertView.findViewById(R.id.setIcon);
// Set the Tag to the ViewHolderRow
convertView.setTag(theRow);
}else{
// get the Row to re-use
theRow = (ViewHolderRow) convertView.getTag();
}
//... Removed convertView.setOnClickListener
Card curCard = totalList.get(index);
// Set Items
theRow.cardName.setText(curCard.getName());
setRarityColor(curCard,theRow.cardName);
theRow.manaCost.setText((curCard.getCost()).toString());
setSetIcon(curCard,theRow.setIcon);
if(position == curPosition){
convertView.setBackgroundColor(Color.WHITE);
}else{
convertView.setBackgroundColor(Color.TRANSPARENT);
}
return convertView;
}
@Override
public int getItemViewType(int position) {
return R.layout.card_list_item;
}
@Override
public int getViewTypeCount() {
return 1;
}
@Override
public boolean isEmpty() {
return false;
}
private int getHiddenCount()
{
int count = 0;
for(int i = 0;i <totalList.size();i++)
if(hiddenItems.get(i))
count++;
return count;
}
private int getRealPosition(int position) {
int hElements = getHiddenCountUpTo(position);
int diff = 0;
for(int i=0;i<hElements;i++) {
diff++;
if(hiddenItems.get(position+diff))
i--;
}
return (position + diff);
}
private int getHiddenCountUpTo(int location) {
int count = 0;
for(int i=0;i<=location;i++) {
if(hiddenItems.get(i))
count++;
}
return count;
}
}
公共类CustomCardSetAdapter扩展了BaseAdapter{
列表汇总器;
ArrayList hiddenItems;
列表视图parentLV;
整数curPosition=-1;
公共静态int-selectedRowIndex;
私有类ViewHolderRow{
TextView卡名;
文本视图成本;
图像视图设置图标;
}
公共CustomCardSetsAdapter(CardSets cardList,ListView parentListView)
{
this.parentLV=parentListView;
assignSetValues(cardList);
totalist=cardList.getBlackrockMountain();
addAll(cardList.getClassic());
addAll(cardList.getCurseofNaxxramas());
addAll(cardList.getGoblinsvsGnomes());
Collections.sort(totalist,
新比较器(){
公共整数比较(卡f1、卡f2){
返回f1.toString().compareTo(f2.toString());
}
});
hiddenItems=newarraylist();
对于(int i=0;iyourListView.setOnItemClickListener(ListListener);
private final OnItemClickListener ListListener = new OnItemClickListener{
@Override
public void onItemClick(AdapterView<?> arg0, View view, int position, long arg3) {
// ... Do something on click
}
}