2012-11-26 167 views
0

我用下面的代碼創建自定義列表視圖....但是這個代碼的問題它只選擇一個項目..但突出顯示許多項目...我的意思是..例如..如果我有8個項目在列表中..而我只能看到3個項目(其餘我必須滾動查看)..如果我點擊第一個項目......它會突出顯示在第四和第7項...更改自定義列表視圖中列表項的背景顏色

public class MainMenu extends Activity { 
    ListView lmenu; 
    View v1; 
    String s; 
    Class<?> ourclass; 
    View layout, row; 
    static int trantype; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.menulist); 

     Menu Menu_data[] = new Menu[] { new Menu("1.White"), 
       new Menu("2.Blue"), new Menu("3.Purple"), new Menu("4.Red"), 
       new Menu("5.Yellow"), new Menu("6.Black"), new Menu("6.Black"), 
       new Menu("6.Black"), new Menu("6.Black"), new Menu("6.Black"), 
       new Menu("6.Black"), new Menu("6.Black") }; 

     MenuAdapter adapter = new MenuAdapter(this, R.layout.menutext, 
       Menu_data); 
     lmenu = (ListView) findViewById(R.id.mainmenu); 

     lmenu.setAdapter(adapter); 

     lmenu.setOnItemClickListener(new OnItemClickListener() { 

      public void onItemClick(AdapterView<?> ada, View v, int position, 
        long id) { 
       // TODO Auto-generated method stub 

       /* 
       * v.setBackgroundColor(Color.parseColor("#FCD5B5")); if (!(v1 
       * == null) && v1 != v) 
       * v1.setBackgroundColor(Color.parseColor("#EEEEEE")); v1 = v; 
       */ 
       Intent swipeit = new Intent(getBaseContext(), Swipeit.class); 
       trantype = position + 1; 
       startActivity(swipeit); 
      } 
     }); 

     findViewById(R.id.BLogout).setOnClickListener(new OnClickListener() { 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       finish(); 
      } 
     }); 
    } 

    public class Menu { 
     public String title; 

     public Menu() { 
      super(); 
     } 

     public Menu(String title) { 
      super(); 
      this.title = title; 
     } 
    } 

    public class MenuAdapter extends ArrayAdapter<Menu> { 

     Context context; 
     int layoutResourceId; 
     Menu data[] = null; 
     LayoutInflater inflater; 
     boolean[] arrBgcolor; 
     private int activeHex, inactiveHex; 

     public MenuAdapter(Context context, int layoutResourceId, Menu[] data) { 
      super(context, layoutResourceId, data); 
      this.layoutResourceId = layoutResourceId; 
      this.context = context; 
      this.data = data; 
      activeHex = Color.parseColor("#FCD5B5"); 
      inactiveHex = Color.parseColor("#EEEEEE"); 

      inflater = (LayoutInflater) context 
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      arrBgcolor = new boolean[13]; 
     } 

     @Override 
     public View getView(final int position, final View convertView, 
       ViewGroup parent) { 
      try { 
       MenuHolder holder = null; 
       row = convertView; 
       // convertView.setBackgroundColor(Color.BLACK); 
       if (row == null) { 
        LayoutInflater inflater = ((Activity) context) 
          .getLayoutInflater(); 
        row = inflater.inflate(layoutResourceId, parent, false); 
        holder = new MenuHolder(); 
        holder.txtTitle = (TextView) row.findViewById(R.id.tv1); 
        row.setTag(holder); 
       } else { 
        holder = (MenuHolder) row.getTag(); 
       } 

       Menu Menu = data[position]; 
       holder.txtTitle.setText(Menu.title); 
       holder.txtTitle.setOnClickListener(new OnClickListener() { 

        public void onClick(View v) { 
         // TODO Auto-generated method stub 
         resetArrbg(); 
         arrBgcolor[position] = true; 
         if (arrBgcolor[position]) { 
          row.setBackgroundColor(activeHex); 
         } else { 
          row.setBackgroundColor(inactiveHex); 
         } 
         notifyDataSetChanged(); 
        } 
       }); 
      } catch (Exception e) { 
       Toast.makeText(getApplicationContext(), String.valueOf(e), 
         Toast.LENGTH_LONG).show(); 
      } 
      return row; 
     } 

     private void resetArrbg() { 
      for (int i = 0; i < arrBgcolor.length; i++) { 
       arrBgcolor[i] = false; 
      } 
     } 

     public class MenuHolder { 
      TextView txtTitle; 
     } 
    } 
} 

