Не удалось получить номер строки, по которой щелкнули, в виде списка Android - PullRequest
4 голосов
/ 30 декабря 2010

Я пытаюсь создать простое приложение для смс, для которого на странице редактирования перечислены все сохраненные смс. Я дал 2 кнопки в моем макете для редактирования и удаления, но когда я нажимаю на них, я не могу получить идентификатор строки (номер строки сверху), чтобы получить смс, соответствующий этой конкретной строке ... Кто-нибудь, пожалуйста, помогите мне .. мои смс адаптер ничего не расширяет .. Вот мой класс и xml файлы ..

public class SMSEdit extends ListActivity{

 private SMSDbAdapter mDbHelper;
 //private Button editsmsbtn, deletesmsbtn;

 public void onCreate(Bundle savedInstanceState) {

  super.onCreate(savedInstanceState);
    setContentView(R.layout.editsmslist);

    mDbHelper = new SMSDbAdapter(this);
    mDbHelper.open();
    fillData();

}

 public void fillData() {
     Cursor smsCursor = mDbHelper.fetchAllNotes();
     startManagingCursor(smsCursor);

     // Create an array to specify the fields we want to display in the list (only TITLE)
     String[] from = new String[]{SMSDbAdapter.KEY_TITLE,
       SMSDbAdapter.KEY_BODY, 
       SMSDbAdapter.KEY_DATE, 
       SMSDbAdapter.KEY_TIME};

     // and an array of the fields we want to bind those fields to (in this case just text1)
     int[] to = new int[]{R.id.smseditlistTO, 
       R.id.smseditlistMessage,
       R.id.smseditlistDay,
       R.id.smseditlistTime};

     // Now create a simple cursor adapter and set it to display
     SimpleCursorAdapter smsadap = 
         new SimpleCursorAdapter(this, R.layout.smsrow, smsCursor, from, to);
     setListAdapter(smsadap);

 }

  public void myEditClickHandler(View v) 
 {
  //get the row the clicked button is in
  LinearLayout vwParentRow = (LinearLayout)v.getParent();

  Button btnChild = (Button)vwParentRow.getChildAt(4);

  btnChild.setText("I've been clicked!");

  ListAdapter pos = getListAdapter();

  Intent intent = new Intent();
      intent.setClass(SMSEdit.this, SMS.class);
     // intent.putExtra(SMSDbAdapter.KEY_ROWID, id);

      startActivity(intent);
      finish();
 }
  public void myDeleteClickHandler(View v) 
 {

  //get the row the clicked button is in
  LinearLayout vwParentRow = (LinearLayout)v.getParent();

  //TextView child = (TextView)vwParentRow.getChildAt(0);
  Button btnChild = (Button)vwParentRow.getChildAt(5);
  //btnChild.setText(child.getText());
  btnChild.setText("I've been clicked!");

 int c = Color.CYAN;

   vwParentRow.setBackgroundColor(c); 
vwParentRow.refreshDrawableState();

         }
 }

editsmslist.xml - >>

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content">
<ListView android:id="@+id/android:list"
          android:layout_width="wrap_content"
         android:layout_height="wrap_content"/>
   <TextView android:id="@+id/android:empty"
          android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:text="No Future SMS Yet" android:textSize="35px"/>
</LinearLayout>

smsrow.xml - >>

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

<LinearLayout 
 android:id="@+id/LinearLayout02"
       android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
       android:orientation="vertical">
      <LinearLayout android:id="@+id/LinearLayout03"                      android:layout_width="wrap_content" android:layout_height="wrap_content">
            <TextView android:layout_height="wrap_content"                     android:layout_width="fill_parent" android:text="@string/smsdetailseditlist"       android:id="@+id/smseditlistTO" android:paddingLeft="5px">
              </TextView>

               <TextView android:layout_height="wrap_content"     android:text="@string/smsdetailseditlist" android:id="@+id/smseditlistMessage"        android:paddingLeft="20px" android:maxLines="1" android:layout_width="wrap_content">
            </TextView>
