我想要完成的任务:
用户可以通过DialogFragment在四个颜色选项中更改位于MainActivity中ListView中的项目的背景颜色。我用接口来完成这个任务;该接口在DialogFragment中创建,并在ListView本身的适配器类中的ViewHolder中实现。
我正在处理的事情:
当我从DialogFragment中选择一种颜色时,它 为我在列表中创建的每个新项目设置指定的背景颜色,但是不是已经存在的那些,或(换句话说)在我选择新颜色之前创建的那些。
代码: DialogFragment:
// Interfaces...
public interface SetBlueColorListener {
void setBlueColorListener(View v);
}
public interface SetRedColorListener {
void setRedColorListener(View v);
}
public interface SetGreenColorListener {
void setGreenColorListener(View v);
}
public interface SetOrangeColorListener {
void setOrangeColorListener(View v);
}
// Setting interfaces...
public void setBlueColorListener(SetBlueColorListener setBlueColorListener) {
mSetBlueColorListener = setBlueColorListener;
}
public void setRedColorListener(SetRedColorListener setRedColorListener) {
mSetRedColorListener = setRedColorListener;
}
public void setGreenColorListener(SetGreenColorListener setGreenColorListener) {
mSetGreenColorListener = setGreenColorListener;
}
public void setOrangeColorListener(SetOrangeColorListener setOrangeColorListener) {
mSetOrangeColorListener = setOrangeColorListener;
}
public ColorDialogFragment() {}
private ImageView mBlueImageView;
private ImageView mRedImageView;
private ImageView mGreenImageView;
private ImageView mOrangeImageView;
private TextView mAcceptColorTextView;
private SetBlueColorListener mSetBlueColorListener;
private SetRedColorListener mSetRedColorListener;
private SetGreenColorListener mSetGreenColorListener;
private SetOrangeColorListener mSetOrangeColorListener;
private LinearLayout mLinearLayout;
ApplicationSettings mApplicationSettings;
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
final Context context = getActivity();
// Creating the builder...
AlertDialog.Builder builder = new AlertDialog.Builder(context);
View dialogView = getActivity().getLayoutInflater().inflate(R.layout.color_dialog, null);
builder.setView(dialogView);
// Initialize variables...
mBlueImageView = (ImageView) dialogView.findViewById(R.id.blueImageView);
mRedImageView = (ImageView) dialogView.findViewById(R.id.redImageView);
mGreenImageView = (ImageView) dialogView.findViewById(R.id.greenImageView);
mOrangeImageView = (ImageView) dialogView.findViewById(R.id.orangeImageView);
mAcceptColorTextView = (TextView) dialogView.findViewById(R.id.acceptColorTextView);
mLinearLayout = (LinearLayout) dialogView.findViewById(R.id.color_dialog);
// Creating the dialog...
final AlertDialog dialog = builder.create();
// SharedPreferences (defined in ApplicationSettings)
mApplicationSettings = new ApplicationSettings(context);
String color = mApplicationSettings.getColorPreference();
if (color.equals(ColorSettings.BLUE)) {
mLinearLayout.setBackgroundResource(R.color.defaultBlue);
mAcceptColorTextView.setBackgroundResource(R.drawable.blue_lists_selector_rectangle);
}
if (color.equals(ColorSettings.RED)) {
mLinearLayout.setBackgroundResource(R.color.defaultRed);
mAcceptColorTextView.setBackgroundResource(R.drawable.red_lists_selector_rectangle);
}
if (color.equals(ColorSettings.GREEN)) {
mLinearLayout.setBackgroundResource(R.color.defaultGreen);
mAcceptColorTextView.setBackgroundResource(R.drawable.green_lists_selector_rectangle);
}
if (color.equals(ColorSettings.ORANGE)) {
mLinearLayout.setBackgroundResource(R.color.defaultOrange);
mAcceptColorTextView.setBackgroundResource(R.drawable.orange_lists_selector_rectangle);
}
// OnClickListeners...
mBlueImageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mSetBlueColorListener.setBlueColorListener(view);
mLinearLayout.setBackgroundResource(R.color.defaultBlue);
mApplicationSettings.setColorPreference(ColorSettings.BLUE);
mAcceptColorTextView.setBackgroundResource(R.drawable.blue_lists_selector_rectangle);
}
});
mRedImageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mSetRedColorListener.setRedColorListener(view);
mLinearLayout.setBackgroundResource(R.color.defaultRed);
mApplicationSettings.setColorPreference(ColorSettings.RED);
mAcceptColorTextView.setBackgroundResource(R.drawable.red_lists_selector_rectangle);
}
});
mGreenImageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mSetGreenColorListener.setGreenColorListener(view);
mLinearLayout.setBackgroundResource(R.color.defaultGreen);
mApplicationSettings.setColorPreference(ColorSettings.GREEN);
mAcceptColorTextView.setBackgroundResource(R.drawable.green_lists_selector_rectangle);
}
});
mOrangeImageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mSetOrangeColorListener.setOrangeColorListener(view);
mLinearLayout.setBackgroundResource(R.color.defaultOrange);
mApplicationSettings.setColorPreference(ColorSettings.ORANGE);
mAcceptColorTextView.setBackgroundResource(R.drawable.orange_lists_selector_rectangle);
}
});
mAcceptColorTextView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
dialog.dismiss();
}
});
return dialog;
}
适配器:
private ArrayList<ListItem> mListsList;
private OpenDeleteDialogListClickListener mOpenDeleteDialogListClickListener;
public ListsAdapter(OpenDeleteDialogListClickListener deleteListClickListener, ArrayList<ListItem> list) {
mOpenDeleteDialogListClickListener = deleteListClickListener;
mListsList = list;
}
@Override
public ListViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.list_list_item, parent, false);
ListViewHolder viewHolder = new ListViewHolder(view);
return viewHolder;
}
@Override
public void onBindViewHolder(ListViewHolder holder, int position) {
holder.bindList(mListsList.get(position));
}
@Override
public int getItemCount() {
return mListsList.size();
}
public class ListViewHolder extends RecyclerView.ViewHolder implements ColorDialogFragment.SetBlueColorListener,
ColorDialogFragment.SetGreenColorListener, ColorDialogFragment.SetRedColorListener,
ColorDialogFragment.SetOrangeColorListener {
public TextView mListNameTextView;
public ImageView mDeleteListImageView;
ApplicationSettings mApplicationSettings;
public ListViewHolder(View itemView) {
super(itemView);
mListNameTextView = (TextView) itemView.findViewById(R.id.listNameTextView);
mDeleteListImageView = (ImageView) itemView.findViewById(R.id.deleteListImageView);
// SharedPreferences (defined in ApplicationSettings)
mApplicationSettings = new ApplicationSettings(itemView.getContext());
String color = mApplicationSettings.getColorPreference();
if (color.equals(ColorSettings.BLUE)) {
mListNameTextView.setBackgroundResource(R.drawable.blue_lists_selector_rectangle);
mDeleteListImageView.setBackgroundResource(R.drawable.blue_lists_selector);
}
if (color.equals(ColorSettings.RED)) {
mListNameTextView.setBackgroundResource(R.drawable.red_lists_selector_rectangle);
mDeleteListImageView.setBackgroundResource(R.drawable.red_lists_selector);
}
if (color.equals(ColorSettings.GREEN)) {
mListNameTextView.setBackgroundResource(R.drawable.green_lists_selector_rectangle);
mDeleteListImageView.setBackgroundResource(R.drawable.green_lists_selector);
}
if (color.equals(ColorSettings.ORANGE)) {
mListNameTextView.setBackgroundResource(R.drawable.orange_lists_selector_rectangle);
mDeleteListImageView.setBackgroundResource(R.drawable.orange_lists_selector);
}
mDeleteListImageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mOpenDeleteDialogListClickListener.openDeleteDialogListClickListener(view, getAdapterPosition());
}
});
}
public void bindList(ListItem item) {
mListNameTextView.setText(item.getListName());
}
@Override
public void setBlueColorListener(View v) {
mListNameTextView.setBackgroundResource(R.drawable.blue_lists_selector_rectangle);
mDeleteListImageView.setBackgroundResource(R.drawable.blue_lists_selector);
notifyDataSetChanged();
}
@Override
public void setRedColorListener(View v) {
mListNameTextView.setBackgroundResource(R.drawable.red_lists_selector_rectangle);
mDeleteListImageView.setBackgroundResource(R.drawable.red_lists_selector);
notifyDataSetChanged();
}
@Override
public void setGreenColorListener(View v) {
mListNameTextView.setBackgroundResource(R.drawable.green_lists_selector_rectangle);
mDeleteListImageView.setBackgroundResource(R.drawable.green_lists_selector);
notifyDataSetChanged();
}
@Override
public void setOrangeColorListener(View v) {
mListNameTextView.setBackgroundResource(R.drawable.orange_lists_selector_rectangle);
mDeleteListImageView.setBackgroundResource(R.drawable.orange_lists_selector);
notifyDataSetChanged();
}
}
答案 0 :(得分:1)
我会像onBindViewHolder
这样设置颜色:
@Override
public void onBindViewHolder(ListViewHolder holder, int position){
holder.mListNameTextView.setText(mListsList.get(position).getListName());
// Set the color
switch(mColor){
case "Blue":
holder.mListNameTextView.setBackgroundResource(R.drawable.blue_lists_selector_rectangle);
holder.mDeleteListImageView.setBackgroundResource(R.drawable.blue_lists_selector);
break;
case "Red":
holder.mListNameTextView.setBackgroundResource(R.drawable.red_lists_selector_rectangle);
holder.mDeleteListImageView.setBackgroundResource(R.drawable.red_lists_selector);
break;
default:
// Set whatever the default color should be
break;
}
}
然后在你的适配器内,但在你的ViewHolder之外,定义一个帮助函数,将颜色设置为一个字符串,如&#34; Blue&#34;或&#34;红色&#34;并通知适配器刷新:
public void setColor(String color){
mColor = color;
notifyDataSetChanged;
}
只要您使用适配器,只需拨打myAdapter.setColor("Blue")
即可将颜色更改为蓝色。
答案 1 :(得分:0)
我的假设,无需为所有颜色设置听众。
从Dialog获取最终颜色。这意味着用户可以选择多种颜色,但只能选择最后一种用户颜色。为此目的,使用Dialog Dismiss监听器。
ColorDialogFragment extends DialogFragment{
int color =-1;
//do your stuff for setting color
@Override
public void onDismiss(final DialogInterface dialog) {
super.onDismiss(dialog);
if(color != -1){
final Activity activity = getActivity();
if (activity instanceof ColorChangeListener) {
((ColorChangeListener)activity).onDismiss(dialog);
}
}
}
}
//定义一个界面
interface ColorChangeListener{
void onColorChange(int color);
}
您的活动代码
class YourActivity extends AppCompatActivity implements ColorChangeListener{
void onColorChange(int color){
//Now you got the color that you need. Do whatever you want
yourAdpater.notifyDataSetChanged();
}
}