Android, как использовать адаптер для listView без расширения listActivity

У меня есть приложение с вкладками. На одной вкладке мне нужно поместить данные (строки) в строки. Для этого я выбрал tableLayout, но когда я хотел использовать contextmenu в своих строках, это не сработало.

Я могу показать contextmenu onLongClick, но проблема в том, что я не могу получить информацию о выбранной строке для редактирования или удаления выбранной строки. Затем я прочитал в обсуждении, что использование listView лучше, чем tablelayout, если у нас много строк. Но примеры, которые я видел, расширяют listactivity, но я не хочу этого делать.

Поэтому, когда я пытаюсь работать над listView без расширения listactivity, я не знаю, как это сделать, я имею в виду, что я никогда раньше не использовал listView, поэтому я пробую различные примеры, которые я нашел в Интернете, чтобы понять это, но это не работает. Вот что я сделал для listView:

String [] items=getRessources().getStringArray(R.arra.resolution);
 //Resolution is an array of strings
ListView lv=(ListeView) findViewById(R.id.listView);
v.setAdapter(new ArrayAdapter<string>(this, android.R.layout.simple_list_item_1, items);

Когда я его компилирую, я получаю список с элементами моего массива, но сначала я хочу изменить цвет текста, чего не могу. А во-вторых, я хочу динамически добавлять строки в список, что я тоже не знаю, как это сделать. Я думаю, что мне нужно использовать adapter, чтобы сделать это, но я не знаю, как это сделать. Может кто-нибудь, пожалуйста, проведите меня через это. Я просто хочу знать, как прикрепить свой список к adapter, что позволит мне динамически добавлять строки, добавлять contextMenu и т. д.


person Anila    schedule 25.11.2011    source источник
comment
Почему вы не хотите расширять ListActivity?   -  person kaspermoerch    schedule 25.11.2011
comment
@KasperMoerch на самом деле я новичок в разработке Android, и у меня уже есть проблемы с некоторыми элементами, я думал, что это создаст еще некоторые трудности.   -  person Anila    schedule 25.11.2011
comment
Если вы используете TabActivity, каждый Tab будет содержать Activity. Если Activity, который содержит список, который вы упомянули, имеет это в качестве своей основной цели, было бы намного проще просто расширить ListActivity. Если вы не хотите этого делать, вам нужно реализовать свой собственный Adapter для достижения упомянутой функциональности (вам все равно придется это сделать, если вы хотите иметь возможность добавлять элементы в список на лету) .   -  person kaspermoerch    schedule 25.11.2011
comment
@KasperMoerch спасибо за предложение   -  person Anila    schedule 25.11.2011


Ответы (3)


основной класс активности:

import java.util.ArrayList;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Button;
import android.widget.ListView;

public class SelectedActivity extends Activity {

private SelectedAdapter selectedAdapter;
private ArrayList<String> list;

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

    // populate the model - a simple a list
    list = new ArrayList<String>();
    list.add("Apple");
    list.add("Orange");
    list.add("Grape");
    list.add("Grape1");
    list.add("Grape2");
    list.add("Grape3");
    list.add("Grape4");
    list.add("Grape5");
    list.add("Grape6");

    // create our SelectedAdapter
    selectedAdapter = new SelectedAdapter(this,0,list);
    selectedAdapter.setNotifyOnChange(true);

    ListView listview = (ListView) findViewById(R.id.listExample);
    listview.setAdapter(selectedAdapter);

    listview.setOnItemClickListener(new OnItemClickListener() {
        //@Override
        public void onItemClick(AdapterView arg0, View view,
                                       int position, long id) {
            // user clicked a list item, make it "selected"
            selectedAdapter.setSelectedPosition(position);
        }
    });
}

Класс адаптера:

   import java.util.List;
    import android.content.Context;
    import android.graphics.Color;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.ArrayAdapter;
    import android.widget.Button;
    import android.widget.TextView;

    public class SelectedAdapter extends ArrayAdapter{

        // used to keep selected position in ListView
        private int selectedPos = -1;   // init value for not-selected

        public SelectedAdapter(Context context, int textViewResourceId,
                       List objects) {
             super(context, textViewResourceId, objects);
        }
        public void setSelectedPosition(int pos){
        selectedPos = pos;
             // inform the view of this change
             notifyDataSetChanged();
        }
        public int getSelectedPosition(){
             return selectedPos;
        }
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
                 View v = convertView;
                 // only inflate the view if it's null
                 // if (v == null) {
                        LayoutInflater vi =   (LayoutInflater)this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                        v = vi.inflate(R.layout.selected_row, null);
                 //  }

                 // get text view
                     TextView label = (TextView)v.findViewById(R.id.txtExample);
                     Button btn=(Button)v.findViewById(R.id.btn1);

                     // change the row color based on selected state
                     if(selectedPos == position){
                        label.setBackgroundColor(Color.CYAN);
                        btn.setBackgroundResource(R.drawable.next);
                     }
                     else{
                        label.setBackgroundColor(Color.WHITE);
                     }

                     label.setText(this.getItem(position).toString());       
                     return(v);
        }
}
person Chirag Patel    schedule 25.11.2011
comment
Большое спасибо за ответ только на один вопрос, на что ссылается selected_Row в vi.inflate(R.layout.selected_row, null). - person Anila; 25.11.2011
comment
Тот же вопрос для selected_example. Это макеты, которые вы создали? Если да, то что они содержат? - person Anila; 25.11.2011
comment
Хорошо, я создал два макета: один с listView, а другой с кнопкой и testView, и я не получаю ошибок компиляции, но ничего не происходит, когда я нажимаю строку. :с - person Anila; 25.11.2011

