Android - 从 GridView 中删除项目后激活状态保持为真
Android - Activated state remains true after deletion of item from GridView
我有一个包含一些卡片的 GridView。当我点击一张卡片时,它会突出显示(出现红色边框)。我有一个按钮,单击该按钮后,它会删除突出显示的卡片。但是,红色边框仍然保留在下一张卡片上。
What happens
What I want to happen
卡片的LinearLayout使用的选择器。
border_image_selector.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res/com.example.peridis.setfinder">
<item android:state_activated="true" app:state_lighted="true"
android:drawable="@drawable/border_image_lighted_activated"></item>
<item app:state_lighted="true" android:drawable="@drawable/border_image_lighted" ></item>
<item android:state_activated="true" android:drawable="@drawable/border_image_activated" ></item>
<item android:drawable="@drawable/border_image" ></item>
</selector>
CardsAdapter.java
public class CardsAdapter extends ArrayAdapter {
private Context context;
private ArrayList<Card> cards;
public static final int ONE_SHAPE = 0;
public static final int TWO_SHAPES = 1;
public static final int THREE_SHAPES = 2;
public CardsAdapter(@NonNull Context context,int resource, @NonNull ArrayList<Card> cardsArryaList) {
super(context, resource, cardsArryaList);
this.context=context;
cards = cardsArryaList;
}
@Override
public int getViewTypeCount() {
return 3;
}
@Override
public int getItemViewType(int position) {
return cards.get(position).getNumber() - 1;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
Card card = cards.get(position);
int cardNumber = getItemViewType(position);
LayoutInflater inflater = LayoutInflater.from(context);
int cardImageId = cards.get(position).getImageId(context);
if(convertView == null)
{
if(cardNumber == ONE_SHAPE)
{
convertView = inflater.inflate(R.layout.card_one_shape_layout, parent, false);
}
else if(cardNumber == TWO_SHAPES)
{
convertView = inflater.inflate(R.layout.card_two_shapes_layout, parent, false);
}
else//cardNumber == THREE_SHAPES
{
convertView = inflater.inflate(R.layout.card_three_shapes_layout, parent, false);
}
ImageView cardImage1 = (ImageView) convertView.findViewById(R.id.cardImage1);
ImageView cardImage2 = (ImageView) convertView.findViewById(R.id.cardImage2);
ImageView cardImage3 = (ImageView) convertView.findViewById(R.id.cardImage3);
holder = new ViewHolder();
holder.image1 = cardImage1;
holder.image2 = cardImage2;
holder.image3 = cardImage3;
convertView.setTag(holder);
}
else
{
holder = (ViewHolder) convertView.getTag();
}
holder.image1.setImageResource(cardImageId);
if(holder.image2 != null)
{
holder.image2.setImageResource(cardImageId);
}
if(holder.image3 != null)
{
holder.image3.setImageResource(cardImageId);
}
return convertView;
}
static class ViewHolder
{
ImageView image1;
ImageView image2;
ImageView image3;
}
}
主要 Activity 的一部分,我用于删除突出显示的卡片。
MainActivity.java
public class MainActivity extends AppCompatActivity {
ArrayList<Card> cards = new ArrayList<Card>();
GridView cardsContainerGridView;
CardsAdapter cardsAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
cardsContainerGridView = (GridView) findViewById(R.id.cardsGridContainer);
cardsAdapter = new CardsAdapter(this, R.id.cardImage1, cards);
cardsContainerGridView.setAdapter(cardsAdapter);
}
public void removeButtonClicked(View v)
{
for(int i=cardsContainerGridView.getChildCount()-1; i>=0; i--)
{
if(cardsContainerGridView.getChildAt(i).isActivated())
{
cards.remove(i);
}
}
cardsAdapter.notifyDataSetChanged();
}
我尝试在删除后将 ActivatedState 设置为 false,但没有用。
最后,我发现我可以在我的 GridView 上使用 clearChoices。
public void removeButtonClicked(View v)
{
for(int i=cardsContainerGridView.getChildCount()-1; i>=0; i--)
{
if(cardsContainerGridView.getChildAt(i).isActivated())
{
cards.remove(i);
}
}
cardsContainerGridView.clearChoices();
cardsAdapter.notifyDataSetChanged();
}
我有一个包含一些卡片的 GridView。当我点击一张卡片时,它会突出显示(出现红色边框)。我有一个按钮,单击该按钮后,它会删除突出显示的卡片。但是,红色边框仍然保留在下一张卡片上。
What happens
What I want to happen
卡片的LinearLayout使用的选择器。
border_image_selector.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res/com.example.peridis.setfinder">
<item android:state_activated="true" app:state_lighted="true"
android:drawable="@drawable/border_image_lighted_activated"></item>
<item app:state_lighted="true" android:drawable="@drawable/border_image_lighted" ></item>
<item android:state_activated="true" android:drawable="@drawable/border_image_activated" ></item>
<item android:drawable="@drawable/border_image" ></item>
</selector>
CardsAdapter.java
public class CardsAdapter extends ArrayAdapter {
private Context context;
private ArrayList<Card> cards;
public static final int ONE_SHAPE = 0;
public static final int TWO_SHAPES = 1;
public static final int THREE_SHAPES = 2;
public CardsAdapter(@NonNull Context context,int resource, @NonNull ArrayList<Card> cardsArryaList) {
super(context, resource, cardsArryaList);
this.context=context;
cards = cardsArryaList;
}
@Override
public int getViewTypeCount() {
return 3;
}
@Override
public int getItemViewType(int position) {
return cards.get(position).getNumber() - 1;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
Card card = cards.get(position);
int cardNumber = getItemViewType(position);
LayoutInflater inflater = LayoutInflater.from(context);
int cardImageId = cards.get(position).getImageId(context);
if(convertView == null)
{
if(cardNumber == ONE_SHAPE)
{
convertView = inflater.inflate(R.layout.card_one_shape_layout, parent, false);
}
else if(cardNumber == TWO_SHAPES)
{
convertView = inflater.inflate(R.layout.card_two_shapes_layout, parent, false);
}
else//cardNumber == THREE_SHAPES
{
convertView = inflater.inflate(R.layout.card_three_shapes_layout, parent, false);
}
ImageView cardImage1 = (ImageView) convertView.findViewById(R.id.cardImage1);
ImageView cardImage2 = (ImageView) convertView.findViewById(R.id.cardImage2);
ImageView cardImage3 = (ImageView) convertView.findViewById(R.id.cardImage3);
holder = new ViewHolder();
holder.image1 = cardImage1;
holder.image2 = cardImage2;
holder.image3 = cardImage3;
convertView.setTag(holder);
}
else
{
holder = (ViewHolder) convertView.getTag();
}
holder.image1.setImageResource(cardImageId);
if(holder.image2 != null)
{
holder.image2.setImageResource(cardImageId);
}
if(holder.image3 != null)
{
holder.image3.setImageResource(cardImageId);
}
return convertView;
}
static class ViewHolder
{
ImageView image1;
ImageView image2;
ImageView image3;
}
}
主要 Activity 的一部分,我用于删除突出显示的卡片。
MainActivity.java
public class MainActivity extends AppCompatActivity {
ArrayList<Card> cards = new ArrayList<Card>();
GridView cardsContainerGridView;
CardsAdapter cardsAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
cardsContainerGridView = (GridView) findViewById(R.id.cardsGridContainer);
cardsAdapter = new CardsAdapter(this, R.id.cardImage1, cards);
cardsContainerGridView.setAdapter(cardsAdapter);
}
public void removeButtonClicked(View v)
{
for(int i=cardsContainerGridView.getChildCount()-1; i>=0; i--)
{
if(cardsContainerGridView.getChildAt(i).isActivated())
{
cards.remove(i);
}
}
cardsAdapter.notifyDataSetChanged();
}
我尝试在删除后将 ActivatedState 设置为 false,但没有用。
最后,我发现我可以在我的 GridView 上使用 clearChoices。
public void removeButtonClicked(View v)
{
for(int i=cardsContainerGridView.getChildCount()-1; i>=0; i--)
{
if(cardsContainerGridView.getChildAt(i).isActivated())
{
cards.remove(i);
}
}
cardsContainerGridView.clearChoices();
cardsAdapter.notifyDataSetChanged();
}