2015-08-28 78 views
0

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

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); 
    } 


} 

回答

1

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

+0

它运作良好,但意见被回收,因此如预期,如果项目的顺序是由用户或当光标被交换改变了它不表现。 –

+0

如果这是问题,那么只需创建一个POJO并具有一个布尔值来检查是否选择了行项目,如果选择了任何行项目,则将该标志的值设置为true,并将其设置为true该行项目。如果不是,则setSelected为false。 类似于 if(POJO.isSelected){ view.setSelected(true); } else { view.setSelected(false); } –

+0

它工作!我检查了'onBindView()'是否检查了该项目,现在它运行良好。谢谢! –

1
  • 你可以做下面的代码片段。

  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(); 
       } 
      } 
相关问题