ListView Android中的不同颜色背景

时间:2014-07-30 18:45:46

标签: android listview colors

我按照教程制作了一个基本的记事本应用程序,因此我可以轻松使用ActionBar,Intents和其他Android基础知识。完成教程后,我一直在搞乱UI,允许用户为不同的音符分配背景颜色。 目前,当用户创建新笔记时,会出现InfoDialog菜单,并且用户选择新笔记背景的颜色。 颜色的选择被连接到用于在共享首选项中检索注释的键值,因此我可以分割键并在必要时重用选择值。

我目前正试图让我的主要活动的列表视图中的注释背景显示相同的背景颜色,但我不知道如何启动它。我已经看到很多关于从适配器使用getView的讨论,如果我将背景颜色选择传递给getView方法并使用if语句或switch case来设置列表背景,我觉得这样可以正常工作。

以下是该应用程序的一些相关代码:

public class NotePadd extends SherlockListActivity
{


private static final int EDITOR_ACTIVITY_REQUEST = 1001;
private static final int MENU_DELETE_ID = 1002;
private int currentNoteId;
private NoteDataSource dataSource;
private infoDialog info;
int bgChoice;

List<NoteItem> notes;


@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_note_padd);
    registerForContextMenu(getListView());

    dataSource = new NoteDataSource(this);

    refreshDisplay();

}

private void refreshDisplay()
{
    notes = dataSource.findAll();
    ArrayAdapter<NoteItem> adapter = new ArrayAdapter<NoteItem>    
    (this,R.layout.list_item_layout,notes);
    setListAdapter(adapter);
}



@Override
public boolean onCreateOptionsMenu(Menu menu)
{
    getSherlock().getMenuInflater().inflate(R.menu.note_padd, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item)
{
    if (item.getItemId()==R.id.action_create)
    {
        DialogFragment newFragment = new infoDialog();
        newFragment.show(getFragmentManager(), "info");

    }


    return super.onOptionsItemSelected(item);
}

protected void createNote()
{
    NoteItem note = NoteItem.getNew(bgChoice);
    Intent i = new Intent(this,NoteEditorActivity.class);
    i.putExtra("key",note.getKey());
    i.putExtra("text",note.getText());
    i.putExtra("bg", note.getbg());
    startActivityForResult(i, EDITOR_ACTIVITY_REQUEST);

}


@Override
protected void onListItemClick(ListView l, View v, int position, long id)
{
    NoteItem note = notes.get(position);

    String[] bgSplit = note.getKey().split("\\s");
    int bgTemp = Integer.parseInt(bgSplit[3]);

    Log.i("BGTEMP: ",bgSplit[3]);

    Intent i = new Intent(this,NoteEditorActivity.class);
    i.putExtra("key",note.getKey());
    i.putExtra("text",note.getText());
    i.putExtra("bg", bgTemp);
    startActivityForResult(i, EDITOR_ACTIVITY_REQUEST);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
    if(requestCode==EDITOR_ACTIVITY_REQUEST && resultCode==RESULT_OK)
    {
        NoteItem note = new NoteItem();
        note.setKey(data.getStringExtra("key"));
        note.setText(data.getStringExtra("text"));
        dataSource.update(note);
        refreshDisplay();
    }
}

@Override
public void onCreateContextMenu(ContextMenu menu, View v,
                                        ContextMenuInfo menuInfo)
{
    AdapterContextMenuInfo info = (AdapterContextMenuInfo) menuInfo;
    currentNoteId = (int)info.id;
    menu.add(0,MENU_DELETE_ID,0,"Delete");
}

@Override
public boolean onContextItemSelected(android.view.MenuItem item)
{
    if (item.getItemId()==MENU_DELETE_ID)
    {
        NoteItem note = notes.get(currentNoteId);
        dataSource.remove(note);
        refreshDisplay();
    }
    return super.onContextItemSelected(item);
}

// ----------------------infoDialog----------------------//

private class infoDialog extends DialogFragment
{

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) 
    {
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setTitle(R.string.color_prompt)
               .setItems(R.array.colors, new DialogInterface.OnClickListener() 
               {
                   public void onClick(DialogInterface dialog, int which) 
                   {
                      bgChoice = which;
                      createNote();
                      dialog.dismiss();

                   }
        });
        return builder.create();
    }

}
}

列出项目布局XML

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:gravity ="center_vertical"
    android:padding ="5dp"
    android:singleLine="true"
    android:textSize="20sp"
    android:ellipsize="end"
    android:drawableRight="@drawable/ic_noteitem_edit"
    android:background="@drawable/layout_bgblue">
</TextView>

还有一些活动和XML文件很乐意在必要时分享。我觉得getView()是我需要使用的,但我刚刚开始使用适配器。

2 个答案:

答案 0 :(得分:0)

必须为此重写ArrayAdapter的getView方法。

private TextView mNoteTextView; 
ArrayAdapter<NoteItem> adapter = new ArrayAdapter<NoteItem>(this,R.layout.list_item_layout,notes){
@Override
public View getView(int position, View convertView, ViewGroup parent){
     View v = super.getView(position,convertView,parent);
     mNoteTextView = (TextView)v;
     NoteItem item = getItem(position);
     int noteBG = item.getbg();
     mNoteTextView.setBackground(//get Drawable of the colour);
       //or
     mNoteTextView.setBackgroundColor(//the colour you want to set);
     return v;
    }
};

而不是调用refreshDisplay()来更新数据,而是调用:

void updateData(){
    ArrayAdapter<NoteItem> adapter = (ArrayAdapter<NoteItem>)getListAdapter();
    adapter.notifyDataSetChanged();
}

如果颜色保存在colors.xml文件中,则获取Drawable do:

getResources().getDrawable(R.colors.light_blue);

答案 1 :(得分:0)

是的,对于像这样的动态着色,每次调用时都需要在convertView内设置getView(...)的背景颜色。

有一点需要注意的是,您不会自己将任何内容传递给getView()方法,因为它会直接由ListView调用。您为适配器提供的对象需要提供颜色本身或一些可以映射到颜色的数据,以便您可以访问getView()内部。

对于处理多个陈述(按下等),您将需要使用代表每个州的颜色的StateListDrawable