如何让listview选中一个item元素?

How to make listview selected one item element?

我正在使用 BaseAdapter 处理自定义列表视图。在点击列表视图项目后,我遇到了一个小问题,特定行被突出显示,但在那之后,如果我点击另一个列表项目,它被突出显示,但仍然是旧的,它保持不变,它不会回到以前的状态。

我想一次看到一项 select。

MainActivity.java

if (musicRealmResults.get(currentIndex).isSelected() == false) {
    musicRealmResults.get(currentIndex).setIsSelected(true);

    playSong(currentIndex, true);

    adapter.notifyDataSetChanged();
} else {
    musicRealmResults.get(currentIndex).setIsSelected(false);
    adapter.notifyDataSetChanged();
}

MusicAdapter.java

if (musicRealmResults.get(position).isSelected()) {

    Typeface tf = Typeface.createFromAsset(mContext.getAssets(), "fonts/fonts_bold.otf");
    holder1.albumsTextView.setTypeface(tf);

    holder1.equalizerView.setVisibility(View.VISIBLE);
    holder1.albumsImageView.setVisibility(View.INVISIBLE);
    holder1.equalizerView.animateBars();
} else {
    Typeface tf = Typeface.createFromAsset(mContext.getAssets(), "fonts/fonts_regular.otf");
    holder1.albumsTextView.setTypeface(tf);

    holder1.equalizerView.setVisibility(View.GONE);
    holder1.albumsImageView.setVisibility(View.VISIBLE);
    holder1.equalizerView.stopBars();
}

请仔细阅读我的 post 并建议我如何在列表视图行中执行 select 和 deselect。

您似乎无法 setSelected(false) 上一个项目。 请检查 ListViewsetChoiceMode(),或者您可以将之前的项目重置为 setSelected(false)

public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
    musicRealmResults.get(currentSelected).setIsSelected(false); //Reset previous
     currentSelected = position; //Save currentPosition to for reset later
    .....todos
}

遍历所有数组元素并将检查状态设置为 false,然后将 currentIndex 设置为 true。

MainActivity

for(int i =0 ; i < musicRealmResults.size() ; ++i){
   musicRealmResults.get(i).setIsSelected(false);
}

musicRealmResults.get(currentIndex).setIsSelected(true);

playSong(currentIndex, true);

adapter.notifyDataSetChanged();

试试下面的代码:

 listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) 
        {
           if (musicRealmResults.get(position).isSelected() == false)
           {
              musicRealmResults.get(position).setIsSelected(true);

              playSong(position, true);

              adapter.notifyDataSetChanged();
           }
           else 
           {
              musicRealmResults.get(position).setIsSelected(false);
              adapter.notifyDataSetChanged();
           }

        }
    });

如果您不想遍历其余位置以取消选择,这也是一个不错的选择。

int prevSelection =-1; //nothing selected

listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                if (prevSelection==-1) //nothing selected
                    { 
                      musicRealmResults.get(position).setIsSelected(true);
                      adapter.notifyDataSetChanged();
                      prevSelection = position;
                   }else if (prevSelection == position) //deselect previously selected
                   {
                    musicRealmResults.get(position).setIsSelected(false);
                    adapter.notifyDataSetChanged();
                    prevSelection = -1;
               }else // Some other selection
                  {
                  musicRealmResults.get(prevSelection).setIsSelected(false);
                   musicRealmResults.get(position).setIsSelected(true);
                  adapter.notifyDataSetChanged();
                  prevSelection = position;
}

您可以在 model class 中进行管理。只需使用其 getter and setter 进行切换 Boolean isSelected,当用户点击列表项时检查其是否已被选中,如果未选中则将其标记为已选中并更新模型中的布尔值 class.

mListLayout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(list.get(position).getisSelected()){
                    // list item is already selected.
                    mListLayout.setBackgroundColor(Color.WHITE);  // normal color
                    list.get(position).setisSelected(false);
                }
                else{
                    // list item is not selected, make it selected
                    mListLayout.setBackgroundColor(Color.GRAY);  // selected color
                    list.get(position).setisSelected(true);
                }
                notifyDataSetChanged();
            }
        });