Пользовательский ListView для Android с TableRow внутри.setOnclickListener? - PullRequest
1 голос
/ 08 декабря 2011

Я хотел бы получить представление об этой проблеме, пожалуйста. Я новичок в этом ListView. Мне удалось вставить данные из базы данных и установить идентификатор элемента списка на идентификатор записи в БД.

Все нормально при использовании android.R.layout.simple_list_item_1 для макета и android.R.id.text1 для TextView, где будет находиться мой текст. Я даже установил setOnItemClickListener и получил тост с правильными данными (положение элемента и _id, который я установил).

Чем я хотел использовать TableRow или TableLayout в качестве пользовательского макета для элементов списка. Это работает, но я не знаю, как получить ссылку на представления в TableRow (то есть в самой TableRow)?

setOnItemClickListener перестает работать, и я не могу использовать setOnclickListener в строке.

Можно ли каким-то образом использовать такую ​​технику, если я хочу получить POSITION и ID элемента ListView или мне следует использовать что-то более умное?

Это мой код:

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 Ответ

0 голосов
/ 12 декабря 2011

Кажется, что вы не можете ссылаться на TableLayout в ListView обычным способом, поэтому мне пришлось использовать LinearLayout, чтобы заставить onItemClick работать. Он даже дает вам несколько хороших аргументов для работы: parent, view, position и id, который я назначил Item с последним Sting (дополнительной строкой) в массиве.

Обратите внимание на 3 TextViews для параметра «to» и на то, что я использовал 4 строки в параметре «from». Последний является дополнительным, и это должен быть ключ " _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();
            }
        });
    }

}

И это тот 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>

Я надеюсь, что кто-то найдет это полезным, или КАК МОЖНО СКОРЕЕ сказать, что это не тот способ, если он знает лучший способ. Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...