我的XML包含列表...

<include 
     android:id="@+id/header" 
     android:layout_alignParentTop="true" 
     layout="@layout/header" /> 

    <RelativeLayout 
     android:id="@+id/Rlmain" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_below="@+id/header" 
     android:orientation="vertical" > 

     <TextView 
      android:id="@+id/TMain" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_centerVertical="true" 
      android:layout_marginBottom="8dp" 
      android:layout_marginLeft="10dp" 
      android:layout_marginTop="8dp" 
      android:text="Main Menu" 
      android:textColor="#000000" 
      android:textSize="15dp" /> 

     <View 
      android:id="@+id/Vtop" 
      android:layout_width="fill_parent" 
      android:layout_height="2dp" 
      android:layout_below="@+id/TMain" 
      android:background="@android:color/darker_gray" /> 
    </RelativeLayout> 

    <RelativeLayout 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:layout_above="@+id/Vbot" 
     android:layout_below="@+id/Rlmain" 
     android:orientation="vertical" > 

     <ListView 
      android:id="@+id/mainmenu" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:background="#E0E0E0" 
      android:cacheColorHint="#00000000" 
      android:divider="@android:color/transparent" 
      android:dividerHeight="20dp" > 
     </ListView> 
    </RelativeLayout> 

    <View 
     android:id="@+id/Vbot" 
     android:layout_width="fill_parent" 
     android:layout_height="2dp" 
     android:layout_above="@+id/textView1" 
     android:background="@android:color/darker_gray" /> 

    <TextView 
     android:id="@+id/textView1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentBottom="true" 
     android:layout_centerHorizontal="true" 
     android:text="© India Transact Services Ltd." 
     android:textColor="#000000" 
     android:textSize="15dp" /> 

</RelativeLayout> 

我的xml列表....

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/LLtv" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:background="#EEEEEE" 
    android:cacheColorHint="#00000000" > 

    <TextView 
     android:id="@+id/tv1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center_vertical" 
     android:paddingBottom="12dp" 
     android:paddingTop="12dp" 
     android:textColor="#000000" 
     android:textSize="20dp" /> 

</LinearLayout> 

請任何人都可以幫助我,告訴我哪裏出錯了嗎?

回答

1

你想用你當前的設置無法實現的。您需要在可以訪問getView()方法的地方實施自定義適配器。由於在答案here中做得更清楚的原因,您需要做的是使用某種數據容器,它將使用某個指標來保存單個行的狀態,然後根據它在容器上的位置執行您的操作(它應該對應其對列表視圖位置)

例如,看看這個重寫:

protected void onListItemClick(ListView l, View v, int position, long id) { 
    super.onListItemClick(l, v, position, id); 

    resetArrbg(); 
    arrBgcolor[position] = true; 
    if (arrBgcolor[position]) { 
     v.setBackgroundColor(Color.parseColor("#FCD5B5")); 
    } else { 
     v.setBackgroundColor(Color.BLUE);   
    } 
} 

boolean[] arrBgcolor = new boolean[list.size()]; 

private void resetArrbg() { 
    for (int i = 0; i < arrBgcolor.length; i++) { 
     arrBgcolor[i] = false; 
    } 
} 

是否有意義,現在爲什麼不能用目前的設置工作?該方法的一部分else影響其他視圖的部分永遠不會發生,因爲您無法訪問onListItemClick方法中的其他位置,但您可以在getView()中執行此操作。這當然是,除非你知道解決這個問題的方法,那麼無論如何,對你來說更多的權力。所有相同的我不認爲v1技術你有什麼好處。

編輯:

