【问题标题】:Highlight selected item on a RecyclerView突出显示 RecyclerView 上的选定项目
【发布时间】:2015-12-11 18:00:23
【问题描述】:

我的应用由两个片段组成(我们称它们为 A 和 B)。 Fragment A 显示 RecyclerView, Fragment B 显示该 Recycler 上所选项目的内容。在小屏幕和普通屏幕上,每个 Fragment 都显示在其 Activity 上,但在大屏幕上,两个 Fragment 同时显示,所以我希望在多窗格 Activity 中,当用户单击 RecyclerView 中的项目时,它会突出显示。我在 StackOverflow 上发现了很多这样的问题,但它们不适用于我的适配器。

final FragmentCallback activity;
final FragmentA fragment; //The fragment with the RecyclerView

Cursor cursor;
int idColumnIndex;
int titleColumnIndex;
int balanceColumnIndex;

public MoneyboxesAdapter(FragmentCallback activity, FragmentA frag){
    this.activity = activity;
    this.fragment = frag;
}

public void swapCursor(Cursor c){
    // Method called whenever the data stored on the DB has changed
    this.cursor = c; //Updates the current cursor
    if(cursor!=null){
        cursor.moveToFirst();
        idColumnIndex = cursor.getColumnIndex(MoneyboxProvider.COLUMN_MONEYBOX_ID);
        titleColumnIndex = cursor.getColumnIndex(MoneyboxProvider.COLUMN_MONEYBOX_TITLE);
        balanceColumnIndex = cursor.getColumnIndex(MoneyboxProvider.COLUMN_MONEYBOX_BALANCE);
    }
    notifyDataSetChanged();
}

@Override
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
    CardView v = (CardView) LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.moneybox_item, viewGroup, false);
    return new ViewHolder(v);
}

@Override
public void onBindViewHolder(final ViewHolder viewHolder, final int i) {

    // Sets up the views
    cursor.moveToPosition(i);
    final long id = getItemId(i);
    final String moneyboxTitle = cursor.getString(titleColumnIndex);
    final float balance = cursor.getFloat(balanceColumnIndex);
    viewHolder.title.setText(moneyboxTitle);
    viewHolder.balance.setText(balance);


    viewHolder.cardView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            activity.onLoadMoneybox(id);
            //TODO: Show selected on multipane
        }

    });


}

@Override
public int getItemCount() {
    return cursor!=null?cursor.getCount():0;
}

public long getItemId(int position){
    // Gets the ID in the DB of a moneybox
    cursor.moveToPosition(position);
    return cursor.getLong(idColumnIndex);
}


static class ViewHolder extends RecyclerView.ViewHolder{

    CardView cardView;
    TextView title;
    TextView balance;
    ImageView threeDots;

    public ViewHolder(CardView itemView) {
        super(itemView);
        cardView = itemView;
        title = (TextView) itemView.findViewById(R.id.moneybox_item_title);
        balance = (TextView) itemView.findViewById(R.id.moneybox_item_balance);
        threeDots = (ImageView)itemView.findViewById(R.id.three_dots_moneybox);
    }


}

【问题讨论】:

    标签: android android-sqlite android-recyclerview


    【解决方案1】:

    为列表项创建一个选择器并设置view.setSelected(true);对于已选择的特定位置,并跟踪最后选择的视图,如果用户单击新行项目,则将其设置为 false。

    【讨论】:

    • 它运行良好,但视图被回收,因此如果用户更改项目的顺序或交换光标时,它不会按预期运行。
    • 如果是这个问题,那么只需创建一个 POJO 并有一个布尔值来检查是否选择了行项目,如果选择了任何行项目,则将标志的值设置为 true并将该行项目的 selected 设置为 true 。如果不是,则 setSelected 为 false。类似 if (POJO.isSelected) { view.setSelected(true); } 其他 { view.setSelected(false); }
    • 成功了!我检查了onBindView() 是否检查了该项目,现在它运行良好。谢谢!
    【解决方案2】:
    • 你可以像下面的 sn-p 那样做。

                class ViewHolder extends RecyclerView.ViewHolder implements OnClickListener {
    
                    public ViewHolder(View view) {
                        // your code
                        view.setOnClickListener(this)
                    }
    
                    @Override
                    public void onClick(View v) {
                        int position = getPosition();
                        // your changes for changing color
                        notifyDataSetChanged();
                    }
                }
    

    【讨论】:

      猜你喜欢
      • 2014-12-21
      • 1970-01-01
      • 2015-01-27
      • 1970-01-01
      • 2021-08-22
      • 1970-01-01
      • 2017-04-01
      • 2023-03-25
      • 1970-01-01
      相关资源
      最近更新 更多