2011-12-08 46 views
1

我希望對此問題有所瞭解。 我是這個ListView的新手。我設法從數據庫中輸入數據,並將列表項的標識設置爲數據庫記錄的標識。Android自定義ListView與TableRow之內。 setOnclickListener?

對佈局使用android.R.layout.simple_list_item_1和我的文本所在的TextView使用android.R.id.text1時,一切正常。 我甚至設置了setOnItemClickListener並得到了一個Toast whit正確的數據(項目位置和我設置的_id)。

比我想使用TableRow或TableLayout作爲列表項的自定義佈局。 這有效,但我不知道如何獲取TableRow中的視圖引用(即TableRow本身)?

setOnItemClickListener停止工作,我無法在該行上使用setOnclickListener。

如果我想獲得ListView項目的POSITION和ID,還是應該使用更智能的東西,是否有可能以某種方式使用這種技術?

這是我的代碼:

public class ListView1 extends ListActivity { 
    private DBAdapter db; 
    private Cursor getMatchigItems; 
    private OnItemClickListener listener; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 

       db = new DBAdapter(this); 
       db.open(); 
       getMatchigItems = db.getMatchingItems(4, 1); 
       startManagingCursor(getMatchigItems); 

//    SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, 
//      android.R.layout.simple_list_item_1, 
//      getMatchigItems, 
//      new String[]{db.KEYITEMS_TXTITEMNAME, db.KEYITEMS_ROWID}, 
//      new int[]{android.R.id.text1});    
//    setListAdapter(adapter); 

       SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, 
         R.layout.table_row, 
         getMatchigItems, 
         new String[]{db.KEYITEMS_TXTITEMNAME, db.KEYITEMS_ROWID}, 
         new int[]{R.id.textViewItems1});     
       setListAdapter(adapter); 

     ListView lv = getListView(); 
     lv.setTextFilterEnabled(true); 
     lv.setOnItemClickListener(listener); 

     lv.setOnItemClickListener(new OnItemClickListener() { 

      @Override 
      public void onItemClick(AdapterView<?> parent, View view, 
        int position, long id) { 

       Toast.makeText(getApplicationContext(), "id: " + String.valueOf(id) + "\npos: " + String.valueOf(position), Toast.LENGTH_SHORT).show(); 

      }; 
     });   
    } 
} 

而這正是佈局的TableRow我想用:

<?xml version="1.0" encoding="utf-8"?> 
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/tableRowLayout" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    > 

<TableRow 
    android:id="@+id/tableRowLayoutRow1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:background="@drawable/rowcat" 
    android:layout_marginTop="2dp" 
    android:minHeight="40dp" android:gravity="center_vertical"> 

    <View android:id="@+id/imagePlaceholderBlank1Items" 
      android:layout_width="40dp" 
      android:minHeight="40dp" android:layout_height="fill_parent" android:background="@drawable/editicon"/> 
    <TextView android:id="@+id/textViewItems1" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="Tule bo ime artikla" style="@style/whiteText" android:layout_marginLeft="10dp" android:ellipsize="marquee" android:lines="1" android:focusable="true" android:width="220dp" android:scrollHorizontally="true" android:marqueeRepeatLimit="marquee_forever" android:focusableInTouchMode="true"/> 
     <TextView android:id="@+id/imagePlaceholderButton1Items" 
      android:layout_width="wrap_content" 
      android:layout_height="fill_parent" 
      android:minHeight="40dp" 
      android:gravity="center" android:textColor="#FFF" android:background="@drawable/buttonoff" android:tag="off"/> 
</TableRow> 
</TableLayout> 

提前任何建議謝謝!

+1

你爲什麼使用TableLayout?使用水平LinearLayout可以更有效地實現您的佈局。 –

+0

是的,我認爲是。這個故事是我正在爲表中的某些錶行充氣。當我完成這個項目時,我發現Android需要花費大量的時間和精力才能充滿大約15行,所以現在我想保留儘可能多的工作,但是看起來我不會:)有可能在列表視圖項中點擊圖片時發生變化? – PacQ

回答

0

看來你不能以正常的方式在ListView中引用TableLayout,所以我不得不使用LinearLayout來獲取onItemClick的工作。 它甚至給你一些很好的參數來處理:父,視圖,位置和我已經分配給最後一個Sting(一個額外的字符串)在該項目中的ID的ID。

注意「to」參數的3個TextViews,以及我在「from」參數中使用了4個字符串。最後一個是額外的,它必須是數據庫表中的「_id」鍵。它被分配到物品ID。工作很好。

new String[]{db.KEYITEMS_TXTITEMNAME, db.KEYITEMS_INTIDCAT, db.KEYITEMS_ROWID, db.KEYITEMS_ROWID}, 
new int[]{R.id.text1,R.id.text2,R.id.text3}); 

這是整個活動:

public class ListView2 extends ListActivity { 
    private DBAdapter db; 
    private Cursor getMatchingItems; 
    private ListView lv; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.testview); 

     db = new DBAdapter(this); 
     db.open(); 
     getMatchingItems = db.getMatchingItems(3, 1); 
     startManagingCursor(getMatchingItems); 


     SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, 
       R.layout.testlistrow, 
       getMatchingItems, 
       new String[]{db.KEYITEMS_TXTITEMNAME, db.KEYITEMS_INTIDCAT, db.KEYITEMS_ROWID, db.KEYITEMS_ROWID}, 
       new int[]{R.id.text1,R.id.text2,R.id.text3});    
     setListAdapter(adapter); 

     lv = getListView(); 
     lv.setOnItemClickListener(new OnItemClickListener() { 

      @Override 
      public void onItemClick(AdapterView<?> arg0, View arg1, int position, 
        long myId) { 
       final ListView lvTest = getListView(); 
       final LinearLayout llTest = (LinearLayout) lvTest.getChildAt(position); 
       TextView tv1 = (TextView) llTest.findViewById(R.id.text1); 
       tv1.setText("CHANGE"); 
       tv1.setOnClickListener(new OnClickListener() { 

        @Override 
        public void onClick(View v) { 

         String s = llTest.getParent().toString(); 
         Toast.makeText(getApplicationContext(), s, Toast.LENGTH_SHORT).show(); 
        } 
       }); 
       String s = String.valueOf(lvTest.getChildAt(position)); 
       Toast.makeText(getApplicationContext(), s, Toast.LENGTH_SHORT).show(); 
      } 
     }); 
    } 

} 

這是我從this lovely lady borowed的XML。她爲SimpleAdapter解釋得很好。這僅僅是我SimpleCursorAdapter的一個週期。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    > 
<ListView android:id="@id/android:list" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:background="#000fff" 
    android:layout_weight="2" 
    android:drawSelectorOnTop="false"> 
    </ListView> 
<TextView android:id="@id/android:empty" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:background="#FFff00" 
    android:text="No data" 
    /> 
</LinearLayout> 

我希望有人能找到這個有用的,或儘快告訴我這不是來做到這一點,如果他們知道一個更好的辦法。 謝謝