public class MainActivity extends Activity { 
    ListView lmenu; 
    View v1; 
    String s; 
    Class<?> ourclass; 
    View layout, row; 
    static int trantype; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.menulist); 

     Menu Menu_data[] = new Menu[] { new Menu("1.White"), 
       new Menu("2.Blue"), new Menu("3.Purple"), new Menu("4.Red"), 
       new Menu("5.Yellow"), new Menu("6.Black"), new Menu("6.Black"), 
       new Menu("6.Black"), new Menu("6.Black"), new Menu("6.Black"), 
       new Menu("6.Black"), new Menu("6.Black") }; 

     MenuAdapter adapter = new MenuAdapter(this, R.layout.menutext, Menu_data); 
     lmenu = (ListView) findViewById(R.id.mainmenu); 
     lmenu.setAdapter(adapter); 
    } 

    public class Menu { 
     public String title; 

     public Menu() { 
      super(); 
     } 

     public Menu(String title) { 
      super(); 
      this.title = title; 
     } 
    } 

    public class MenuAdapter extends ArrayAdapter<Menu> { 

     Context context; 
     int layoutResourceId; 
     Menu data[]; 
     LayoutInflater inflater; 
     boolean[] arrBgcolor; 
     private int activeHex, inactiveHex; 

     public MenuAdapter(Context context, int layoutResourceId, Menu[] data) { 
      super(context, layoutResourceId, data); 
      this.layoutResourceId = layoutResourceId; 
      this.context = context; 
      this.data = data; 


      activeHex = Color.parseColor("#FCD5B5"); 
      inactiveHex = Color.parseColor("#EEEEEE"); 

      inflater = (LayoutInflater) context 
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      arrBgcolor = new boolean[data.length]; 
      resetArrbg(); 
     } 

     @Override 
     public View getView(final int position, final View convertView, 
       ViewGroup parent) { 

      final MenuHolder holder; 
      row = convertView; 
      // convertView.setBackgroundColor(Color.BLACK); 
      if (row == null) { 
       row = inflater.inflate(layoutResourceId, parent, false); 
       holder = new MenuHolder(); 
       holder.txtTitle = (TextView) row.findViewById(R.id.tv1); 
       row.setTag(holder); 
      } else { 
       holder = (MenuHolder) row.getTag(); 
      } 

      Menu Menu = data[position]; 
      holder.txtTitle.setText(Menu.title); 


      if (arrBgcolor[position]) { 
       row.setBackgroundColor(activeHex); 
      } else { 
       row.setBackgroundColor(inactiveHex); 
      } 

      holder.txtTitle.setOnClickListener(new OnClickListener() { 

       public void onClick(View v) { 
        resetArrbg(); 
        arrBgcolor[position] = true; 
        notifyDataSetChanged(); 
       } 
      }); 

      return row; 
     } 

     private void resetArrbg() { 
      for (int i = 0; i < arrBgcolor.length; i++) { 
       arrBgcolor[i] = false; 
      } 
     } 

     public class MenuHolder { 
      TextView txtTitle; 
     } 
    } 
} 
+0

確定...我改變了代碼,現在我使用的是自定義的數組適配器,如圖所示在這裏「http://www.ezzylearning.com/tutorial.aspx? tid = 1763429「...但我對如何調用getview()方法感到困惑......如果我在onCreate()中調用onitemclick(),那麼它的參數是什麼? – Audi

+0

您可以像您的教程一樣覆蓋自定義數組適配器中的getview方法。然後你在裏面創建一個點擊監聽器(爲了最直接的方式),並且把你的顏色改變代碼放在裏面。適配器將以這種方式完成所有操作,而onitemclick將與此無關。您不會調用getview,每次裝入新的listview行時都會自動調用getview。如果您沒有看到任何更改,請不要忘記notifydatasetchanged()。 – mango

+0

沒有人仍然是同樣的問題...我已經更新了我的代碼...是嗎?或者我仍然做錯了? – Audi

1

發生這種情況是因爲ListView在填充列表時重用視圖的方式。比方說,你在任何時候都會看到列表中的三行。你通過設置背景顏色(像你一樣)「突出顯示」第一行,然後向下滾動。當第一行離開屏幕時,Android會做一些聰明的事情。它不是爲第五行創建一個新的視圖,而是重用了第一行的視圖。那是你改變背景顏色的視圖,所以第五行現在得到了相同的背景顏色。只有數據被更改。

至於如何在所選行和所選行上實現不同的背景顏色,請查看answer。我相信你必須實現一個自定義的ListAdapter,至少如果你正在開發低於11的API級別。

相關問題