</LinearLayout>

       <LinearLayout android:id="@+id/LinearLayout01" 
         android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
       android:orientation="horizontal" android:paddingLeft="5px">

         <TextView android:layout_width="wrap_content"       android:layout_height="wrap_content" android:text="Date: "></TextView><TextView                 android:text="@string/smsdetailseditlist" android:id="@+id/smseditlistDay"          android:layout_width="wrap_content" android:layout_height="wrap_content"></TextView>
            <TextView android:layout_width="wrap_content"               android:layout_height="wrap_content" android:text="Time: " android:paddingLeft="5px">               </TextView><TextView android:text="@string/smsdetailseditlist"                 android:id="@+id/smseditlistTime" android:layout_width="wrap_content"                android:layout_height="wrap_content" android:paddingRight="10px"></TextView>
            <Button  android:layout_width="wrap_content"          android:layout_height="wrap_content" android:id="@+id/EditSMSButton"          android:text="@string/editsms" android:onClick="@string/myEditClickHandler"></Button>
            <Button android:layout_width="wrap_content"        android:layout_height="wrap_content" android:id="@+id/DeleteSMSButton"            android:text="@string/deletesms" android:onClick="@string/myDeleteClickHandler"></Button>
         </LinearLayout>
       </LinearLayout>
      </ScrollView>

Также, пожалуйста, предложите, если есть лучший способ реализовать это или сделать внешний вид лучше ...

Ответы [ 3 ]

1 голос
/ 25 декабря 2011

Вы можете расширить курсор Адаптер, как это ...

public class exampleAdapter extends CursorAdapter
 {
     LayoutInflater inflater; 
    public exampleAdapter (Context context, Cursor c) {
        super(context, c);
        inflater = LayoutInflater.from(context);
    }

    @Override
    public void bindView(View view, Context context, Cursor cursor) {
        // TODO Auto-generated method stub
        Button btn_del = (Button)view.findViewById(R.id.button1);
btn_del.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                SMSDbAdapter vb = new SMSDbAdapter(context);
                vb.open();
                String xyz = cursor.getString(0); //Persumably your ID

                vb.Delete(Integer.parseInt(cursor.getString(0)));
                Toast.makeText(context, xyz + " Deleted!", Toast.LENGTH_SHORT).show();
                vb.close(); 

            }
        });


    }

    @Override
    public View newView(Context context, Cursor cursor, ViewGroup parent) {

        return inflater.inflate(R.layout.smsrow, parent, false);

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

Вы должны использовать ListView для отображения ваших сообщений.

Хранить данные, полученные из базы данных, в массиве строк, скажем, s1.Затем

private ArrayList<String> arr_sort = new ArrayList<String>(); И скопируйте весь s1 в arr_sort с помощью метода add ().

При настройке адаптера

lv.setAdapter(new ArrayAdapter<String>(DataAttach.this, android.R.layout.simple_list_item_1, arr_sort)); где lv - ссылка ListView.

Затем используйте этот метод для onClick

lv.setOnItemClickListener(new android.widget.AdapterView.OnItemClickListener() {
                public void onItemClick(AdapterView<?> parent, View view,
                        int position, long id) {
                    String item = (String) lv.getItemAtPosition(position);

                    Toast.makeText(*.this,
                            "You selected - " + item + " ,Please wait...",
                            Toast.LENGTH_LONG).show();

                    Intent intent = new Intent(*.this, *.class);
                    *.this.startActivity(intent);
                }
            });

Надеюсь, это поможет ..

0 голосов
/ 09 августа 2011

У меня была похожая проблема с моим ListView.

Предположим, что вы заполняете ListView динамически. У вас есть 5 строк (например). Идентификатор первой строки: 1 секунда, 2, и т. Д.

Когда вы прокручиваете все строки, которые вам видны, идентификатор 1-й строки (которую вы сейчас видите на экране) всегда будет равен 1. Вы должны контролировать это с помощью mabye другого класса (XYZ).

Я просто использовал ArrayList<XYZ>, и это сработало.

Вы можете переопределить этот метод в вашем SMSAdapter:

public View getView(int position, View convertView, ViewGroup parent) 

и затем вызовите метод get(position), который возвращает ArrayList<XYZ>.

...