我没有在互联网上找到任何正确的解决方案。
我的listview
对象中有一些来自数据库的项目。为此我创建了一个自定义BaseAdapter
并在适配器类中实现了OnLongClickListener()
(我知道我会覆盖listview如何处理动画等等,但这只是为了学习)。
我可以通过长按选择多个项目并更改每个行的背景颜色。但我无法重置行(未经检查和"正常"背景颜色),尽管我在我的监听器中实现了这些行为。
我做错了什么?
这是我的自定义适配器类
package com.dacmas.shoppingapp;
import android.content.Context;
import android.text.AndroidCharacter;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import com.amulyakhare.textdrawable.TextDrawable;
import com.amulyakhare.textdrawable.util.ColorGenerator;
import java.util.ArrayList;
import java.util.List;
public class ShoppingListAdapter extends BaseAdapter {
private ArrayList< ShoppingListEntry > m_itemList;
private Context m_context;
private LayoutInflater m_inflater;
private View m_convertView;
public ShoppingListAdapter(Context context, ArrayList< ShoppingListEntry > shoppingListEntryArrayList ) {
m_itemList = shoppingListEntryArrayList;
m_context = context;
m_inflater = ( LayoutInflater.from( context ) );
}
@Override
public int getCount() { return m_itemList.size(); }
@Override
public Object getItem( int position ) { return m_itemList.get( position ); }
@Override
public long getItemId( int position ) { return position; }
@Override
public View getView(final int position, View convertView, final ViewGroup parent ) {
if ( convertView == null ) {
m_convertView = LayoutInflater.from( m_context ).inflate( R.layout.list_row_shoppinglist, parent, false );
}
ImageView accountImage = (ImageView) m_convertView.findViewById(R.id.text_drawable);
String firstLetterOfName = "A";
ColorGenerator generator = ColorGenerator.MATERIAL;
int color = generator.getRandomColor();
TextDrawable drawable = TextDrawable.builder()
.buildRound(firstLetterOfName, color);
accountImage.setBackground(drawable);
TextView title = ( TextView ) m_convertView.findViewById( R.id.txt_title );
TextView info = ( TextView ) m_convertView.findViewById( R.id.txt_info );
String itemTitle;
String productBrand = m_itemList.get( position ).getProductBrand().toString();
if ( !productBrand.isEmpty() ) {
itemTitle = productBrand + " " + m_itemList.get( position ).getProductName().toString();
} else {
itemTitle = m_itemList.get( position ).getProductName().toString();
}
title.setText( itemTitle );
String itemInfo;
String productAmount = m_itemList.get( position ).getProductAmount();
itemInfo = productAmount;
info.setText( itemInfo );
m_convertView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
if ( ((ListView)parent).isItemChecked(position) ) {
( ( ListView )parent ).setItemChecked( position, false );
v.setBackgroundColor(m_convertView.getResources().getColor(R.color.colorWhite));
} else {
( ( ListView )parent ).setItemChecked( position, true );
v.setBackgroundColor(m_convertView.getResources().getColor(R.color.colorSelectedItem));
}
return false;
}
});
return m_convertView;
}
}
答案 0 :(得分:0)
问题是 - 您希望什么时候取消选择?
理想情况下,长按一次后,即可进入单一选择模式。从病房的那一点开始,它应该处理点击(触摸)以切换选择(并且可选地改变颜色)
现在您已完成选择选择,您可能希望
如果是选项二,按下后退按钮(onBackPressed
)可能会有效。因为你可以编写你的逻辑清除所有选择(颜色和复选框)
如果您可以将该逻辑烘焙到自定义适配器中以实现可重用性,那么这可能是一个好主意。