основной.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@drawable/bg8"
    android:id="@+id/RootView"
    >
        <LinearLayout android:id="@+id/myLayout"
            android:layout_width="wrap_content"
            android:layout_height="fill_parent">
       </LinearLayout>

</LinearLayout>

Вам нужно определить xml, который будет использоваться для хранения данных каждой строки:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" android:weightSum="1">

   <TableRow
       android:id="@+id/tableRow1"
       android:layout_width="793dp"
       android:layout_height="wrap_content"
       android:layout_weight="0.23" >

        <TextView android:id="@+id/col1"
            android:layout_height="fill_parent"
            android:layout_width="wrap_content"
            android:width="50dp"
           android:textSize="18sp"

        />
        <TextView android:id="@+id/col2"
            android:layout_height="fill_parent"
            android:layout_width="wrap_content"
            android:width="150dp"
            android:textSize="18sp"
        />
      <ImageView android:id="@+id/editimage"
            android:background="@drawable/edit"
            android:clickable="true"
            android:onClick="ClickHandlerForEditImage" 
            android:layout_width="35dp" 
         android:layout_height="35dp"/>  

    </TableRow>

</LinearLayout>

В приведенный выше xml я также включил ImageView, на самом деле это не требуется, но это просто для того, чтобы сообщить вам, что мы также можем включить другие элементы управления.

и, наконец, у вас должна быть функция в вашем родственном классе:

private void LoadData()
{

    DBAdapter db = new DBAdapter(this);
    db.open();
    Cursor cur = db.GetData();
    private ListView lv = (ListView)findViewById(R.id.myLayout);
    lv.setAdapter(null);
    if(cur.moveToFirst())
    {
            String[] from = new String[] {"_id","column1"};
            int[] to = new int[] {R.id.col1, R.id.col2};
            SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,R.layout.grid_item, cur, from, to);
            lv.setAdapter(adapter);  

     }
       db.close();
         }
}
person Yaqub Ahmad    schedule 25.11.2011

Похоже, что никто не ответил на ваш вопрос contextMenu. Чтобы контекстное меню работало со списком, после вызова ListView yourList = getListView(); необходимо вызвать registerForContextMenu(yourList);

И для обработки создания меню вы должны реализовать метод

@Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo){ 
super.onCreateContextMenu(context, v,menuInfo);
MenuInflater inflater = getMenuInflater();
menu.setHeaderTitle("YOUR TITLE");
menu.setHeaderIcon(R.drawable.YOUR DRAWABLE);
inflater.inflate(R.menu.YOUR_MENU_RESOURCE, menu);
}

Затем вы можете реагировать на клики, внедряя метод

@Override public boolean onContextItemSelected(MenuItem item){
switch(item.getItemId()){
case R.id.YOUR_MENU_ITEM: // do stuff if the item is selected
 return true;
case R.id.YOUR_MENU_ITEM: // do stuff if the item is selected
 return true;
case R.id.YOUR_MENU_ITEM: // do stuff if the item is selected
 return true;
 }
 return false; // nothing selected
}
person kandroidj    schedule 31.08.2012