ListView项目的背景颜色未更改(通过DialogFragment中的接口)

时间:2017-03-24 20:55:59

标签: android listview

我想要完成的任务:

用户可以通过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();
    }
}

2 个答案:

答案 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();
}

}