Show/Hide 新添加的 ListView 项目上的 'new' 徽章

Show/Hide a 'new' badge on newly added ListView items

我有一个 ListView,我想在最近添加的列表项上显示一个 ImageView(新徽章)。

Like so: 所以我在我的模型中添加了一个布尔值 isNew class:

public class Item {
private String name;
private String profession;
private boolean isNew = true;

//Constructor
public Item(String name, String profession) {
    this.name = name;
    this.profession = profession;
}

//Getters
public String getName() {
    return name;
}

public String getProfession() {
    return profession;
}

public boolean isNew() {
    return isNew;
}

//Setters
public void setName(String name) {
    this.name = name;
}

public void setProfession(String profession) {
    this.profession = profession;
}

public void setNew(boolean aNew) {
    isNew = aNew;
} }

'new badge' 是一个 ImageView,它的可见性默认设置为 GONE。

然后,我在我的适配器中有一个 if 语句,用于检查特定项目的 isNew 布尔值是否为真,并基于它使 'new badge'(即 ImageView,VISIBLE)通过调用 ImageView.setVisibility()

public class ItemAdapter extends ArrayAdapter<Item> {
private List<Item> items;
private Context context;


public ItemAdapter(Context context, List<Item> items) {
    super(context, R.layout.single_list_item, items);
    this.context = context;
    this.items = items;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    LayoutInflater layoutInflater = LayoutInflater.from(context);
    View view = layoutInflater.inflate(R.layout.single_list_item, parent, false);

    //Binding the views from the single_item_layout
    TextView mName = view.findViewById(R.id.mName);
    TextView mProfession = view.findViewById(R.id.mProfession);
    ImageView new_badge = view.findViewById(R.id.new_badge);

    //Get the data from the List
    Item item = items.get(position);

    //Setting the data
    mName.setText(item.getName());
    mProfession.setText(item.getProfession());

    //Make 'new_badge' VISIBLE if the item is new
    if (item.isNew()){
        new_badge.setVisibility(View.VISIBLE);
    }

    //Return the view
    return view;
} }

然后在 main_activity 中我有一个 ListView OnItemClickListener 并且在其中我定义了当单击列表项时该特定项的布尔值设置为 false,然后我调用 adapter.notifyDataSetChanged()

public class MainActivity extends AppCompatActivity {
//ListView
private ListView mListView;

//ArrayList
static List<Item> items = new ArrayList<>();

//Adapter
ItemAdapter itemAdapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    //Initializing the ListView
    mListView = findViewById(R.id.mListView);

    //Adding Data to the ArrayList of items
    items.add(new Item("Danyl Fernandes", "Developer"));
    items.add(new Item("Henry Yuming", "Web Designer"));
    items.add(new Item("Ashley Janberg", " Park Naturalist"));
    items.add(new Item("Mary Almen", "Civil Drafter"));
    items.add(new Item("Carola Traino", "Insurance Appraiser"));
    items.add(new Item("Daniela Mocanu", "Infantry Officer"));
    items.add(new Item("Jaden Labuguen", "Surveyor"));
    items.add(new Item("Zaketa Nichola", "Petroleum Engineer"));

    //Initializing the Adapter
    itemAdapter = new ItemAdapter(this, items);

    //Set the Adapter to the ListView
    mListView.setAdapter(itemAdapter);

    //Handle ListItem Clicks
    mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
             Item item = (Item) mListView.getItemAtPosition(i);
             item.setNew(false);
             itemAdapter.notifyDataSetChanged();
        }
    });
} }

所以这工作正常,当点击任何项目时,NewBadge 消失 like so

但问题是 当我重新启动应用程序时,所有歌曲再次显示为新歌曲,即使是我已经点击过的歌曲显示 'new badge'

Here's a Github link to the entire project:

请帮忙! 谢谢

发生这种情况是因为每当您重新启动应用程序时,您总是在创建一组新的项目。一旦 class 被销毁,它就会清除所有临时数据。要查看项目中的更改,您必须保存它们并在用户单击项目时更改数据库中该项目的标志。

每次你再次启动应用程序时,所有项目都会是新的,因为你没有保存任何东西:)

我建议使用数据库来管理所有项目。这样你点新人的时候就可以保存了,'new'就不会再出现了。

如果我可以为此推荐一个库,请使用 Room

这是您的 table 模型的示例:

@Entity
public class Item
{
    @ColumnInfo(name = "Name")
    public String name;

    @ColumnInfo(name = "Profession")
    public String profession;

    @ColumnInfo(name = "New")
    public boolean new;
}