【问题标题】:Not able to get the clicked row number in list view of android无法在android的列表视图中获取单击的行号
【发布时间】:2010-12-30 05:27:08
【问题描述】:

我正在尝试构建一个简单的短信应用程序,该应用程序的编辑页面列出了所有已保存的短信。我在我的布局中为编辑和删除提供了 2 个按钮,但是当我单击它们时,我无法获取 rowid(顶部的行号)来检索与该特定行相对应的短信。有人请帮助我..我的短信适配器没有扩展任何东西..这是我的类和 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>

另外请建议是否有更好的方法来实现这一点或使布局看起来更好......

【问题讨论】:

    标签: android listview android-layout android-listview listactivity


    【解决方案1】:

    你可以像这样扩展一个 cursorAdapter...

    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);
    
        }        
     }
    

    【讨论】:

      【解决方案2】:

      我的ListView 也有类似的问题。

      假设您正在动态填写ListView。您有 5 行(例如)。第一行的id是1秒是2,以此类推。

      当您滚动任何对您可见的行时,第一行的 id(您当前在屏幕上看到的)将始终为 1。您需要通过使用其他类 (XYZ) 来控制它。

      我只是使用了ArrayList&lt;XYZ&gt; 并且成功了。

      您可以在 SMSAdapter 中覆盖此方法:

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

      然后调用返回ArrayList&lt;XYZ&gt;get(position)方法。

      【讨论】:

        【解决方案3】:

        您应该使用 ListView 来显示您的消息。

        将从数据库检索到的数据存储在字符串数组中,例如 s1。 那么

        private ArrayList&lt;String&gt; arr_sort = new ArrayList&lt;String&gt;(); 并使用 add() 方法将整个 s1 复制到 arr_sort 中。

        设置适配器时

        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);
                        }
                    });
        

        希望这会有所帮助..

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-06-24
          • 2019-05-23
          • 1970-01-01
          相关资源
          最近更新 更多