2013-09-26 108 views
0

我是新来的android。 我搜索了网页,发现如何做一个简单的阵列适配器,它将以列表视图的形式显示设备上保存的所有联系人。代码运行良好,直到我被要求在后台执行代码。阵列适配器项目是背景相同的颜色

当我更新代码在AsyncTask中执行代码时,列表视图的项目添加了一个defalut白色作为背景颜色,您可以看到单击该项目时在行中写入的内容。

public class MainActivity extends Activity { 

    ListView lv; 
    ArrayAdapter<String> adapter; 
    public String num1; 
    ArrayList<String> arr = new ArrayList<String>(); 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     lv=(ListView) findViewById(R.id.listView1); 
     progress=(ProgressBar) findViewById(R.id.progressBar1); 

     new background().execute(); 
    public class background extends AsyncTask<String, Void, String>{ 

     @Override 
     protected String doInBackground(String... params) { 
      // TODO Auto-generated method stub 
      displayContacts(); 
      return "success"; 
     } 
     @Override 
     protected void onPostExecute(String result) { 
      Toast.makeText(getApplicationContext(), "Connection successfull "+result, Toast.LENGTH_SHORT).show(); 
      String [] values=arr.toArray(new String[arr.size()]); 
      adapter = new ArrayAdapter<String>(getApplicationContext(), 
        android.R.layout.simple_list_item_1, android.R.id.text1, values); 

      // Assign adapter to ListView 
      lv.setAdapter(adapter); 
      lv.setOnItemClickListener(new OnItemClickListener() { 

       @Override 
       public void onItemClick(AdapterView<?> parent, View view, 
         int position, long id) { 
         // ListView Clicked item index 
         int itemPosition  = position; 

         // ListView Clicked item value 
         String itemValue = (String) lv.getItemAtPosition(position); 

         // Show Alert 
         Toast.makeText(getApplicationContext(), 
         "Position :"+itemPosition+" ListItem : " +itemValue , Toast.LENGTH_LONG) 
         .show(); 
        } 

      }); 

      registerForContextMenu(lv); 
      progress.setVisibility(View.GONE); 
     } 

    } 
    @Override 
     public void onCreateContextMenu(ContextMenu menu, View v, 
       ContextMenuInfo menuInfo) { 

      super.onCreateContextMenu(menu, v, menuInfo); 
      AdapterContextMenuInfo aInfo = (AdapterContextMenuInfo) menuInfo; 

      // We know that each row in the adapter is a Map 
      String num= adapter.getItem(aInfo.position); 
      this.num1=num; 
      menu.setHeaderTitle("Options for " + num); 
      menu.add(1, 1, 1, "Send "); 
      menu.add(1, 2, 2, "Delete"); 

     } 

    public boolean onContextItemSelected(MenuItem item) { 
     int itemId = item.getItemId(); 
     // Implements our logic 
     // Toast.makeText(this, "Item id ["+itemId+"]", 
     // Toast.LENGTH_SHORT).show(); 
     if (itemId == 1) { 
      Toast.makeText(this, "number is:"+this.num1, Toast.LENGTH_LONG).show(); 
     } 
     return true; 
    } 
    private void displayContacts() { 
      ContentResolver cr = getContentResolver(); 
      Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, 
        null, null, null, null); 
      if (cur.getCount() > 0) { 
       while (cur.moveToNext()) { 
        String id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID)); 
        String name = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); 
        if (Integer.parseInt(cur.getString(
          cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) { 
         Cursor pCur = cr.query(
           ContactsContract.CommonDataKinds.Phone.CONTENT_URI, 
           null, 
           ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?", 
           new String[]{id}, null); 
         while (pCur.moveToNext()) { 
          String phoneNo = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 
    //      Toast.makeText(this, "Name: " + name + ", Phone No: " + phoneNo, Toast.LENGTH_LONG).show(); 
          arr.add(phoneNo); 
         } 
        pCur.close(); 
       } 
       } 
      } 
     } 

的displayContacts()将添加所有联系人,以将用于将要显示在列表视图中该ArrayList ARR。

我搜索了更改列表视图项目的文本颜色,但是仍然没有改变文本颜色。我能够仅更改列表项目行的背景颜色。

下面是一张图片,显示了如何在列表视图中创建6个项目,但是以白色作为背景,并且单击的项目显示项目行内的文本的内容。

Image showing 6 items of list view

的activity_main.xml中的代码是:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
tools:context=".MainActivity" > 

<ListView 
    android:id="@+id/listView1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentTop="true" /> 

<ProgressBar 
    android:id="@+id/progressBar1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentTop="true" /> 

</RelativeLayout> 
+0

你应用程序主题的任何机会是'黑'(或默认为黑暗)?只是因为你正在向适配器提供应用程序上下文而问。如果显示适配器的活动与全局应用程序主题具有不同的主题,则必须注意其副作用。 –

回答

0

您需要使用自定义适配器为您列表视图。这就是你如何设计你的列表视图的样式。您还可以为其他信息(如姓名)添加更多的textview。并为每个元素分配不同的颜色。

一个快速的解决方案检查以下问题并回答有关自定义适配器: Custom Adapter for List View

好运。

+0

在p.getId()和p.getCategory()。getId()和p.getDescription()中得到错误 是否有任何简单的适配器被澄清,因为我花了2周的时间来了解适配器的工作原理,直到现在我还没有没有任何理解:( – kingk110

+0

确定你的错误是他的适配器由Item类的对象组成,你的适配器由字符串组成,修改自定义适配器的字符串 – hasan83

+0

祝你好运学习:) – hasan83